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)
无论您的缩放级别是多少,一米就是一米。您需要的是将米转换为度,因为长/纬度是极坐标系。地球的周长为 40,075 km,您需要将0.00000898315 deg/m其乘以物体的大小 (1 m),以获得必须添加到坐标中的度数,以获得与圆的半径相交的点你想画的。
但通常,更容易围绕中心坐标绘制一个半径为 10 px 的圆(在将其从世界变换到屏幕之后),确保无论缩放级别如何,该圆始终具有相同的大小。这样,人们在查看和/或单击它时就不会遇到问题。
[编辑]您的问题与在圆的圆周上放置传单标记的参数方程不精确有关?
我的建议是忘记拖/放问题的世界坐标。显然,你已经有了一个圆(这意味着你必须知道中心点和以像素为单位的半径 - 否则,你无法绘制它)。
您需要的是仅在屏幕坐标中实现标记的拖动。实施起来应该非常简单。
当用户释放鼠标时,您所要做的就是获取屏幕坐标并将其转换为长/纬度一次。
要记住的一个问题:如果您使用墨卡托投影之类的东西,当您靠近两极时,坐标将会消失。为了解决这个问题,您需要使用椭圆形(宽大于高)而不是圆形。