为啥 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 Analytics(分析)报告查询返回 0 结果?