首页 > 解决方案 > 如何有效地检查 GPS 坐标是否接近其他数千个坐标?

问题描述

我有 1100 万个 GPS 坐标要分析,效率是我的主要问题。问题如下:我想在其周围每 50 米半径内仅保留 1 个 GPS 坐标(称为节点)。所以代码非常简单,我有一个集合 G 并且对于 GI 中的每个节点,检查我要添加的节点是否与其他节点太接近。如果太近(<50 米),我不会添加它。否则我会添加它。

问题是集合 G 增长得非常快,最后要检查是否要向集合中添加一个节点,我需要对数百万个元素运行 for 循环...

这是 Node 类的简化代码:

from geopy import distance

class Node: #a point on the map
    def __init__(self, lat, long): #lat and long in degree
        self.lat = lat
        self.long = long

    def distanceTo(self, otherNode):
        return distance.distance((self.lat, self.long), (otherNode.lat, otherNode.long)).km

    def equivalent(self, otherNode):
        return self.distanceTo(otherNode) < 0.05 #50 meters away

这是“添加”过程:

currentNode = Node(lat, long)

alreadyIn = False
for n in graph:
    if n.equivalent(currentNode):
        alreadyIn = True
        break

#set of Nodes
if alreadyIn == False:
    G.add(currentNode)

这不是节点聚类的问题,因为我没有尝试检测数据集中的任何模式。我只是想将 50 米半径内的节点分组。

我认为最好的方法是拥有一个给定坐标返回的数据结构,True或者False如果集合中有类似的节点。但是我不知道要使用哪一个,因为我没有将环境划分为正方形而是圆形。(是的,节点 A 可以等效于 B 和 C 而 B 和 C 不等效,但我真的不介意......)。

谢谢您的帮助 !

标签: pythongps

解决方案


对于这样的计算,使用面向对象的方法通常会更慢(尽管更具可读性)。

您可以将纬度、经度转换为笛卡尔 x、y、z 并从节点创建 numpy 数组并使用 scipy 非常快的cKDTree。它为此类操作提供了多种方法,在您的情况下query_ball_point可能是正确的方法。


推荐阅读