Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/451.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将地图盒传单中以米为单位的半径转换为像素?_Javascript_Math_Leaflet_Mapbox_Mercator - Fatal编程技术网

Javascript 如何将地图盒传单中以米为单位的半径转换为像素?

Javascript 如何将地图盒传单中以米为单位的半径转换为像素?,javascript,math,leaflet,mapbox,mercator,Javascript,Math,Leaflet,Mapbox,Mercator,我正在开发一个应用程序,我试图在地图上运行一些算法并计算坐标,但这些算法有点不正确,因为我正在运行纬度和经度的计算,最终结果会失真 现在我尝试将所有坐标转换为EPSG3857 Web Mercator坐标,如下所示: var crs = L.CRS.EPSG3857; var zoom = terrainAnalysisMap.getZoom(); markerToPoint = crs.latLngToPoint(marker.getLatLng(), zoom); markerOnRadi

我正在开发一个应用程序,我试图在地图上运行一些算法并计算坐标,但这些算法有点不正确,因为我正在运行纬度和经度的计算,最终结果会失真

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

一米就是一米,无论缩放级别如何。因为long/lat是一个单位,所以您需要将米转换为度。地球周长为40075公里时,得到
0.00000898315度/m
,需要将其与对象大小(1米)相乘,以获得必须添加到坐标中的度数,以获得与要绘制的圆半径相交的点

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

[编辑]您的问题与

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

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

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


要记住的一个问题是:如果你使用类似的东西,当你接近极点时,坐标就会消失。要解决这个问题,您需要使用椭圆(比高宽)而不是圆。

我曾经使用此阵列进行像素/现实世界米转换

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
}
注意,在zoomlevel 15以上,我简化了一些事情,因为符号变得太小,不再可见

我用这个作为基本参考


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

如果您恰好拥有将半径转换为像素的位置的纬度,您可以使用中介绍的“每像素米数”功能。下面是我的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);
};

实际上,我正在寻找一种将半径转换为像素的方法,因为我陷入了这个问题:我为圆设置了半径米。试着只在屏幕坐标中解决这个问题。请参阅我的编辑。如何绕过您描述的椭圆问题?您可以忽略它(有时会得到有点超出圆的坐标),或者您需要将圆正确地投影到地图上。为此,你需要以米为单位计算半径,然后计算圆上的两个点(x+r,y和x,y+r),将它们投影到屏幕上,然后画一个穿过这两个点的椭圆。所以在10倍放大时,基本上1个像素=10米?这是正确的解释吗?1像素=1/10米。等等注意反转。这对我来说不起作用,我怀疑这太离谱了,因为没有纬度规范。我们可能在世界上非常不同的地方。使用返回512x512像素分幅的Mapbox时,这会是一种不同的计算方法吗?@如果是,则会是
zoomlevel+9