使用 leafletjs
map.distance()
函数,我始终得到一个比应有值高约 40% 的值。这是因为我位于北纬56°吗?
使用 Overpass Turbo,我可以导出某个点附近的徒步路线的 OpenStreetMap,保存为 GEOjson 并进行阅读。
('(rel(around:8000,56.56492, -3.58553)['route'='hiking'];);out geom;')
对于某些路线,几何图形是 LineString,对于其他路线,它是 MultiLineString。在
L.GEOjson onEachFeature
函数中,我有:
var length = 0
if ( feature.geometry.type == "MultiLineString" ) {
for ( var i = 0; i < (feature.geometry.coordinates.length); i++ ) {
var thisLineString=feature.geometry.coordinates[i];
for ( var j = 0; j < (thisLineString.length - 1); j++ ) {
length = length + map.distance(thisLineString[j],thisLineString[j+1]) ;
}
} else {
if ( feature.geometry.type == "LineString" ) {
for ( var i = 0; i < (feature.geometry.coordinates.length-1); i++ ) {
length = length + map.distance(feature.geometry.coordinates[i],feature.geometry.coordinates[i+1]) ;
}
}
}
传单 function
map.distance()
返回以米为单位的值。
与其他地图系统或步行/跑步路线所需的时间相比,大多数结果都太大了约 40%!
LatLng
坐标,即顺序为 [latitude, longitude]
。
而 GeoJSON 坐标有顺序
[longitude, latitude]
。
另请参阅 https://macwright.org/lonlat/
因此,在将它们传递给
map.distance()
之前,您必须交换它们的坐标,例如:
function lngLat2latLng(lngLatCoordinates) {
const latLng = [
lngLatCoordinates[1], // latitude
lngLatCoordinates[0], // longitude
];
// Just in case there is also optional altitude
if (lngLatCoordinates.length > 2) {
latLng.push(lngLatCoordinates[2];
}
return latLng;
}
// usage
length += map.distance(
// Swap coordinates from GeoJSON lngLat
// to Leaflet latLng order
lngLat2latLng(thisLineString[j]),
lngLat2latLng(thisLineString[j+1]),
) ;