Как загружать тайлы WMS только внутри ограничительной рамки в Leaflet? - PullRequest
0 голосов
/ 28 июня 2018

У меня есть приложение, в котором я использую mapbox.js для загрузки листов базовой карты для местоположения. Затем пользователь может загрузить плитки WMS с сервера WMS размером 256X256, который загружается поверх базовой карты.

Я использую 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 + '\''
});

Когда запрос достигает моего сервера, атрибут 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 добавляется в виде листовки на лету, которая выглядит следующим образом

 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 также не помогает, так как BBOX координаты добавляются буклетом.

1 Ответ

0 голосов
/ 28 июня 2018

Листовка работает как положено.

Вы просто должны помнить, что в то время как Leaflet использует разные системы координат координат (CRS) для проекции дисплея и для L.LatLng s. Вы указываете L.LatLng s (и границы и т. Д.) В EPSG: 4326 (AKA equirectangular ), и Leaflet переведет все в EPSG: 3857 (AKA Spherical Mercator ).

Обратите внимание, что URL для запроса WMS включает параметр SRS=EPSG%3A3857 (что означает SRS=EPSG:3857 один раз URI-декодированный ). Это означает, что Leaflet предоставляет координаты в EPSG: 3857 и ожидает изображение, спроецированное в EPSG: 3857.

Если вы не видите изображений, это, вероятно, означает, что ваш сервер WMS не поддерживает EPSG: 3857. Кроме того, я рекомендую вам прочитать учебное пособие WMS / TMS Leaflet , в котором рассказывается, как использовать различные CRS с растровыми источниками WMS.

хотя, я хочу получать плитки только для этих координат

Затем используйте параметр bounds, равный 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]])
});
...