如何从用户输入的 ArcGIS 投影数据中找出分辨率数组

How to figure out resolution array from user inputted ArcGIS projection data

我有一个基于 Leaflet 的地图解决方案,它使用用户提供的 ArcGIS 地图配置(我不知道它会是什么,他们将使用他们自己的 ArcGIS 服务对其进行自定义)。问题是投影几乎可以是任何东西,我需要使用 Proj4Leaflet 相应地配置地图的 CRS。我 运行 遇到的问题是我不确定如何计算 scale/resolution 数组。用户正在输入这些值:投影键、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]]
});

除了分辨率数组之外,我拥有我需要的一切,我不确定如何根据给定的数据进行设置,并且很难找到让我指向正确方向的答案。

所以最重要的是,我发现计算分辨率的唯一方法是它是否是墨卡托投影并且我们知道它的经度范围和图块大小。否则,将需要在 ArcGIS Server 切片服务器 REST 端点中查找分辨率。因此对于我的项目,我将需要用户自己提供数组并且不能为他们计算它。

在墨卡托投影的情况下,我想出了一个可以解决问题的函数:

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;
}

希望这对碰巧遇到同样情况的其他人有所帮助。