我正在开发一个应用程序,我试图在地图上运行一些算法并计算坐标,但它们略有偏差,因为我在纬度和经度上运行计算,最终结果变得扭曲。
现在我正在尝试将所有坐标转换为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中将半径转换为像素?
答案 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。
这对我来说非常有用,但我不确定在处理高分辨率显示器时会发生什么。猜猜在这些情况下它可能会失败。