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

如何在Tableau或Python中基于经纬度实现城市分组与地图绘制?

按城市分组的两种实现方法

方法一:直接在Tableau中操作

1. 自动识别地理信息分组

导入CSV文件后,找到Longitude和Latitude字段,右键分别设置地理角色为经度和纬度。Tableau会自动解析出城市、国家等层级的地理字段,直接将生成的「城市」字段拖到行/列、颜色或详细信息面板,就能实现按城市分组分析。

2. 手动修正分组(自动识别不准时)

如果Tableau自动识别的城市有误,选中视图里的点标记,右键选择创建>组,手动勾选属于同一城市的点,设置分组名称后确认,新生成的分组字段可直接用于分析。

3. 自定义计算字段匹配城市

若自动识别完全失效,可创建计算字段:点击分析>创建计算字段,编写经纬度范围判断逻辑,示例如下:

IF [Latitude] > 39 AND [Latitude] < 40 AND [Longitude] > 116 AND [Longitude] < 117 THEN "北京市"
ELSEIF [Latitude] > 31 AND [Latitude] < 32 AND [Longitude] > 121 AND [Longitude] < 122 THEN "上海市"
END

生成的计算字段可直接作为分组维度使用。

方法二:用Python预处理数据(提前添加城市字段)

1. 调用地理编码接口自动匹配城市

使用geopy库通过经纬度反向解析城市,先安装依赖:

pip install geopy pandas

执行以下代码预处理数据:

import pandas as pd
from geopy.geocoders import Nominatim

# 读取CSV数据
df = pd.read_csv("你的数据文件.csv")

# 初始化地理编码器
geolocator = Nominatim(user_agent="tableau_city_matcher")

# 定义函数根据经纬度获取城市
def get_city(row):
    try:
        location = geolocator.reverse(f"{row['Latitude']}, {row['Longitude']}", exactly_one=True)
        address = location.raw.get('address', {})
        # 优先取city,无则降级取town或village
        return address.get('city') or address.get('town') or address.get('village')
    except:
        return None

# 生成城市字段
df['City'] = df.apply(get_city, axis=1)

# 保存为带城市字段的新CSV,导入Tableau即可直接按City分组
df.to_csv("带城市字段的数据.csv", index=False)

2. 手动定义经纬度范围匹配(无需联网)

如果不想调用外部接口,可手动编写城市的经纬度区间逻辑:

import pandas as pd

df = pd.read_csv("你的数据文件.csv")

def match_city(lat, lon):
    if 39 < lat < 40 and 116 < lon < 117:
        return "北京市"
    elif 31 < lat < 32 and 121 < lon < 122:
        return "上海市"
    # 可添加更多城市的经纬度范围
    else:
        return "其他城市"

df['City'] = df.apply(lambda x: match_city(x['Latitude'], x['Longitude']), axis=1)
df.to_csv("带城市字段的数据.csv", index=False)

内容的提问来源于stack exchange,提问作者Heidi Hussein

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 15:24:07