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

时间:2015-06-08 07:19:05

标签: javascript math leaflet mapbox mercator

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

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

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

markerToPoint = crs.latLngToPoint(marker.getLatLng(), zoom);
markerOnRadiusToPoint = crs.latLngToPoint(markerOnRadius.getLatLng(), zoom);

现在我还有一个半径,我必须将其从米转换为像素,但我无法弄清楚如何。 1米像素多少钱?我的意思是它也取决于缩放级别,对吗?那么如何在mapbox和leaflet中将半径转换为像素?

3 个答案:

答案 0 :(得分:3)

如果碰巧有想要将半径转换为像素的地方的纬度,可以使用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);
};

答案 1 :(得分:1)

无论您的缩放级别如何,仪表都是米。你需要的是将一个仪表转换成度数,因为long / lat是polar coordinate system。如果地球的周长为40,075 km,则需要0.00000898315 deg/m乘以物体的大小(1 m),以获得必须添加到坐标的度数,以获得与之相交的点要绘制的圆的半径。

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

[编辑] 您的问题与Parametric equation to place a leaflet marker on the circumference of a circle is not precise?

有关

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

您需要的是仅在屏幕坐标中实现拖动标记。这应该很容易实现。

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

要记住的一个问题:如果您使用Mercator projection之类的东西,当您靠近两极时坐标将会关闭。要解决此问题,您需要使用椭圆(宽度大于高)而不是圆形。

答案 2 :(得分:0)

我曾经使用这个数组进行像素/真实世界的翻译

pixelMeterSizes: {
    10: 1 / 10,
    11: 1 / 9,
    12: 1 / 8,
    13: 1 / 7,
    14: 1/ 5,
    15: 1 / 4.773,
    16: 1 / 2.387,
    17: 1 / 1.193,
    18: 1 / 0.596
    19: 1 / 0.298
}

请注意,在缩放级别15之上,我简化了一些事情,因为符号太小而且不再可见了。

我将此作为基本参考http://wiki.openstreetmap.org/wiki/Zoom_levels

这对我来说非常有用,但我不确定在处理高分辨率显示器时会发生什么。猜猜在这些情况下它可能会失败。