我有几个 (25*10) GPX 骑行轨迹要分析(距离、最大速度、加速度等),这些轨迹是从 Runkeeper 获得的。问题是数据包含重大错误,数据点位于田地而不是道路上。我是地理空间分析的新手,所以我知道存在诸如 geopandas 和 shapely 之类的包,但我离我知道应该一直使用哪些包的地步还很远。
我的主要问题的解决方案似乎类似于 Schuessler, N. 和 KW Axhausen (2009) 的论文中提出的建议:Map-matching of GPS traces on high-resolution navigation networks using the Multiple Hypothesis Technique (MHT), https ://www.ethz.ch/content/dam/ethz/special-interest/baug/ivt/ivt-dam/vpl/reports/501-600/ab568.pdf
到目前为止,我最接近下载、绘制和分析地图数据的是使用osmnx包,它避免了使用付费服务(例如谷歌的snap-to-road 功能,它也只能处理 100 点一次)。我已经使用 gpxpy 将 GPX 数据转换为 pandas 数据帧,这给了我一个包含时间、纬度、经度和海拔数据的 df。
我想将每个明显不正确的 GPX 点(道路宽度 + 容差例如 20 m)捕捉到道路(=边缘)。我的问题是我对 osmnx 包的理解不够好,无法做我想做的事。
当我做
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import gpxpy
import osmnx as ox
ox.config(use_cache=True, log_console=True)
#df is created using gpxpy to convert GPX data to a list, which is then converted to a pandas DataFrame
delta = 0.035 #in degrees, for plotting bounds
N = max(df['lat'][0],df['lat'][-1]) + delta
S = min(df['lat'][0],df['lat'][-1]) - delta
E = max(df['lon'][0],df['lon'][-1]) + delta
W = min(df['lon'][0],df['lon'][-1]) - delta
G = ox.graph_from_bbox(N, S, E, W, network_type='drive')
route_edges = ox.get_nearest_edges(G,df['lon'],df['lat'],method='balltree',dist=0.0001)
“route_edges”的内容是一个 ndarray,其中包含可能投影的数字(到 WGS84 或 UTM?),而不是度数。我不知道如何将 ndarray 转换回度数,或者以 ndarray 的格式获取 lat/lon GPX 跟踪值,因此我可以计算到道路的距离并确定是保留还是替换数据。
总结一下:我的主要问题是将不正确的 GPX 数据捕捉/纠正到已知道路,我更喜欢使用 OpenStreetMap 数据。
子问题:
我应该使用 osmnx 来计算 GPX(纬度/经度)点和边缘之间的距离,还是应该使用 geopandas 或 shapely(或完全是其他的东西?)?
如何将纬度/经度点转换为 osmnx 中使用的投影格式(例如
G_projected = ox.project_graph(G)
),以便我可以以米而不是度为单位说明 get_nearest_edges 方法的距离?