为啥 turfjs 距离返回的结果与 Google Map 几何库 computeDistanceBetween 不同?

Posted

技术标签:

【中文标题】为啥 turfjs 距离返回的结果与 Google Map 几何库 computeDistanceBetween 不同?【英文标题】:Why turfjs distance returns results different from Google Map geometry libs computeDistanceBetween?为什么 turfjs 距离返回的结果与 Google Map 几何库 computeDistanceBetween 不同? 【发布时间】:2020-03-11 15:14:10 【问题描述】:

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

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

代码沙盒:https://codesandbox.io/s/boring-hawking-b7uwh

好的,一件事可能是 turfjs 使用的地球半径 (6371008.8) 与 Google (6378137) 不同。但即使为computeDistanceBetween 提供草皮半径,结果仍然相差约 150 米。

但是,假设 computeDistanceBetween 尊重半径参数,我假设 Google 也依赖 Haversine,就像 turf 一样...

【问题讨论】:

【参考方案1】:

如果使用得当,这两个函数实际上返回相同的值!

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

供参考:https://macwright.org/lonlat/

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

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

【讨论】:

我之前只使用过 Google Maps API 和 Leaflet,他们都喜欢 LatLng,我认为这是标准。哦,男孩,哦,男孩……

以上是关于为啥 turfjs 距离返回的结果与 Google Map 几何库 computeDistanceBetween 不同?的主要内容,如果未能解决你的问题,请参考以下文章

为啥google apis显示不同的结果?

为啥推迟开始日期会导致 Google Analytics(分析)报告查询返回 0 结果?

为啥 Youtube/Google API 不返回超过 5 个回复?

turfjs 能否提供地理坐标和应用程序坐标之间的坐标转换

为啥基于地理搜索/位置的搜索返回零结果?

Google place 自动完成 api 按位置对结果进行排序