Graph 验证2D图形中的所有边彼此之间的距离是否足够远

Graph 验证2D图形中的所有边彼此之间的距离是否足够远,graph,gis,closest-points,Graph,Gis,Closest Points,我有一个图,每个节点都有二维坐标,实际上是一个地理图,有纬度和经度。 我需要验证,如果两条边之间的距离小于MAX_DIST,则它们共享一个节点。当然,如果它们相交,那么它们之间的距离为零 蛮力算法很简单,有没有更有效的算法 我曾考虑尝试适应图形边并忽略共享节点的边对,但这样做并不简单。我很好奇rtree索引的想法将如何执行,因此我创建了一个小脚本,使用两个非常酷的Python库对其进行测试:和 该代码段生成1000个长度为1

我有一个图,每个节点都有二维坐标,实际上是一个地理图,有纬度和经度。 我需要验证,如果两条边之间的距离小于MAX_DIST,则它们共享一个节点。当然,如果它们相交,那么它们之间的距离为零

蛮力算法很简单,有没有更有效的算法


我曾考虑尝试适应图形边并忽略共享节点的边对,但这样做并不简单。

我很好奇rtree索引的想法将如何执行,因此我创建了一个小脚本,使用两个非常酷的Python库对其进行测试:和 该代码段生成1000个长度为1<长度<5且坐标在[01100]间隔内的段,填充索引,然后使用经典方法和基于索引的方法计算比MAX_DIST==0.1更接近的对。 在我的测试中,使用上述条件,索引方法大约快25倍;对于您的数据集,这可能会有很大差异,但结果令人鼓舞:

found 532 pairs of close segments using classic method
7.47 seconds for classic count
found 532 pairs of close segments using index method
0.28 seconds for index count
索引方法的性能和正确性取决于分段的分布方式,如果分段很长,则取决于所使用的参数

导入时间 随机输入 从rtree导入rtree 从shapely.geometry导入线条字符串 def生成_段编号: 段={} 对于rangenumber中的i: 尽管如此: x1=random.randinT0100 y1=random.randinT0100 x2=random.randinT0100 y2=random.randinT0100 段=线串[x1,y1,x2,y2] 如果1=关闭索引:不计算重复项 持续 关闭段=段[关闭索引] 如果segment.distance关闭\u segment<最大\u距离: 计数+=1 返回计数 如果uuuu name uuuuu==\uuuuuuuu main\uuuuuuuu: 最大距离=0.1 s=生成_段1000 r_idx=填充索引 t=时间 打印使用经典方法%count\u close\u segments,MAX\u DIST找到%d对闭合段 打印%.2f秒用于经典计数%time.time-t t=时间 打印使用索引方法%count_close_segments_indexs,r_idx,MAX_DIST找到%d对闭合段 打印%.2f秒,用于索引计数%time.time-t
如何将所有边添加到索引中;之后,您只需检查最近边的最大距离,而不是所有边。我不知道一个包含所有边的Rtree如何帮助我找到最近边创建索引后,您可以使用诸如get_nearest_ObjectsBox之类的函数,这比手动检查所有其他边快得多;将其视为处理数据库时使用的常规索引。如果你能提供一些测试数据,我可以试着运行一些测试。非常酷!我实际上已经知道如何使用rtree来解决这个问题,我也将回顾一下您的解决方案,非常棒: