首页 > 解决方案 > 有效地遍历多个列表(GPS 坐标)

问题描述

我正在尝试编写一个程序,该程序采用 gpx 文件(包含时间、纬度、经度等列表的 xml 文档)并确定查找表中的坐标是否已通过。我目前通过计算 GPX 文件中的每个点与查找列表中的每个点之间的距离来实现这一点。对于距离在一定范围内的任何点,我返回已通过的点。

供参考:每个 GPX 文件包含 ~5000 个点,需要与查找文件中的 ~200 个坐标进行比较。查找文件是作为字典导入的 csv,GPS 文件作为包含点对象列表(lat、lon 元组)的 GPS 对象导入。

我已经成功地实现了这一点,现在正在优化它的性能。我已经优化了计算距离的数学(近似平地,预先计算余弦等),但我不确定如何优化将列表中的每个元素与另一个列表进行比较。

下面是我的代码片段,如您所见,我正在做的一件事是遍历每 1 个查找行的所有 GPS 坐标。在到达距离查找点 50m 以下的点时,我将中断 for 循环并移动到下一个查找点。这使我的总执行时间降低到了约 0.3 秒,尽管我觉得可能有一种更有效的方法可以更快地做到这一点,但到目前为止我还没有运气

for row in gps_lookup:
   cos_factor = math.cos(row['lat1'])                                           
   for gps_point in points:
       delta_y = 12430 * (gps_point.latitude - row['lat1'])/180
       delta_x = (24901 * (gps_point.longitude - row['lon1'])/360) * cos_factor
       dist = math.sqrt(delta_x * delta_x + delta_y * delta_y)                             
       if dist < 0.05:                                                                     
           print(row['Point name'])
           break

有谁知道实现这一目标的可能更快的方法?想到的事情是“如果该点的距离大于 1000m,则不要费心检查接下来 10 个点的距离,因为它们可能也太远了”。我很高兴继续尝试识别更多基于规则的优化,但我不知道循环内的循环是否是最明智的方法,以及是否有其他方法可以实现这一点?

标签: python

解决方案


推荐阅读