如何仅在Leaflet的边框内加载WMS切片?

时间:2018-06-27 21:34:21

标签: leaflet mapbox tiles wms

我有一个应用程序,在其中使用mapbox.js加载某个位置的底图图块。然后,用户可以从WMS服务器加载大小为256X256的WMS切片,并将其加载到底图的顶部。

我正在使用mapbox和传单显示地图,如下所示:

 window.map = L.map('map', { 'minZoom': minZoomLevel(), 'maxZoom': maxZoomLevel(), reuseTiles: true, unloadInvisibleTiles: true }).setView(["35.7804", "-78.6391"], 17)

然后我正在使用Leaflet,将请求发送到我的服务器,然后从那里将请求发送到WMS服务器,以使用以下方法加载图块:

wms = L.tileLayer.wms('/viewers/wms', {
    minZoom: 12,
    maxZoom: 25,
    layers: 'some layer name',
    format: 'image/png',

    updateWhenIdle: false,
    transparent: true,

    reuseTiles: true,
    showTheRasterReturned: true,

    COVERAGE_CQL_FILTER: 'featureId=\'' + featureId + '\''
});

当请求到达我的服务器时,{@ {1}}属性由具有不同坐标(我认为它占据了完整视口)的传单自动添加,即

BBOX

动态添加传单的BBOX属性,如下所示

 Started GET
 "/viewers/wms?SERVICE=WMS&REQUEST=GetMap&VERSION=1.1.1&LAYERS=some
 layer
 name&STYLES=&FORMAT=image%2Fpng&TRANSPARENT=true&HEIGHT=256&WIDTH=256&REUSETILES=true&SHOWTHERASTERRETURNED=true&COVERAGE_CQL_FILTER=featureId%3D%279d3a23cba90680cecda337a926f563a6%27&SRS=EPSG%3A3857&**BBOX=-8755402.967897227,4285977.050006404,-8755097.219784087,4286282.798119542**" for 127.0.0.1 at 2018-06-27 16:51:01 -0400

不过,我只想获取这些坐标的图块:

 BBOX=-8755402.967897227,4285977.050006404,-8755097.219784087,4286282.798119542"

southWest ={lat: 35.77712238348847, lng: -78.64827990531921} northEast {lat: 35.783693840245284, lng: -78.62991213798523} 内设置BBOX选项也无济于事,因为L.tileLayer.wms坐标是通过传单添加的。

1 个答案:

答案 0 :(得分:1)

传单工作正常。

您只需要记住,尽管Leaflet对显示投影和L.LatLng使用不同的坐标参考系统(CRS)。您在EPSG:4326(AKA equirectangular)中指定L.LatLng(以及范围等),然后Leaflet会将所有内容转换为EPSG:3857(AKA Spherical Mercator)。

请注意,WMS请求的URL如何包含一个SRS=EPSG%3A3857参数(这意味着SRS=EPSG:3857一次URI-decoded)。这意味着Leaflet在EPSG:3857中提供坐标,并期望在EPSG:3857中投影图像。

如果看不到图像,则可能意味着您的WMS服务器不支持EPSG:3857。另外,我建议您通读Leaflet WMS/TMS tutorial,该书着重介绍了如何在WMS栅格源中使用不同的CRS。

  

尽管,我只想获取这些坐标的图块

然后使用bounds option of L.TileLayer.WMS。 (如果您在文档中没有看到此选项,请记住L.TileLayer.WMS继承了L.TileLayer的选项,而L.GridLayer继承了wms = L.tileLayer.wms('/viewers/wms', { minZoom: 12, maxZoom: 25, layers: 'some layer name', format: 'image/png', updateWhenIdle: false, transparent: true, reuseTiles: true, showTheRasterReturned: true, COVERAGE_CQL_FILTER: 'featureId=\'' + featureId + '\'' bounds: L.latLngBounds([[35.77, -78.65],[35.78, -78.63]]) }); 的选项)

像这样:

SHOW PROCESSLIST;

| Id        | User | Host       | db     | Command | Time    | State        | Info                                                 |
| 537478557 | root | localhost  | my_DB  | Query   |       0 | Sending data | select * from my_DB.T_final where name in ('AB1234') |