我正在编写一个用 python 编写的映射应用程序,我需要获取 N 个点的纬度/经度质心。假设我有两个位置
a.lat = 101
a.lon = 230
b.lat = 146
b.lon = 200
使用欧几里得公式很容易获得两点的中心。我希望能够做到两点以上。
从根本上说,我想做一些类似http://a.placebetween.us/的事情,一个人可以输入多个地址并找到一个对每个人都等距的地点。
我正在编写一个用 python 编写的映射应用程序,我需要获取 N 个点的纬度/经度质心。假设我有两个位置
a.lat = 101
a.lon = 230
b.lat = 146
b.lon = 200
使用欧几里得公式很容易获得两点的中心。我希望能够做到两点以上。
从根本上说,我想做一些类似http://a.placebetween.us/的事情,一个人可以输入多个地址并找到一个对每个人都等距的地点。
看看下面链接的 pdf 文档。它解释了如何应用Bill the Lizard提到的平面图形算法,但在球体的表面上。
海报缩略图和一些细节 http://img51.imageshack.us/img51/4093/centroidspostersummary.jpg
来源: http: //www.jennessent.com/arcgis/shapes_poster.htm
还有一个25 MB 全尺寸 PDF可用下载。感谢 mixdev
找到原始来源的链接,当然还有 Jenness Enterprises 提供的信息。注意:我与本材料的作者没有任何关系。
添加到安德鲁罗林斯的答案。
您还需要确保如果您在 0/360 经线的任一侧有点,您正在“正确的方向”测量
Is the center of (0,359) and (0, 1) at (0,0) or (0,180)?
如果您正在平均角度并且必须处理它们穿过 0/360,那么将每个值的 sin 和 cos 相加然后 Average = atan2(sum of sines,sum of cosine) 会更安全
(注意参数顺序在您的 atan2 函数中)
如果这些点形成一个平面图形,则数学非常简单。但是,不能保证一组经纬度就这么简单,因此可能首先需要找到这些点的凸包。
编辑:正如eJames指出的那样,您必须对球体的表面进行校正。我的错是假设(不假思索地)这是被理解的。给他+1。
下面的 PDF 比 Jenness Enterprises 的海报更详细。它还处理两个方向的转换以及球体(例如地球)而不是完美球体的转换。
分别平均纬度和经度。