如何在mapbox传单中将半径以米为单位转换为像素?

Roh*_*han 9 javascript math mercator leaflet mapbox

我正在开发一个应用程序,我试图在地图上运行一些算法并计算坐标,但它们略有偏差,因为我正在对纬度和经度进行计算并且最终结果被扭曲。

现在我正在尝试将所有坐标转换为 EPSG3857 Web 墨卡托坐标,如下所示:

var crs = L.CRS.EPSG3857;
var zoom = terrainAnalysisMap.getZoom();

markerToPoint = crs.latLngToPoint(marker.getLatLng(), zoom);
markerOnRadiusToPoint = crs.latLngToPoint(markerOnRadius.getLatLng(), zoom);
Run Code Online (Sandbox Code Playgroud)

现在我还有一个半径,我必须将其从米转换为像素,但我不知道如何转换。1米的像素是多少?我的意思是它也取决于缩放级别,对吗?那么如何将半径转换为地图框和传单中的像素呢?

小智 13

如果您碰巧拥有要将半径转换为像素的地点的纬度,则可以使用http://wiki.openstreetmap.org/wiki/Zoom_levels 中描述的“每像素米数”功能。这是我的 javascript 实现:

var metersPerPixel = function(latitude, zoomLevel) {
  var earthCircumference = 40075017;
  var latitudeRadians = latitude * (Math.PI/180);
  return earthCircumference * Math.cos(latitudeRadians) / Math.pow(2, zoomLevel + 8);
};

var pixelValue = function(latitude, meters, zoomLevel) {
  return meters / metersPerPixel(latitude, zoomLevel);
};
Run Code Online (Sandbox Code Playgroud)

  • @theartofbeing 是的,它将是“zoomlevel + 9” (3认同)
  • 对于使用返回 512x512 像素图块的 Mapbox 来说,这会是不同的计算吗? (2认同)

Aar*_*lla 1

无论您的缩放级别是多少,一米就是一米。您需要的是将米转换为度,因为长/纬度是极坐标系。地球的周长为 40,075 km,您需要将0.00000898315 deg/m其乘以物体的大小 (1 m),以获得必须添加到坐标中的度数,以获得与圆的半径相交的点你想画的。

但通常,更容易围绕中心坐标绘制一个半径为 10 px 的圆(在将其从世界变换到屏幕之后),确保无论缩放级别如何,该圆始终具有相同的大小。这样,人们在查看和/或单击它时就不会遇到问题。

[编辑]您的问题与在圆的圆周上放置传单标记的参数方程不精确有关?

我的建议是忘记拖/放问题的世界坐标。显然,你已经有了一个圆(这意味着你必须知道中心点和以像素为单位的半径 - 否则,你无法绘制它)。

您需要的是仅在屏幕坐标中实现标记的拖动。实施起来应该非常简单。

当用户释放鼠标时,您所要做的就是获取屏幕坐标并将其转换为长/纬度一次。

要记住的一个问题:如果您使用墨卡托投影之类的东西,当您靠近两极时,坐标将会消失。为了解决这个问题,您需要使用椭圆形(宽大于高)而不是圆形。