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

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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 21:05:20