小册子在缩放级别计算每像素的米数

Mat*_*ley 9 javascript geo leaflet

我正在尝试确定一种方法来计算在给定缩放级别1个像素表示的米数和Leaflet中的地理中心点.任何人都可以指导我参与数学计算,或者是否有办法在传单中开箱即用?我在那里找不到太多东西.

iH8*_*iH8 17

您可以使用containerPointToLatLng转换函数L.Map来获取给定像素坐标的latLngcoordinates.如果您选取第一个像素中的一个像素,并使用下一个像素之一,则可以使用distanceTo实用程序方法L.LatLng计算它们之间的距离(以米为单位).请参阅以下代码(假设map是L.Map的实例):

var centerLatLng = map.getCenter(); // get map center
var pointC = map.latLngToContainerPoint(centerLatLng); // convert to containerpoint (pixels)
var pointX = [pointC.x + 1, pointC.y]; // add one pixel to x
var pointY = [pointC.x, pointC.y + 1]; // add one pixel to y

// convert containerpoints to latlng's
var latLngC = map.containerPointToLatLng(pointC);
var latLngX = map.containerPointToLatLng(pointX);
var latLngY = map.containerPointToLatLng(pointY);

var distanceX = latLngC.distanceTo(latLngX); // calculate distance between c and x (latitude)
var distanceY = latLngC.distanceTo(latLngY); // calculate distance between c and y (longitude)
Run Code Online (Sandbox Code Playgroud)

这应该有效,感谢JarekPiórkowski在编辑前指出我的错误.

  • "我不确定你为什么提到中心点,因为无论你采用它们的结果都是一样的." 不,他们不会.纬度和经度的长度随纬度而变化,在大尺度上它可以产生差异.您可以在http://www.csgnetwork.com/degreelenllavcalc.html上测试它 (3认同)
  • 这在缩小时对我有用,但在放大时失败 - `distanceX` 为零。选择一个 100 像素远的像素,然后将结果除以 100 似乎效果更好。我不知道这是否是一种有效的方法。 (2认同)

小智 8

您可以使用它来计算每像素的米数:

metresPerPixel = 40075016.686 * Math.abs(Math.cos(map.getCenter().lat * Math.PI/180)) / Math.pow(2, map.getZoom()+8);
Run Code Online (Sandbox Code Playgroud)

  • 我认为上面的意思是`... Math.cos(map.getCenter().lat Math.PI/180))...`而不是`... Math.cos(map.getCenter() .lat*180/Math.PI))...因为我们正在从度数转换为弧度. (5认同)
  • 只是为了确认:上面的答案似乎是正确的,我已经并行实现了 iH8 提供的解决方案和 sy​​nkyo 提供的解决方案,它们返回相同的结果到小数点后 6 位。资料来源:http://wiki.openstreetmap.org/wiki/Zoom_levels (2认同)
  • Leaflet 开发者(Per Liedman)告诉我,这种方法仅适用于 EPSG:3857。 (2认同)