python - 如何有效地检查 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 不等效,但我真的不介意......)。
谢谢您的帮助 !
解决方案
对于这样的计算,使用面向对象的方法通常会更慢(尽管更具可读性)。
您可以将纬度、经度转换为笛卡尔 x、y、z 并从节点创建 numpy 数组并使用 scipy 非常快的cKDTree。它为此类操作提供了多种方法,在您的情况下query_ball_point
可能是正确的方法。
推荐阅读
- linux - 作为 shell 脚本的一部分,sudo su 不起作用。有替代品吗?
- javascript - 当xxx是孩子时处理javascript“无法读取未定义的属性'xxx'”
- selenium-webdriver - 如何在 Selenium Webdriver 中定位 CKEditor,以及 CK Editor 中的 iframe 和 body 是什么
- r - ggplot中没有边框的圆形
- listview - 为什么 DataContext 为 ListView 项目之外的项目返回空值?
- bash - 新行文本的 sed 错误未终止替换模式
- c++ - 通过实用程序 fn 将捕获的 lambda 传递给 C 样式回调 - 错误
- css - 警告:validateDOMNesting(...):不能作为后代出现
- google-cloud-platform - 要求 BigQuery 视图上的分区过滤器
- javascript - 如何更改我的正则表达式以查找多个网址?