Может ли map.getBounds выполняться для другой системы координат? - PullRequest
0 голосов
/ 19 июня 2020

Я выполняю следующий код на своей веб-карте листовки

map.getBounds().getWest() + "&y1=" + 
map.getBounds().getSouth() + "&x2=" + 
map.getBounds().getEast() + "&y2=" + 
map.getBounds().getNorth()

В результате я получаю четыре координаты в системе координат WGS84 (стандартная).

Есть ли способ изменить это так, чтобы вместо этого выводилось 28992 координаты?

1 Ответ

1 голос
/ 19 июня 2020

Я предполагаю, что под «28992 координатами» вы имеете в виду EPSG: 28992 Система координат .

Канонический способ использования «нестандартных» CRS в Leaflet - использовать proj4leaflet . Этот ответ предполагает, что вы уже это делаете .

Таким образом, метод getBounds() для L.Map всегда возвращает экземпляр L.LatLngBounds, который ссылается на непроектированные координаты WGS84. Тем не менее, мы можем использовать CRS карты в a L.LatLng в L.Point с проецируемыми координатами в CRS отображения карты; например,

var map = L.map('containerId`, { crs: crsForEpsg28992 });

var foo = map.options.crs.project(L.latLng([60.3,21.1]));
var qux = map.options.crs.project(map.getCenter());

Из-за того, как работают проекции карты (они вращают и изгибают координатные пространства), а также из-за того, как реализован proj4 js, невозможно спроецировать ограничивающие box в ограничивающую рамку. (В большинстве случаев проекция ограничивающего прямоугольника будет изогнутым многоугольником !). Это изображение из статьи Грегора Айша иллюстрирует проблему:

enter image description here

Однако мы можем сделать приблизительное значение: спроецировать четыре угла ограничивающей рамки, например:

var mapBounds = map.getBounds();
var crs = map.options.crs;
var nw = crs.project(mapBounds.getNorthWest());   
var ne = crs.project(mapBounds.getNorthEast());
var sw = crs.project(mapBounds.getSouthWest());
var se = crs.project(mapBounds.getSouthEast());

Мы даже можем создать L.Bounds (но не a L.LatLngBounds!) из этих проецируемых координат; это будет bbox в указанном CRS, который содержит все углы, например:

var bbox = L.bounds([nw, ne, sw, se]);

Это не будет идеальным, но этого приближения должно быть достаточно для большинства случаев использования.

См. также этот рабочий пример (основан на одном из примеров proj4leaflet), который должен дополнительно проиллюстрировать проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...