确定多个点的质心

Posted

技术标签:

【中文标题】确定多个点的质心【英文标题】:Determine the centroid of multiple points 【发布时间】:2008-12-09 18:06:34 【问题描述】:

我正在编写一个用 python 编写的地图应用程序,我需要获取 N 个点的纬度/经度质心。 假设我有两个位置

a.lat = 101
a.lon = 230

b.lat = 146
b.lon = 200

使用欧几里得公式很容易获得两点的中心。我想 能够做到两点以上。

从根本上说,我想做类似http://a.placebetween.us/ 这样的事情,一个人可以输入多个地址并找到一个对每个人都等距的位置。

【问题讨论】:

【参考方案1】:

查看下面链接的 pdf 文档。它解释了如何应用 the plane figure algorithm that Bill the Lizard 提及,但在球体的表面上。

poster thumbnail and some details http://img51.imageshack.us/img51/4093/centroidspostersummary.jpg 来源:http://www.jennessent.com/arcgis/shapes_poster.htm 还有一个25 MB full-size PDF 可供下载。 感谢 mixdev 找到原始来源的链接,当然还有 Jenness Enterprises 提供的信息。注意:我与本材料的作者没有任何关系。

【讨论】:

这是一个明显的改进。我最近一直在使用 GIS 做很多工作,所以我只是假设这已被理解。在一般论坛中,这是一个可怕的假设。 +1 谢谢。让我们希望这一切都值得咀嚼。 该 PDF 丢失。改为检查[24MB!]jennessent.com/downloads/graphics_shapes_poster_full.pdf 我已经浏览了你们提供的链接。为了计算笛卡尔坐标和三角形的质心,我们需要正确的半径。但是如何计算球体的半径呢? 对不起,@Winbros。我没有示例实现或伪代码。 Wikipedia atricle 和海报都提供了背景数学。翻译成代码应该不会太难。只是很多循环和浮点运算:)【参考方案2】:

添加到 Andrew Rollings 的答案中。

您还需要确保如果您在 0/360 经度线的任一侧有点,您正在“正确的方向”进行测量

Is the center of (0,359) and (0, 1) at (0,0) or (0,180)?

【讨论】:

这是我的应用程序将东半球与西半球完全分开处理的主要原因。例如,没有“美国的范围”,有“US-E”和“US-W”,我根据需要将它们组合起来。【参考方案3】:

如果您正在平均角度并且必须处理它们穿过 0/360,那么将每个值的 sin 和 cos 相加然后平均 = atan2(正弦之和,余弦之和)会更安全 (注意 atan2 函数中的参数顺序)

【讨论】:

【参考方案4】:

如果这些点形成plane figure,则数学非常简单。但是,无法保证一组经纬度就这么简单,因此可能首先需要找到这些点的convex hull。

编辑:正如eJames 指出的那样,您必须对球体的表面进行校正。我的错是假设(不假思索地)这是被理解的。 +1 给他。

【讨论】:

【参考方案5】:

下面的 PDF 比 Jenness Enterprises 的海报更详细。它还可以处理两个方向以及球体(例如地球)而不是完美球体的转换。

Converting between 3-D Cartesian and ellipsoidal latitude, longitude and height coordinates

【讨论】:

【参考方案6】:

分别平均纬度和经度。

【讨论】:

以上是关于确定多个点的质心的主要内容,如果未能解决你的问题,请参考以下文章

matlab:matlab实现求图像中的多个质心

在多个多边形中搜索点的最佳方法

环形环绕地图上一组点之间的“质心”,可最大限度地减少到所有点的平均距离

Problem C: 质心算法

使用OpenCV绘制连接对象质心的线

学习毫末智行数据标注怎么分组