10

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

现在我正在尝试将所有坐标转换为 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米等于多少像素?我的意思是它也取决于缩放级别,对吗?那么如何在地图框和传单中将半径转换为像素?

4

3 回答 3

14

如果您碰巧有将半径转换为像素的地方的纬度,则可以使用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);
};
于 2015-06-11T06:32:39.237 回答
1

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

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

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

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

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

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

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

于 2015-06-08T08:22:01.163 回答
1

我曾经使用这个数组进行像素/真实世界米的转换

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

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

于 2015-06-08T14:44:54.197 回答