如何在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
相关产品推荐
相关产品推荐

