Leaflet JS:使用米而不是纬度,经度的自定义二维投影
Leaflet JS: Custom 2D projection that uses meters instead of lat,long
我正在制作自定义游戏地图。这张地图基本上是一个光栅图像,上面覆盖了一些路径和标记。我想用Leaflet显示地图。
我正在纠结的是,Leaflet 使用纬度和经度来计算位置,而它使用米来计算距离(路径长度、圆半径等)。
在处理像我们地球这样的球形世界时,这是非常可以理解的,但它会使自定义地图变得复杂,因为它很平坦。
我希望能够以与距离相同的单位指定位置。
现在,默认情况下,Leaflet 使用球形墨卡托投影。根据Docs,可以定义自己的投影和坐标参考系统,但到目前为止我还无法做到这一点。
这怎么可能?或者有更简单的方法吗?
您应该看一下 Leaflet 中包含的简单坐标参考系统 (L.CRS.Simple
):
A simple CRS that maps longitude and latitude into x and y directly. May be used for maps of flat surfaces (e.g. game maps).
您可以像这样在初始化时定义 L.Map
的 CRS:
new L.Map('myDiv', {
crs: L.CRS.Simple
});
一些进一步的阐述:正如@ghybs 在下面的评论和对你的问题的评论中指出的,默认的 sperical 墨卡托投影 (L.CRS.EPSG3857
) 已经以米为单位工作。当你计算两个坐标之间的距离时,Leafletreturns米,例子:
var startCoordinate = new L.LatLng(0, -1);
var endCoordinate = new L.LatLng(0, 1);
var distance = startCoordinate.distanceTo(endCoordinate);
console.log(distance);
以上将在您的控制台上打印 222638.98158654713
,即这两个坐标之间的距离(以米为单位)。问题是,当使用球面投影时,两个坐标之间的距离会随着你离赤道越远而变得越小,这在创建平面游戏世界时会出现问题。这就是为什么你应该使用 L.CRS.Simple,你不会有问题。
我正在制作自定义游戏地图。这张地图基本上是一个光栅图像,上面覆盖了一些路径和标记。我想用Leaflet显示地图。
我正在纠结的是,Leaflet 使用纬度和经度来计算位置,而它使用米来计算距离(路径长度、圆半径等)。
在处理像我们地球这样的球形世界时,这是非常可以理解的,但它会使自定义地图变得复杂,因为它很平坦。
我希望能够以与距离相同的单位指定位置。
现在,默认情况下,Leaflet 使用球形墨卡托投影。根据Docs,可以定义自己的投影和坐标参考系统,但到目前为止我还无法做到这一点。
这怎么可能?或者有更简单的方法吗?
您应该看一下 Leaflet 中包含的简单坐标参考系统 (L.CRS.Simple
):
A simple CRS that maps longitude and latitude into x and y directly. May be used for maps of flat surfaces (e.g. game maps).
您可以像这样在初始化时定义 L.Map
的 CRS:
new L.Map('myDiv', {
crs: L.CRS.Simple
});
一些进一步的阐述:正如@ghybs 在下面的评论和对你的问题的评论中指出的,默认的 sperical 墨卡托投影 (L.CRS.EPSG3857
) 已经以米为单位工作。当你计算两个坐标之间的距离时,Leafletreturns米,例子:
var startCoordinate = new L.LatLng(0, -1);
var endCoordinate = new L.LatLng(0, 1);
var distance = startCoordinate.distanceTo(endCoordinate);
console.log(distance);
以上将在您的控制台上打印 222638.98158654713
,即这两个坐标之间的距离(以米为单位)。问题是,当使用球面投影时,两个坐标之间的距离会随着你离赤道越远而变得越小,这在创建平面游戏世界时会出现问题。这就是为什么你应该使用 L.CRS.Simple,你不会有问题。