如何获取可能是 LatLng 坐标的 LineString 或 MultiLineString 的要素的准确长度?

问题描述 投票:0回答:1

使用 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%!

leaflet openstreetmap map-projections
1个回答
0
投票

传单方法采用

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]),
) ;
© www.soinside.com 2019 - 2024. All rights reserved.