Folium可视化NSW限速区Shapefile无显示及筛选功能实现求助
问题解决:Folium可视化限速区Shapefile无内容+实现筛选功能
问题排查
代码运行无报错但HTML空白,核心原因有两个:
- 地图中心与数据区域不匹配:你设置的地图中心是悉尼坐标
[-33.8688, 151.2093],但提供的Shapefile数据坐标集中在[-28~-29, 153~154]区域(新南威尔士州北部/昆士兰边境),地图加载后默认看不到数据。 - 样式设置错误:
- 数据是
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
相关产品推荐
相关产品推荐

