You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:15:09