Python地理空间可视化:无区域坐标能否实现?
无需手动获取坐标也能实现地理空间可视化
你完全不需要手动收集区域坐标数据,就能完成需求中的地理空间可视化,以下是几种适配你场景的可行方案:
1. 基于地名自动编码的交互式地图
很多Python可视化库支持直接传入地区名称(如你用到的bandung、bogor),自动完成地理编码(将地名转换为经纬度坐标),无需手动输入坐标:
Plotly Express 实现示例
import plotly.express as px import pandas as pd # 你的统计结果数据 stats_df = pd.DataFrame({ 'salesperson': ['abc', 'def', 'ghi', 'ghi', 'jkl'], 'area': ['bandung', 'bogor', 'bandung', 'bogor', 'bogor'], 'company_count': [2, 1, 1, 1, 1] }) # 生成交互式地图,直接使用area列的地名 fig = px.scatter_geo( stats_df, locations="area", locationmode="country names+regions", # 适配印尼地区名称匹配 color="salesperson", size="company_count", hover_name="area", title="销售代表各区域公司数量分布" ) fig.show()
Folium + Geopy 实现示例
结合Folium生成交互式地图,用Geopy自动解析地名坐标:
import folium from geopy.geocoders import Nominatim import pandas as pd stats_df = pd.DataFrame({ 'salesperson': ['abc', 'def', 'ghi', 'ghi', 'jkl'], 'area': ['bandung', 'bogor', 'bandung', 'bogor', 'bogor'], 'company_count': [2, 1, 1, 1, 1] }) # 初始化地理编码器 geolocator = Nominatim(user_agent="sales_visualization") # 自动获取每个区域的经纬度 stats_df['location'] = stats_df['area'].apply(lambda x: geolocator.geocode(f"{x}, Indonesia")) stats_df['lat'] = stats_df['location'].apply(lambda x: x.latitude if x else None) stats_df['lon'] = stats_df['location'].apply(lambda x: x.longitude if x else None) # 创建地图(以印尼爪哇岛中心为初始视角) m = folium.Map(location=[-6.2088, 106.8456], zoom_start=9) # 添加标记点 for idx, row in stats_df.iterrows(): folium.CircleMarker( location=[row['lat'], row['lon']], radius=row['company_count'] * 5, popup=f"{row['salesperson']}<br>公司数量: {row['company_count']}", color='#2e86de', fill=True, fill_color='#2e86de' ).add_to(m) # 保存地图为HTML文件 m.save('sales_area_map.html')
2. 区域填充式热力图(Choropleth)
如果需要绘制区域填充的热力图,可使用GeoPandas配合公开的印尼行政区划GeoJSON数据(无需手动提取坐标),直接匹配区域名称生成地图:
import geopandas as gpd import matplotlib.pyplot as plt import pandas as pd # 按区域汇总的公司总数数据 area_summary = pd.DataFrame({ 'area': ['bandung', 'bogor'], 'total_companies': [3, 3] }) # 加载印尼市级行政区划GeoJSON数据(可从公开地理数据仓库获取本地文件) indonesia_gdf = gpd.read_file('indonesia_city_boundaries.geojson') # 匹配区域名称与GeoJSON中的行政区划名称 merged_gdf = indonesia_gdf.merge(area_summary, left_on='city_name', right_on='area', how='left') # 绘制热力图 fig, ax = plt.subplots(figsize=(12, 10)) merged_gdf.plot( column='total_companies', ax=ax, legend=True, missing_kwds={'color': '#f0f0f0'}, # 无数据区域显示浅灰色 cmap='Blues' ) plt.title("各区域公司总数分布") plt.axis('off') plt.show()
仅在特殊场景下需要手动坐标
只有当你的区域名称非常小众、无法被自动地理编码服务识别,或者需要自定义高精度区域边界时,才需要手动获取坐标数据。你的场景中bandung和bogor都是印尼知名城市,完全可以通过自动工具匹配到准确坐标。
内容的提问来源于stack exchange,提问作者rainy days.
相关产品推荐
相关产品推荐

