如何通过ISO 3166代码获取地理定位及质心?Python实现求助
解决方案
方法1:使用预定义的国家质心数据集(快速便捷)
直接用包含ISO 3166-1 alpha-3代码与对应质心坐标的数据集,规避地理编码的不确定性。
准备数据集:自己整理一个CSV文件,格式示例:
alpha3,latitude,longitude USA,37.0902,-95.7129 CHN,35.8617,104.1954 JPN,36.2048,138.2529加载并关联数据,绘制标记:
import pandas as pd import matplotlib.pyplot as plt # 你的业务数据(包含alpha3和数量字段) your_data = pd.DataFrame({ 'alpha3': ['USA', 'CHN', 'JPN'], 'count': [100, 200, 150] }) # 加载质心数据集 centroids = pd.read_csv('country_centroids.csv') # 合并数据 merged = pd.merge(your_data, centroids, on='alpha3') # 绘制与数量成正比的圆盘标记 plt.figure(figsize=(12, 8)) plt.scatter(merged['longitude'], merged['latitude'], s=merged['count']*2, alpha=0.6) # 添加国家代码标签 for idx, row in merged.iterrows(): plt.text(row['longitude'], row['latitude'], row['alpha3'], fontsize=10) plt.xlabel('Longitude') plt.ylabel('Latitude') plt.title('Country Markers by Count') plt.show()
方法2:用地理空间库计算精确几何质心(更准确)
如果需要区域的几何质心(而非行政中心),用geopandas结合国家边界数据实现:
安装依赖:
pip install geopandas matplotlib代码实现:
import geopandas as gpd import pandas as pd import matplotlib.pyplot as plt # 加载内置的国家边界数据(包含iso_a3字段,对应alpha-3代码) world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres')) # 你的业务数据 your_data = pd.DataFrame({ 'alpha3': ['USA', 'CHN', 'JPN'], 'count': [100, 200, 150] }) # 合并并过滤匹配的国家 merged = world.merge(your_data, left_on='iso_a3', right_on='alpha3') # 计算几何质心 merged['centroid_lon'] = merged.geometry.centroid.x merged['centroid_lat'] = merged.geometry.centroid.y # 绘制地图与标记 fig, ax = plt.subplots(figsize=(15, 10)) world.plot(ax=ax, color='lightgray') merged.plot(ax=ax, marker='o', color='red', markersize=merged['count']*2, alpha=0.7) # 添加标签 for idx, row in merged.iterrows(): ax.text(row['centroid_lon'], row['centroid_lat'], row['alpha3'], fontsize=12) plt.title('Country Centroid Markers by Count') plt.show()
geopy失败的补救思路
如果一定要用geopy,需先将alpha-3代码转成国家名称再编码,但得到的是行政中心坐标,精度和稳定性不如前两种方法:
from geopy.geocoders import Nominatim import pycountry geolocator = Nominatim(user_agent="your_custom_app_name") def get_admin_center(alpha3): try: country = pycountry.countries.get(alpha_3=alpha3) location = geolocator.geocode(country.name) return (location.latitude, location.longitude) except: return None # 示例调用 print(get_admin_center('USA'))
内容的提问来源于stack exchange,提问作者PBrockmann
相关产品推荐
相关产品推荐

