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

如何基于带数值的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 17:50:23