Geopandas+Folium标记聚类异常:仅显示多边形无点位的解决方法
问题排查与解决方案
1. 检查并修正坐标参考系(CRS)
folium地图默认使用EPSG:4326(WGS84,经纬度坐标),如果原始坐标是其他投影格式(如平面坐标),必须转换到4326才能被folium识别:
import geopandas as gpd from shapely.geometry import Point import folium from folium.plugins import MarkerCluster # 假设你的DataFrame为df,包含lon(经度)、lat(纬度)列 # 正确创建GeoDataFrame并指定CRS gdf = gpd.GeoDataFrame( df, geometry=gpd.points_from_xy(df.lon, df.lat), crs="EPSG:4326" ) # 若原始坐标CRS不是4326,执行转换 # gdf = gdf.to_crs("EPSG:4326")
2. 确认GeoDataFrame的geometry列有效性
检查是否生成了正确的Point对象,避免经纬度顺序颠倒(folium要求纬度在前、经度在后):
# 查看前几行geometry,确认格式为Point(lon, lat) print(gdf.head()) # 若坐标顺序颠倒,修正如下: # gdf = gpd.GeoDataFrame( # df, # geometry=gpd.points_from_xy(df.lat, df.lon), # crs="EPSG:4326" # )
3. 正确使用MarkerCluster实现点位聚合
确保聚合插件初始化正确,且点位图层在多边形图层之后添加(避免被覆盖):
# 用数据中心坐标初始化地图 m = folium.Map(location=[gdf.geometry.y.mean(), gdf.geometry.x.mean()], zoom_start=12) # 先添加建筑多边形图层(可设置透明度避免遮挡) # folium.GeoJson( # buildings_gdf, # style_function=lambda x: {"fillOpacity": 0.3, "color": "gray"} # ).add_to(m) # 添加聚合标记集群 marker_cluster = MarkerCluster().add_to(m) for idx, row in gdf.iterrows(): folium.Marker( location=[row.geometry.y, row.geometry.x], popup=f"数量: {row.get('count', 1)}" # 替换为你的计数列名 ).add_to(marker_cluster) # 保存并查看地图 m.save("aggregated_map.html")
4. 排查预聚合逻辑问题(若提前做空间聚合)
如果是先对点位做空间聚合(如缓冲区聚合),确保聚合后的GeoDataFrame包含有效geometry和计数:
# 示例:用100米缓冲区聚合点位(需先转投影CRS) gdf_proj = gdf.to_crs("EPSG:3857") # 墨卡托投影,单位为米 gdf_proj["buffer"] = gdf_proj.geometry.buffer(100) # 按缓冲区聚合并计数 agg_gdf = gdf_proj.dissolve(by="buffer", aggfunc={"id": "count"}).rename(columns={"id": "point_count"}) agg_gdf = agg_gdf.to_crs("EPSG:4326") # 转回经纬度坐标 # 添加聚合后的圆形标记 for idx, row in agg_gdf.iterrows(): folium.CircleMarker( location=[row.geometry.centroid.y, row.geometry.centroid.x], radius=10, color="red", fill=True, fill_color="red", popup=f"聚合数量: {row.point_count}" ).add_to(m)
内容的提问来源于stack exchange,提问作者JayJona
相关产品推荐
相关产品推荐

