为什么turfjs距离返回的结果与Google Map geometrys libs computeDistanceBetween不同?

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

我对这两个库为何提供不同的结果感到困惑。

const CATA = {
  lat: 57.312004,
  lng: 25.289825
};

const PK = {
  lat: 57.307953,
  lng: 25.295025
};

const tCATA = turf.point([CATA.lat, CATA.lng]);
const tPK = turf.point([PK.lat, PK.lng]);
const tDistance = turf.distance(tCATA, tPK, { units: "meters" });

const gCATA = new google.maps.LatLng(CATA);
const gPK = new google.maps.LatLng(PK);
const gDistance = google.maps.geometry.spherical.computeDistanceBetween(
  gCATA,
  gPK
);

console.log(tDistance, gDistance); // 707.249063108749, 548.7294775022126

CodeSandbox:https://codesandbox.io/s/boring-hawking-b7uwh

[好,一件事情可能是turfjs对地球(6371008.8)使用的半径与Google(6378137)不同。但是,即使提供computeDistanceBetween的草皮半径,其结果在150米左右也仍然不同。

但是,假设computeDistanceBetween遵守radius参数,我认为Google也像草皮一样依赖Haversine ...

google-maps google-maps-api-3 haversine turfjs
1个回答
0
投票

如果正确使用,两个函数实际上都返回相同的值!

显然,turfjs –因为它基于computeDistanceBetween –使用GeoJSON格式而不是LngLat。在LatLng定义中切换它们可以解决问题并修复我拥有的所有相关内容。

供参考:turf.point

地理空间(制图)软件中令人沮丧的不一致之处是坐标顺序。坐标通常表示为数组,例如https://macwright.org/lonlat/,而不是对象,例如[-87.73, 41.83]。这留给开发人员确定{ lng: -87.73, lat: 41.83 }是经度还是纬度。一种选择是在芝加哥放置一个点,另一种位置在南极洲的深处。

关于地理空间格式的经度,纬度顺序已经达成了一些共识,但是对于图书馆和软件仍然很混乱。开发人员应了解此问题并阅读必要的文档,并在必要时翻转坐标以在不同系统之间转换。

© www.soinside.com 2019 - 2024. All rights reserved.