我有一个带有在球形墨卡托投影中的简单WMS图层的地图(由OSM-Mapnik-TileCache服务器堆栈渲染,所有内容都在EPSG:900913 / EPSG:3857中)。

首先:我不明白为什么,如果Leaflet使用单位为米的CRS EPSG:3857,我仍然必须提供WGS84格式(使用度)的坐标,例如maxBounds和center。 API不一致吗?

第二:我需要渲染以WGS84坐标表示的GeoJSON功能(EPSG:4326),但是形状明显失真(请参见下面的图片)。我应该将形状从EPSG:4326转换为EPSG:3857吗?怎么样?如果这样做,我将具有以米表示的坐标,而Leaflet仍然期望度数。我该如何解决?

我在OpenLayers中使用简单的wms层和GeoJSON覆盖进行了仔细检查,它工作正常,因此证明了失真不在数据中。

有什么线索吗?

这是测试GeoJSON,希望有人能理解问题的原因:

{
    "type": "Polygon",
    "coordinates": [
        [
            [14.740017498458682, 40.673078870109705],
            [14.740132563378529, 40.673283531348574],
            [14.741625561383819, 40.67246759585111],
            [14.741671820229074, 40.672308542443076],
            [14.74151049646397, 40.672262934612235],
            [14.740017498458682, 40.673078870109705]
        ]
    ]
}


Example image on Leaflet

Example image on OpenLayers

最佳答案

首先:我不明白为什么,如果Leaflet使用单位为米的CRS EPSG:3857,我仍然必须提供WGS84格式(使用度)的坐标,例如maxBounds和center。 API不一致吗?


数据投影与显示投影不同。在WGS84中,Leaflet的输入为经/纬度,在EPSG:3857中,默认输出为墨卡托。 EPSG:3857很少用于数据编码。


  但形状明显变形(请参见下图)。


这就是投影的含义:这是失真的,因为投影是失真的。


  我应该将形状从EPSG:4326转换为EPSG:3857吗?


Leaflet已经在内部进行此操作,您无需手动进行。


  我在OpenLayers中使用简单的wms层和GeoJSON覆盖进行了仔细检查,它工作正常,因此证明了失真不在数据中。


您的OpenLayers地图具有EPSG:4326作为其显示投影,而您的Leaflet地图具有EPSG:3857:这就是为什么形状不同的原因。

10-07 21:21