Как определить массив разрешений из введенных пользователем данных проекции ArcGIS - PullRequest
0 голосов
/ 24 апреля 2019

У меня есть картографическое решение на основе Leaflet, которое использует конфигурацию карты ArcGIS, предоставленную пользователем (я понятия не имею, что это будет, они будут настраивать его с помощью своих собственных сервисов ArcGIS).Проблема в том, что проекция может быть почти любой, и мне нужно будет использовать Proj4Leaflet для соответствующей настройки CRS карты.Проблема, с которой я сталкиваюсь, заключается в том, что я не уверен, как рассчитать массив масштаба / разрешения.Пользователь вводит следующие значения: ключ проекции, строка Proj4, начало координат, границы, уровни масштабирования.

Так, например (да, я знаю, EPSG: 3857 стандартно, и я мог бы просто использовать L.CRS.EPSG3857, ноэто служит хорошим примером того, как настроить ту же самую вещь, используя Proj4Leaflet):

Projection key = EPSG:3857
Proj4 string = +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext  +no_defs
Origin = [0,0]
Bounds = [[-20026376.39, -20048966.10], [20026376.39, 20048966.10]]
Zoom levels = 18

С этим я думаю, что у меня достаточно, чтобы настроить L.Proj.CRS для него:

var crs = new L.Proj.CRS("EPSG:3857", "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext  +no_defs",
{
    resolutions : [?????],
    origin : [0,0],
    bounds : [[-20026376.39, -20048966.10], [20026376.39, 20048966.10]]
});

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

1 Ответ

0 голосов
/ 02 мая 2019

Итак, суть в том, что единственный способ, который я нашел для вычисления разрешений, - это если это проекция Меркатора, и мы знаем ее долготу и размер плитки. В противном случае разрешения нужно будет искать в конечной точке REST сервера плиток ArcGIS Server. Таким образом, для моего проекта мне потребуется, чтобы пользователь сам предоставил массив и не мог рассчитать его для них.

В случае проекции Меркатора, я придумал эту функцию, которая делает трюк:

function parseResolutionsFromZoomLevels(zoomLevels, tileSize, mapWGS84Extent)
{
    var metersPerExtent = 40075008/360;     
    var mapWGS84Meters = mapWGS84Extent*metersPerExtent;
    var resolutionArray = [];

    for (var i=0; i<zoomLevels; i++)
    {
        var tilesAtZoom = Math.pow(2,i);
        var pixelsAtZoom = tilesAtZoom*tileSize;

        resolutionArray.push(mapWGS84Meters/pixelsAtZoom);
    }

    return resolutionArray;
}

Надеюсь, что это поможет кому-то еще, кто сталкивается с такой же ситуацией.

...