使用geopy地理编码返回地址经纬度不准确问题咨询
问题根因
代码存在两个核心逻辑错误,直接导致返回结果异常:
- 预先定义了拼接
Philadelphia PA后缀、限定查询范围的geocode方法,但循环查询时完全没有调用该方法,直接传入不带地区限定的站点名查询,很容易匹配到美国境内其他同名地点,才会出现点位不在费城范围内的问题。 - 查询到坐标后直接对DataFrame整列赋值,每一次循环都会把全表所有行的经纬度覆盖为当前查询结果,最终所有条目只会保留最后一次查询返回的相同坐标。
另外你没有遵守Nominatim geocoder的请求频率要求(默认限制1次/秒),高频请求也可能导致服务返回异常结果。
修正后可运行代码
from geopy.geocoders import Nominatim import time geolocator = Nominatim(user_agent="philly_transit_station_geocoder") # 初始化经纬度空列 philly[["latitude", "longitude"]] = None station_coord_map = {} # 先对唯一站点名批量查询,避免重复请求相同地址 unique_stations = philly["station_name"].unique() for station in unique_stations: # 拼接地区后缀限定查询范围,避免匹配到异地同名点位 location = geolocator.geocode(f"{station}, Philadelphia, PA") if location: station_coord_map[station] = (location.latitude, location.longitude) # 加1秒间隔遵守接口频率限制 time.sleep(1) # 将查询到的坐标匹配回原表对应行,不会覆盖其他行数据 for idx, row in philly.iterrows(): s_name = row["station_name"] if s_name in station_coord_map: philly.loc[idx, "latitude"] = station_coord_map[s_name][0] philly.loc[idx, "longitude"] = station_coord_map[s_name][1] # 生成坐标元组列 philly["coordinates"] = list(zip(philly["latitude"], philly["longitude"]))
优化建议
- 用字典存储唯一站点的坐标结果再做匹配,比逐行查询效率高很多,尤其适合单站点重复出现多次的数据集。
- 如果仍有少量点位匹配偏移,可以给
geocode()方法传入费城的经纬度边界作为viewbox参数,强制接口优先返回边界范围内的匹配结果,准确率会更高。 user_agent字段不要用通用的my_user_agent,写清楚你的应用场景,能降低被接口拦截的概率。
内容的提问来源于stack exchange,提问作者FishyK
相关产品推荐
相关产品推荐

