python - 有效地遍历多个列表(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 - 如果成员的用户名中有大写,如何制作一个不和谐的机器人,给成员一个昵称(他们的用户名但小写)
- reactjs - TypeError:path.resolve 不是函数
- modelica - Modelica - 过度约束的 Stewart 平台模型的内部错误
- c++ - 自定义类型的名称,即使是带有可变参数的模板
- sql-server - 使用 ASP.NET MVC 将 Excel 数据导入 SQL Server 的多个表
- tailwind-css - 用tailwindcss设计的通知包与bootstrap主题冲突
- r - 删除 R 中具有特定值的案例
- google-chrome - Chrome 插件 - 无需 webRequest API 即可监控请求
- node.js - nodejs:如何仅将重定向设置为 expressjs 上的基本 url?
- ruby-on-rails - 仅当创建或更新具有特定名称值的记录以及特定部分时,如何在 Rails 6(热线)中发送 broadcasts_to?