(地理)位置的通用数据结构/格式是啥,您如何比较它们?
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
【讨论】:
以上是关于(地理)位置的通用数据结构/格式是啥,您如何比较它们?的主要内容,如果未能解决你的问题,请参考以下文章
ArcGIS中文件地理数据库和个人地理数据库的区别是啥呢??