-1

我有一个基于 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]]
});

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

4

1 回答 1

0

所以最重要的是,我发现计算分辨率的唯一方法是它是否是墨卡托投影,并且我们知道它的经度范围和图块大小。否则,需要在 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;
}

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

于 2019-05-02T12:43:56.967 回答