我正在尝试确定 Leaflet 中给定缩放级别和地理中心点时,1个像素所代表的米数的计算方法。是否有人可以指导我相关的数学知识或者是否有一种可以直接在 Leaflet 中实现的方法?目前我并没有找到太多相关信息。
我正在尝试确定 Leaflet 中给定缩放级别和地理中心点时,1个像素所代表的米数的计算方法。是否有人可以指导我相关的数学知识或者是否有一种可以直接在 Leaflet 中实现的方法?目前我并没有找到太多相关信息。
您可以使用L.Map
的containerPointToLatLng转换函数获取给定像素坐标的经纬度坐标。如果您选择第一个像素和下一个像素中的一个,您可以使用L.LatLng
的distanceTo实用方法来计算它们之间的距离(以米为单位)。请参见以下代码(假设地图是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)
应该可以工作了,感谢Jarek Piórkowski在编辑之前指出我的错误。
metresPerPixel = 40075016.686 * Math.abs(Math.cos(map.getCenter().lat * Math.PI/180)) / Math.pow(2, map.getZoom()+8);
...Math.cos(map.getCenter().lat Math.PI/180))...
而不是... Math.cos(map.getCenter().lat * 180/Math.PI))...
因为我们正在从角度转换为弧度。 - mwakerman如果我错了,请纠正我,以我个人看来,每像素米数 = 地图高度(米)/ 地图高度(像素)
function metresPerPixel() {
const southEastPoint = map.getBounds().getSouthEast();
const northEastPoint = map.getBounds().getNorthEast();
const mapHeightInMetres = southEastPoint.distanceTo(northEastPoint);
const mapHeightInPixels = map.getSize().y;
return mapHeightInMetres / mapHeightInPixels;
}
一个像素所代表的距离(S)由以下公式给出:
S=C*cos(y)/2^(z+8)
其中...C是地球的赤道周长
z是缩放级别
y是您感兴趣的比例尺所在位置的纬度。
distanceX
为零。选择一个距离100像素的像素,然后将结果除以100似乎更好。我不知道这是否是一种有效的方法。 - Tom Chadwin