在Django中使用OSMnx遇Fiona加载错误,求解决方案
解决OSMnx导致Django服务器启动失败:AttributeError: module 'fiona' has no attribute '_loading'
这个错误的核心原因是Fiona库版本不兼容——OSMnx依赖Fiona处理地理空间数据,但你当前环境中的Fiona版本和OSMnx、GDAL的版本不匹配,导致调用了不存在的_loading内部模块。下面是一步步的解决方法:
1. 先排查版本兼容性问题
首先在你的Conda虚拟环境中,运行以下命令查看相关库的版本:
conda list | grep -E "osmnx|fiona|gdal"
OSMnx对Fiona有明确的版本要求:
- OSMnx v1.0及以上需要Fiona ≥1.8
- 较新的OSMnx版本(比如v1.2+)建议使用Fiona 1.8.x到1.9.x之间的版本,避免过新的Fiona(比如2.0+)——因为Fiona 2.0重构了内部模块,直接移除了
_loading这个属性,这正是你报错的根源。
2. 重新安装兼容的版本组合
先卸载当前的Fiona,再安装和OSMnx匹配的版本。比如,如果你用的是OSMnx v1.2,可以安装Fiona 1.9.4:
conda uninstall fiona --force conda install -c conda-forge fiona=1.9.4 osmnx
Conda会自动处理依赖关系,安装适配的GDAL版本,避免版本冲突。
3. 调整Django视图的代码结构
你现在把OSMnx的初始化代码放在了模块级别(ox.config(...)和地理数据加载逻辑)——Django在启动服务器时会加载所有应用的模块,这时候执行OSMnx的地理数据操作,不仅会拖慢启动速度,还可能因为环境初始化不完全导致错误。
修改你的planner/views.py代码,把OSMnx的逻辑移到视图函数内部,延迟加载:
from django.shortcuts import render from django.http import HttpResponse, JsonResponse # 不要在模块级别初始化OSMnx,放到函数内部执行 def index(request): import osmnx as ox ox.config(use_cache=True, log_console=True) try: # 加载华沙的道路网络 warsaw_streets = ox.graph_from_place("Warsaw", network_type="drive") # 后续可以添加两点路径计算的逻辑,比如获取最短路径 return JsonResponse({"status": "success", "message": "道路网络加载成功"}) except Exception as e: return JsonResponse({"status": "error", "message": str(e)}, status=500)
这样OSMnx只会在第一次请求视图时才会被加载,避免了服务器启动时的初始化冲突。
4. 验证环境是否正常
先在虚拟环境中单独运行OSMnx的测试代码,确认没有错误:
import osmnx as ox ox.graph_from_place("Warsaw", network_type="drive")
如果这段代码能正常运行,再启动Django服务器:
python manage.py runserver
访问你配置好的planner视图URL,应该能看到正常的JSON响应。
另外作为Django新手,给你个小建议:尽量把复杂的业务逻辑(比如地理数据处理)从视图中抽离出来,放到单独的工具模块里,这样代码更易维护,也方便单独测试。
内容的提问来源于stack exchange,提问作者Rolfrider
相关产品推荐
相关产品推荐

