如何基于带数值的Geohash绘制分级设色地图?
解决Geohash转多边形并生成分级设色地图的方案
你之前用错了方法——polygon_to_geohashes是把多边形拆分成Geohash网格,和你需要的“单个Geohash转多边形”逻辑完全相反。下面是简单可行的解决步骤:
步骤1:安装依赖库
确保安装以下必要库:
pip install pandas geopandas folium polygon-geohasher
(如果不想额外依赖polygon-geohasher,也可以用geohash库替代)
步骤2:将Geohash转为多边形并关联数值
直接遍历每行数据,把每个Geohash转成对应的Polygon对象,和原数值绑定成GeoDataFrame:
方法一:用polygon-geohasher库(更简便)
import pandas as pd import geopandas as gpd from polygon_geohasher import geohash_to_polygon import folium # 假设你的原始数据是DataFrame(也可从CSV/Excel读取) data = pd.DataFrame({ '数值': [2, 5], 'Geohash': ['w21zgk', 'w21z4q'] }) # 为每行生成对应的多边形 data['geometry'] = data['Geohash'].apply(geohash_to_polygon) # 转为GeoDataFrame,指定坐标系为WGS84(EPSG:4326) gdf = gpd.GeoDataFrame(data, crs="EPSG:4326")
方法二:用geohash库手动构建多边形
如果不想依赖polygon-geohasher,可以自己解码Geohash边界生成多边形:
import pandas as pd import geopandas as gpd from shapely.geometry import Polygon import geohash import folium def gh_to_polygon(gh_str): # 解码Geohash得到经纬度边界:(min_lon, min_lat, max_lon, max_lat) min_lon, min_lat, max_lon, max_lat = geohash.bounds(gh_str) # 构建四边形Polygon return Polygon([ (min_lon, min_lat), (max_lon, min_lat), (max_lon, max_lat), (min_lon, max_lat), (min_lon, min_lat) ]) data = pd.DataFrame({ '数值': [2, 5], 'Geohash': ['w21zgk', 'w21z4q'] }) data['geometry'] = data['Geohash'].apply(gh_to_polygon) gdf = gpd.GeoDataFrame(data, crs="EPSG:4326")
步骤3:用folium绘制分级设色地图
基于生成的GeoDataFrame,直接用folium的Choropleth组件绘图:
# 创建底图,中心设为所有Geohash区域的中心点 map_center = [gdf.geometry.centroid.y.mean(), gdf.geometry.centroid.x.mean()] m = folium.Map(location=map_center, zoom_start=12) # 添加分级设色图层 folium.Choropleth( geo_data=gdf, data=gdf, columns=['Geohash', '数值'], # 关联的键列和数值列 key_on='feature.properties.Geohash', # GeoJSON中匹配的属性名 fill_color='YlOrRd', # 配色方案(可更换为其他folium支持的配色) fill_opacity=0.7, line_opacity=0.2, legend_name='数值分级' ).add_to(m) # 添加鼠标悬停提示 folium.GeoJsonTooltip(['Geohash', '数值']).add_to(m) # 保存地图为HTML文件 m.save('geohash_choropleth.html')
关键说明
核心逻辑是一对一将Geohash转成Polygon,确保每个多边形和原数据的数值一一对应,这样GeoDataFrame才能正确关联数据。如果你的原始数据量很大,这种逐行转换的效率也足够应对,因为Geohash转多边形是轻量操作。
内容的提问来源于stack exchange,提问作者imguessing
相关产品推荐
相关产品推荐

