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

OSMnx绘制街道地图时仅柏林正常 其余城市显示空白

问题原因
  • 核心问题是手动硬编码的绘图边界框(bbox)完全错误:
    1. 瓦伦西亚的正确经度为西经0.3763°,即数值应为-0.3763,你代码中写为东经0.3763,该坐标位于瓦伦西亚东侧的地中海海域,框选范围内无任何陆地街道数据;
    2. 你将经纬度值写死在代码中,测试柏林、美国城市时未同步修改对应坐标,这些城市的路网与你框选的地中海区域完全不重叠,自然只会显示背景色。你之前柏林能正常出图,大概率是测试阶段未手动传入bbox参数,OSMnx自动适配了路网的实际边界。
  • 代码存在逻辑bug会导致渲染异常:
    1. 主干道颜色值写为'#ffff',属于不规范的十六进制色值,标准不透明白色应为'#ffffff',部分matplotlib版本解析该值时会出现渲染错误;
    2. 边属性遍历逻辑有漏洞:当某条道路的属性中不存在highway字段时,color和linewidth变量未被赋值就会被追加到列表中,直接触发NameError中断绘图。
修复方案
  • 移除手动硬编码的bbox参数,让OSMnx自动根据加载的路网范围适配绘图边界,从根源上避免坐标写错、换城市忘改坐标的问题;如果确实需要固定绘图缓冲范围,可以直接从加载的路网G中自动提取边界再做偏移,不要手动写死经纬度。
  • 修正颜色值,同时调整属性遍历逻辑:先给道路颜色、宽度设置默认值,再根据道路长度、等级覆盖对应配置,避免变量未定义错误。
  • (可选优化)兼容OSM数据中highway字段为列表的情况,避免道路等级误判。
修复后可运行代码
import osmnx as ox
import networkx as nx
from PIL import Image, ImageOps, ImageColor, ImageFont, ImageDraw
from matplotlib.lines import Line2D
import matplotlib.cm as cm
import matplotlib.colors as colors
import pandas as pd

place = ['Valencia, Spain']
G = ox.graph_from_place(place, retain_all = True, simplify = True, network_type = 'all')

u = []
v = []
key = []
data = []

for uu, vv, kkey, ddata in G.edges(keys = True, data = True):
    u.append(uu)
    v.append(vv)
    key.append(kkey)
    data.append(ddata)

roadColors = []
roadWidths = []

for item in data:
    # 先设置默认值,避免无highway字段时报错
    linewidth = 0.1
    color = '#a6a6a6'
    if 'highway' in item.keys():
        if item['length'] <= 100:
            linewidth = 0.1
            color = '#454545'
        elif 100 < item['length'] <= 200:
            linewidth = 0.15
            color = '#676767'
        elif 200 < item['length'] <= 400:
            linewidth = 0.25
            color = '#a6a6a6'
        elif 400 < item['length'] <= 800:
            linewidth = 0.35
            color = '#bdbdbd'
        elif item['length'] > 800:
            linewidth = 0.45
            color = '#d5d5d5'
        # 修正色值为标准6位白色,兼容highway为列表的情况
        highway_tags = item['highway'] if isinstance(item['highway'], list) else [item['highway']]
        if 'primary' in highway_tags:
            linewidth = 0.5
            color = '#ffffff'

    roadColors.append(color)
    roadWidths.append(linewidth)

bgcolor = '#061529'

# 移除手动写死的bbox,自动适配路网范围
fig, ax = ox.plot_graph(G, node_size = 0,
                       dpi = 300, bgcolor = bgcolor, save = False,
                       edge_color = roadColors, edge_linewidth = roadWidths,
                       edge_alpha = 1)

fig.tight_layout(pad = 0)

如果你确实需要手动指定bbox范围,瓦伦西亚的正确参考经纬度为纬度39.4699、经度-0.3763,且每次更换绘制城市时必须同步修改为对应城市的坐标。

内容的提问来源于stack exchange,提问作者Exquisite_Poupon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 21:42:14