我对这两个库为何提供不同的结果感到困惑。
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 ...
如果正确使用,两个函数实际上都返回相同的值!
显然,turfjs –因为它基于computeDistanceBetween
–使用GeoJSON格式而不是LngLat
。在LatLng
定义中切换它们可以解决问题并修复我拥有的所有相关内容。
供参考:turf.point
地理空间(制图)软件中令人沮丧的不一致之处是坐标顺序。坐标通常表示为数组,例如https://macwright.org/lonlat/,而不是对象,例如
[-87.73, 41.83]
。这留给开发人员确定{ lng: -87.73, lat: 41.83 }
是经度还是纬度。一种选择是在芝加哥放置一个点,另一种位置在南极洲的深处。关于地理空间格式的经度,纬度顺序已经达成了一些共识,但是对于图书馆和软件仍然很混乱。开发人员应了解此问题并阅读必要的文档,并在必要时翻转坐标以在不同系统之间转换。