maptalks / maptalks.js

A light and plugable JavaScript library for integrated 2D/3D maps.
https://maptalks.org
BSD 3-Clause "New" or "Revised" License
4.29k stars 500 forks source link

自己搭建的地图服务提供tileLayer,需要自定义spatialReference,但是修改tileLayer实例的spatialReference不能生效 #759

Closed davidweining2333 closed 6 years ago

davidweining2333 commented 6 years ago

maptalks's version and what browser you use?

0.40.5 chrome 68.0.3440.106 Issue description

自己搭建的地图服务提供tileLayer(只有5个zoomlevel,extent与origin均为自定义),需要自定义spatialReference,但是修改tileLayer实例的spatialReference不能生效,只能在map配置项中指定spatialReference才可以生效,但是此时的问题是我还需要使用OSM的图层做地图,因为改了map的spatialReference,OSM瓦片的请求xyz被一起改掉了,请问该如何解决这个问题,同时加载OSM地图与自定义的tileLayer image image image

Please provide a reproduction URL (on any jsfiddle like site)

http://jsfiddle.net/u9f4kjcw/

davidweining2333 commented 6 years ago

大哥帮忙看看有没有解决方案呢

deyihu commented 6 years ago

@davidweining2333 osm默认18个层级,你自己发布的只有5个层级,两个层级相差太多了,你需要从osm的分辨率中也取5个合适的resolution,取得值要和你发布的瓦片的resolutions相差不能太大,否则会导致加载osm的瓦片太多卡死浏览器。

因为是从osm的取的五个值,而osm默认的为18个层级,自定义的osm的TileLayer是从0开始加载的,所以需要重写 自定义的osmtileLayer的瓦片请求地址,使其和osm的瓦片地址对应

http://jsfiddle.net/u9f4kjcw/50/ 这个是我在你的基础上改的。

如果你发布的瓦片为10个层级,你就从osm的瓦片中取 10 个resolution,以此类推,希望对你有帮助

davidweining2333 commented 6 years ago

@deyihu 非常感谢,这个基本上可以解决我的问题了! 不过还有几个问题再请教一下 1、您选取的OSM的resolutions是从zoom10到14的,但是计算值与我的resolutions并不相同,是4326与3857的换算吗? 2、156543.03392800014/Math.pow(2,i)中156543.03392800014这个基数是从哪里来的,是OSM的最大resolution吗? 3、选取部分resolutions后,tileSystem的ox和oy应该如何计算? 4、是否可以按您的方式只修改我自定义图层tileLayer的spatialReference,不修改全局map的spatialReference达到这个效果呢? 5、之前我是使用openlayers5+进行开发,他提供了这种自定义图层的API,我只需要配置好自定义图层的resolutions,fullExtent以及origin,就会把xyz自动换算成合适的值而不需要自己再进行换算,而且不会影响全局的投影设置,maptalks有这样的功能吗?如果没有会有增加这个feature的打算吗?

deyihu commented 6 years ago

@davidweining2333

resolutions 取值和scale有关

这个是你服务的相关参数,起始比例尺为250000 0 Resolution: 5.9486525145757E-4 Scale: 250000 1 Resolution: 2.97432625728785E-4 Scale: 125000 2 Resolution: 1.5228550437313792E-4 Scale: 64000 3 Resolution: 7.614275218656896E-5 Scale: 32000 4 Resolution: 3.807137609328448E-5 Scale: 16000

这个是EPSG:3857默认的切图参数

0 Resolution: 156543.03392800014 Scale: 5.91657527591555E8 1 Resolution: 78271.51696399994 Scale: 2.95828763795777E8 2 Resolution: 39135.75848200009 Scale: 1.47914381897889E8 3 Resolution: 19567.87924099992 Scale: 7.3957190948944E7 4 Resolution: 9783.93962049996 Scale: 3.6978595474472E7 5 Resolution: 4891.96981024998 Scale: 1.8489297737236E7 6 Resolution: 2445.98490512499 Scale: 9244648.868618 7 Resolution: 1222.992452562495 Scale: 4622324.434309 8 Resolution: 611.4962262813797 Scale: 2311162.217155 9 Resolution: 305.74811314055756 Scale: 1155581.108577 10 Resolution: 152.87405657041106 Scale: 577790.554289 11 Resolution: 76.43702828507324 Scale: 288895.277144 12 Resolution: 38.21851414253662 Scale: 144447.638572 13 Resolution: 19.10925707126831 Scale: 72223.819286 14 Resolution: 9.554628535634155 Scale: 36111.909643 15 Resolution: 4.77731426794937 Scale: 18055.954822 16 Resolution: 2.388657133974685 Scale: 9027.977411 17 Resolution: 1.1943285668550503 Scale: 4513.988705 18 Resolution: 0.5971642835598172 Scale: 2256.994353

根据两个切图参数,可以看出 默认的EPSG:3857中 11层级的scale=288895.277144 与你的切图的250000最接近,所以以11开始是最好的,最合适的值

然后我更新了一下代码,从zoom=11来取值,效果为 http://jsfiddle.net/u9f4kjcw/57/

关于EPSG:3857中的一些常量

156543.03392800014 这个值为默认EPSG:3857最大比例尺对应的resolution, 墨卡托切图详情 http://map.geoq.cn/ArcGIS/rest/services/ChinaOnlineCommunity/MapServer/

里面包含相关切图参数,origin等里面都有的,切图原点(Origin) 有一开始切图是决定的,和选的几个resolutions无关,就是说切图的每个层级都是按照这个原点(Origin) 来切图,包括你的服务五个比例尺都是按照Origin=[-400,400]来的切图;

EPSG:3857 墨卡托米制,和你的EPSG:4326经纬度还是不一样的,EPSG:3857有Google Map首先采用,切图参数就是上面我给的,目前互联网上各个地图平台几乎都是 EPSG:3857,并且切图参数都是采用谷歌默认的那一套参数(osm,mapbox,bing,mapzen,高德,腾讯等)都是这个

这个我是收集的一些常见的EPSG:3857地图源 https://deyihu.github.io/src/maptalks-tileLayercollection/examples/

maptalks

maptalks里,map对象不会自动的读取 TileLayer空间信息赋值给自己,需要你手动的赋值给map对象,如果你有多个底图,需要来回切换的,可以在切换TileLayer之前手动设置map 的spatialReference 2018-08-29_112212

例如我做的底图切换控件,在切换底图是,手动的将TileLayer 的spatialReference 赋值个map对象

davidweining2333 commented 6 years ago

@deyihu 非常感谢科普基础知识,现在我们使用的是ArcGisServer,由于经费问题可能还会使用gdal做切片后使用nginx提供地图服务,有了你的解释我觉得对于之后的适配有很大帮助,谢谢!

fuzhenn commented 6 years ago

既然问题已解决,那我先关闭issue

非常感谢 @deyihu !