如何从一组现有点中找到最远的点?


17

我有一组点作为shapefile,我想找到一个新点(坐标),该点与每个现有点的距离最长。那可能吗?如果是,是否有任何示例VB代码?感谢Demetris


您是要为每个已经存在的点要一个新点,还是要在所有点中“最远”的一个点?最远的意思是“地球的另一面”吗?如果是这样,则可以将纬度乘以-1,然后将经度加180(如果结果的值大于180,则减去360)(如果十进制为十进制)。
nmpeterson

我认为有趣的问题是:鉴于现有点分布在全球各地,请在地球上找到距离所有现有点最远的新点。
Kirk Kuykendall

它实际上是等腰三角形末端的点,在该点上的距离仅受您要走多远的限制。如果我已正确阅读问题,那么您想从这两个问题出发最远吗?一样?

1
哦!我的帖子创造了精彩的讨论和资料!NMpeterson:首先,我必须说我的观点是在一个小的平坦区域内;因此无需进行Globe计算。我正在寻找提出的第二个问题;即某个点,该点离所有现有点“最远”。因此,请专注于此。
Demetris

我想知道是否有原始示例中要求的任何示例VB代码可用。鉴于专家的回应,这样的代码也许已经很明显了。但是,作为一个初学者,我希望首先重新创建whuber提供的解决方案。事先我很抱歉将其作为答案而不是评论。

Answers:


12

柯克·库肯达尔(Kirk Kuykendall)建议构造一个球面Voronoi图(蒂森多边形)是一个很好的建议,但可能有一些技术难题需要解决。同时,作为替代,一个人可以应用另一个线程中描述的标准栅格解决方案。使用球面距离而不是欧几里得距离。

这是一个使用五个点的示例,这里给出了(lat,lon):

 82.7051   -145.256
 60.3321     81.2881
-17.076     105.125
-38.792    -122.686
  0.000     180.000

距离图

该球面距离图的水平范围是-180至180度,垂直范围是-90至90度。这些点显示有大的红点。距离随亮度增加。明显的山脊一定是大圆圈的一部分。(-15.3268,-2.04352)附近的小黑点表示最大距离为11,227 km。(距离在ITRF00椭球基准中计算。)

该网格的分辨率为1度。为了获得更精确的解决方案,可以放大到这样一个点(以及具有与全局最大值足够接近的值的任何其他局部最大值),然后在较小但分辨率更高的网格上重复该计算。


比向量还漂亮 不知道为什么我认为栅格需要平坦的地球模型。
Kirk Kuykendall

不错,是的,但是效率低下。很高兴看到基于矢量的球形Voronoi解得到了解决。
ub

@Whuber:如何自动获得黑点的坐标?”
Demetris

@Demetris一种方法是计算网格上的最大值,选择等于该值的所有像元,然后使用该像元中心的坐标。
ub

@Whuber:非常感谢。这是一个好主意。但是,我必须基于要素类(唯一性多边形)裁剪输出栅格。我可以这样做吗?
Demetris

8

在此处输入图片说明

我从没有尝试过,但似乎可行:

创建3D voronoi图球。由此产生的多边形将大致以原始现有(种子)点为中心。

循环遍历每个结果顶点,以找到离其最近的现有点最远的那个顶点。这一点应该是地球上最遥远的一点。


这是个好主意(+1)。但是,当所有点都位于同一半球内时,球形Voronoi图是什么样的?您引用的代码使用凸包获得它,但是似乎不起作用。
胡伯

嗯,是的,我想即使它们不在同一个半球中,也会有一个缺少种子点的多边形。如果使用凸包质心的对映点为其构造点,该怎么办?然后,除了循环遍历每个顶点之外,还将检查该凸-对映点,看它是否比最大顶点距离它的邻居更远。
Kirk Kuykendall

那是我最初的想法,但是对映点将创建人为的多边形。考虑一下,如果包括每个点的对映体,那么插图中会发生什么!可能有这种性质的解决方案,但这似乎并不简单。
ub

1

您可以使用成本加权距离函数来确定栅格中每个像元与所有其他点的距离。


您将使用什么费用?
ub

如果将成本设置为一个单位;您可以根据距离确定最远的点。
djq 2011年

@whuber虽然这也许与计算已经提到的欧几里得距离方法没有什么不同。
djq 2011年

那是欧几里得距离。实际上,这还不是全部:这是一种奇怪的八角形距离(圆圈实际上是八角形)。在这种情况下(仅与点之间的距离,没有障碍),直接计算欧几里得距离或球面距离网格比直接尝试使用CostDistance更准确,更快。
胡伯

我不确定成本加权距离功能是否会有所帮助,因为我只需要一个点的坐标并且我有一个现有的点向量集;但是我会尝试的。谢谢。
Demetris

1

据我所知,这种“ 难以接近的极点 ”分析必须反复进行。

只要您正在观察投影投影失真最小的小区域,则迭代栅格方法将是合适的。对于每个像元,计算到所有点的距离,然后取最小距离。值最高的单元格是极点。您也可以在Spatial Analyst中使用欧几里得距离来完成此操作。

迭代向量方法更加复杂。 Garcia-Castellanos等人2007年描述了一种基于球形地球的迭代方法。看来他们已经在线提供了C代码。我可以想象在Arc中使用缓冲区执行此操作的方法,但是它仍然是迭代且缓慢的。


0

您可以使用“点距离(分析)”工具会创建一个表格,其中包含两组点之间的距离。如果使用默认搜索半径,则将计算从所有输入点到所有附近点的距离。输出表可能会很大。例如,如果输入要素和近要素都各自具有1,000个点,则输出表可以包含一百万条记录。


如何将其应用于查找未出现在输入中的点的坐标?也许您误解了这个问题?
ub

0

到您的一组点中最远的点就是该组中最内部的点的倒数。例如,如果您集合中最里面的点的坐标为北49度,东为-144度,则倒数和最远点的坐标为南49度和西36度。这并非完全正确,因为地球不是完美的球形,而是大地水准面。因此,结果点的正确性在很大程度上取决于您使用的投影和地理系统(正交,正射...)。找到整个集合的倒数(为一个集合传送对映体),然后在对映体集覆盖的地形内进行表面分析可能会有所帮助,因为地形可能会非常好。我认为您的问题不是关于地球外物体(例如其他行星或卫星)的任何问题。抱歉,我没有适合您的VB代码。🙄


集合中距离所有其他点最远的点将是最内部的点(沿边缘距离所有最外部的点最远的点),它仍然是最靠近它的每个点的最近点。这是聚类分析,不好玩。它可能会更好看是成Physics.😐相同电荷的原子
尤里·舍夫丘克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.