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

Folium可视化NSW限速区Shapefile无显示及筛选功能实现求助

问题解决:Folium可视化限速区Shapefile无内容+实现筛选功能

问题排查

代码运行无报错但HTML空白,核心原因有两个:

  1. 地图中心与数据区域不匹配:你设置的地图中心是悉尼坐标[-33.8688, 151.2093],但提供的Shapefile数据坐标集中在[-28~-29, 153~154]区域(新南威尔士州北部/昆士兰边境),地图加载后默认看不到数据。
  2. 样式设置错误:
    • 数据是LineString类型,fillColor对线条无效,需用color控制线条颜色;
    • #FF000000是全透明颜色(RGBA最后一位为0),即使匹配到40/50km/h的区域也无法显示。

修复后的基础可视化代码

import geopandas as gpd
import folium
import json

gdf = gpd.read_file(shp_file)

# 计算数据的中心坐标,替代固定的悉尼坐标
gdf_wgs84 = gdf.to_crs("EPSG:4326")
center_lat = gdf_wgs84.geometry.centroid.y.mean()
center_lon = gdf_wgs84.geometry.centroid.x.mean()

# 创建地图,以数据中心为基准
m = folium.Map(location=[center_lat, center_lon], zoom_start=10)

# 定义速度对应的颜色映射
speed_color_map = {
    "40 km/h": "#FF0000",  # 红色
    "50 km/h": "#FFA500",  # 橙色
    "100 km/h": "#008000"  # 绿色
}

# 直接将GeoDataFrame转为GeoJson添加到地图,无需逐个遍历
folium.GeoJson(
    gdf_wgs84,
    style_function=lambda feature: {
        "color": speed_color_map.get(feature["properties"]["Speed"], "#808080"),  # 默认灰色
        "weight": 2  # 设置线条宽度,让线条更明显
    },
    tooltip=folium.GeoJsonTooltip(
        fields=["Type", "Status", "Direction", "Speed"],
        aliases=["类型", "状态", "方向", "限速"],
        localize=True
    )
).add_to(m)

m.save("speed_limit_map.html")

实现筛选功能(按限速筛选)

通过FeatureGroup和LayerControl实现不同限速区域的开关筛选:

import geopandas as gpd
import folium

gdf = gpd.read_file(shp_file)
gdf_wgs84 = gdf.to_crs("EPSG:4326")

# 计算数据中心
center_lat = gdf_wgs84.geometry.centroid.y.mean()
center_lon = gdf_wgs84.geometry.centroid.x.mean()

m = folium.Map(location=[center_lat, center_lon], zoom_start=10)

# 定义颜色映射
speed_color_map = {
    "40 km/h": "#FF0000",
    "50 km/h": "#FFA500",
    "100 km/h": "#008000"
}

# 为每个限速值创建独立图层
for speed in speed_color_map.keys():
    # 筛选对应限速的要素
    filtered_gdf = gdf_wgs84[gdf_wgs84["Speed"] == speed]
    # 创建要素组
    fg = folium.FeatureGroup(name=f"{speed} 区域")
    # 添加到要素组
    folium.GeoJson(
        filtered_gdf,
        style_function=lambda feature, speed=speed: {
            "color": speed_color_map[speed],
            "weight": 2
        },
        tooltip=folium.GeoJsonTooltip(
            fields=["Type", "Status", "Direction", "Speed"],
            aliases=["类型", "状态", "方向", "限速"],
            localize=True
        )
    ).add_to(fg)
    # 将要素组添加到地图
    fg.add_to(m)

# 添加图层控制器,实现筛选开关
folium.LayerControl(collapsed=False).add_to(m)

m.save("speed_limit_map_with_filter.html")

关键优化点

  • 用数据的中心坐标替代固定坐标,确保加载后直接看到数据区域;
  • 针对LineString类型调整样式参数,使用color和weight控制线条显示;
  • 批量处理GeoDataFrame,比逐个遍历Feature效率更高;
  • 通过图层控制器实现可视化筛选,用户可自由选择显示的限速区域。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 15:07:01