(地理)位置的通用数据结构/格式是啥,您如何比较它们?

Posted

技术标签:

【中文标题】(地理)位置的通用数据结构/格式是啥,您如何比较它们?【英文标题】:What is the generic data structure/format for a (geo) location and how do you compare them?(地理)位置的通用数据结构/格式是什么,您如何比较它们? 【发布时间】:2010-07-08 09:37:48 【问题描述】:

通用(或独立于设备)物理位置的结构是什么?我的猜测是它可能是一个有两个长字段的结构,或者类似的东西。

另外,给定一个目的地位置和两个候选位置,是否有一种简单的算法来确定哪个候选位置最接近目的地?我并不是真的在寻找处理所有这些的库或服务,尽管这可能是一个选项(在 Java 中),而是我想要一些非常简单的低级概念,我可以自己实际操作。

谢谢!

编辑 鉴于 f1sh 指出的计算的复杂性 - 是否有一个不错的小型 Java 库来处理半正弦计算?

【问题讨论】:

【参考方案1】:

正如您和 Andreas_D 已经提到的(2 个双字段),在一个类中存储纬度和经度对任何人来说都不是问题。

棘手的部分是计算这个星球表面上 2 个点之间的距离并不像 2 个 2D 点之间的常见距离公式那么简单。 必须考虑以下事实:

虽然纬度范围从 -90°(南极)到 +90°,但经度是周期性的。这意味着点 (0°, 179°) 到点 (0°, -180°) 的距离只有 1°。 地球是一个球体。这导致从纬度/经度转换为公制(我希望您正在使用...)并不是一件容易的事。赤道 1° 经度(位于 0° 纬度)约为 111 公里,而在北极,经度 1° 为 0(公里/英寸/英尺/任意值)。 更多数学知识。

【讨论】:

【参考方案2】:

GPS 设备通常提供以下位置数据:

    纬度 经度 海拔高度 水平精度 垂直精度

(更不用说速度、目的地、卫星等)

现在您问题的第二部分:您可以使用半正弦公式计算所有候选人与您所在位置之间的距离,然后按此距离对它们进行排序。不确定一些更通用/科学的方法。

编辑: 看看haversine 公式here。代码示例也在那里。我认为您不需要为此提供一些库。

【讨论】:

【参考方案3】:

是的,像这样的类

public Geo 
  private double lat;
  private double lon;

足以存储地理位置。您可能需要添加 setter 方法以确保 lat、lon 始终在有效范围内,否则 Geo 对象可能具有无效状态。

【讨论】:

@MalcomTucker - f1sh 已经在他的答案中包含了范围。【参考方案4】:

这显然是最准确的公式,haversine 在短距离上是不准确的:

//L = latitude, G = longtitude
double delta = G1 - G2;  
double p1 = cos(L2) * sin(delta);
double p2 = cos(L1) * sin(L2) - sin(L1) * cos(L2) * cos(delta);  
double p3 = sin(L1) * sin(L2) + cos(L1) * cos(L2) * cos(delta);
distance = 60 * Math.atan2(Math.sqrt(p1*p1 + p2*p2), p3);

Reference

【讨论】:

以上是关于(地理)位置的通用数据结构/格式是啥,您如何比较它们?的主要内容,如果未能解决你的问题,请参考以下文章

如何将地理位置添加到 OSQA?

ArcGIS中文件地理数据库和个人地理数据库的区别是啥呢??

GIS,GPS,RS,ES,MS都是啥意思

如何创建通用 cosmos db terraform 模块以添加多个地理位置

组织地理参考数据的最佳方式是啥?

如何测试地理位置标识符功能?