OSMNX路径规划无路线显示及Kivy集成、打包问题求助
问题解决方案与思路
一、OSMNX路线不显示的修复
你的代码核心错误是ox.nearest_nodes的参数顺序搞反了:OSMNX中X对应经度(longitude),Y对应纬度(latitude),你把经纬度传反了,导致找不到正确的起点/终点节点,最终shortest_path返回None,自然没有路线显示。
修正后的代码:
import osmnx as ox # 建议用别名ox,更规范 G = ox.graph_from_place("New York, New York", network_type='drive') # 起点终点经纬度 origin_lat, origin_lon = 40.73765090370579, -73.97428265598312 destination_lat, destination_lon = 40.72568284052202, -74.01119033844985 # 修正参数顺序:X=经度,Y=纬度 origin_node = ox.nearest_nodes(G, X=origin_lon, Y=origin_lat) destination_node = ox.nearest_nodes(G, X=destination_lon, Y=destination_lat) # 先判断路径是否存在 R = ox.shortest_path(G, origin_node, destination_node, weight='length') if not R: print("无可用路径") else: fig, ax = ox.plot_graph_route(G, R, route_color="r", route_linewidth=6, node_size=0)
另外,建议添加路径存在性判断,避免因区域无道路导致的空路线问题。
二、集成Kivy MapView的思路
OSMNX输出的路线是节点ID列表,你需要将这些节点转换为经纬度坐标,再用Kivy MapView的Polyline组件绘制路线:
- 从图G中提取路线节点的经纬度:
这里route_coords = [(G.nodes[node]['y'], G.nodes[node]['x']) for node in R]G.nodes[node]['y']是纬度,['x']是经度,对应MapView的坐标要求。 - 在Kivy布局中添加
MapView,然后创建Polyline,将route_coords传入,设置颜色和宽度即可显示路线。 - 起点/终点可以用
Marker组件标记,直接传入对应经纬度。
三、路线途经主要城镇的实现
核心是对路线上的节点进行反向地理编码,提取行政区域信息:
- 提取路线的所有节点坐标(参考上面的
route_coords)。 - 对坐标进行反向地理编码:可以用OSMNX自带的
ox.geocoder.reverse_geocode,或者geopy的Nominatim服务。 - 从返回的地址信息中提取城镇/城市名称,去重后筛选出主要的(比如排除小区、街道级别的名称,保留town/city级别的)。
- 优化方式:不需要对每个节点都编码,每隔一段距离取一个节点即可,减少请求量。
四、WSL环境Buildozer打包问题的解决
WSL打包Android应用确实容易遇到SDK/NDK路径、权限问题,给你几个实用方案:
- 手动配置Buildozer.spec:在spec文件中明确指定
android.sdk_path和android.ndk_path,确保路径是WSL内的绝对路径(比如/home/你的用户名/android-sdk),不要用Windows的路径(比如/mnt/c/...)。 - 依赖补全:执行
sudo apt-get install -y build-essential git python3 python3-pip python3-dev ffmpeg libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-ttf-dev libportmidi-dev libswscale-dev libavformat-dev libavcodec-dev zlib1g-dev,确保所有依赖安装完整。 - 替代打包方案:放弃本地WSL打包,用GitHub Actions自动打包。只需要把代码传到GitHub,配置一个Android打包的Action workflow,就能自动生成APK,完全避开本地环境问题。
- GPS fallback方案:如果GPS获取失败,用地理编码(比如输入城市名称获取经纬度)作为起点,不会增加路线规划难度——OSMNX只需要经纬度坐标,不管来源是GPS还是地理编码,路线逻辑完全一致。
内容的提问来源于stack exchange,提问作者user23160500
相关产品推荐
相关产品推荐

