OSMNX忽略查询失败元素及Geo编码相关问题求助
核心需求
使用OSMNX库从OpenStreetMap获取2000个地点的行政边界,地点列表来自本地表格。
遇到的问题及对应解决方法
1. 批量查询遇失败项直接中断
使用ox.geocoder.geocode_to_gdf(thelist, which_result=1, by_osmid=False)批量查询时,只要有一个地点查询失败就抛出Insufficient Response Error,无法继续处理后续地点。
解决方法:
放弃批量接口,手动循环每个地点,用try-except捕获错误并跳过失败项:
import osmnx as ox import geopandas as gpd import pandas as pd # 加载地点列表 dat = pd.read_excel('oren.xlsx') lists = dat['Населённый пункт'][dat['Сроки'] == "-"].unique() thelist = lists.tolist() # 初始化空的GeoDataFrame gdf_total = gpd.GeoDataFrame() for place in thelist: try: # 单个地点查询 gdf_single = ox.geocoder.geocode_to_gdf(place, which_result=1, by_osmid=False) # 仅保留行政边界所需的多边形/多多边形类型 gdf_single = gdf_single[gdf_single.geometry.type.isin(['Polygon', 'MultiPolygon'])] # 合并到总结果 gdf_total = pd.concat([gdf_total, gdf_single], ignore_index=True) except Exception as e: # 打印错误信息并跳过当前地点 print(f"查询地点{place}失败: {str(e)}") continue # 保存最终结果 gdf_total.to_file('行政边界结果.gpkg', driver='GPKG')
2. features_from_place返回非多边形元素
调用gdf = ox.features_from_place("Оренбургская Область", tags)时,返回了点、线等非多边形元素,与文档描述的仅返回多边形不符。
原因:
当features_from_place传入tags参数时,会查询指定区域内所有匹配标签的OSM元素,而非仅地点边界的多边形。文档中"仅返回多边形"的描述,仅针对直接查询地点名称(不指定tags)的场景。
解决方法:
查询后过滤出仅包含Polygon或MultiPolygon的几何类型:
gdf = ox.features_from_place("Оренбургская Область", tags) # 过滤出多边形类型的元素 gdf_polygons = gdf[gdf.geometry.type.isin(['Polygon', 'MultiPolygon'])]
3. 传入地点列表调用features_from_place报错
调用gdf2 = ox.features_from_place(thelist, {'addr:region':'Оренбургская Область'})时,抛出TypeError: Nominatim could not geocode query 'Чабла' to a geometry of type (Multi)Polygon。
原因:
该地点在OSM中仅被标记为点(Node)而非多边形(Polygon/MultiPolygon),features_from_place要求查询的地点必须能解析为多边形边界。
解决方法:
- 采用第1点中的循环+
try-except方法,跳过无法解析为多边形的地点 - 若需要保留这些点的位置,可单独查询点数据,后续通过生成缓冲区等方式模拟边界,或手动补充缺失的边界数据
4. OSM ID查询失败
调用ox.geocoder.geocode_to_gdf('W366775538', which_result=1, by_osmid=True)时,Nominatim提示找不到该ID,但该ID在OSM网站存在。
原因:
Nominatim对OSM ID格式要求严格,W开头为Way类型ID,但by_osmid=True时需传入纯数字ID;另外部分Way元素无法被Nominatim识别为可地理编码对象,此时建议使用Overpass查询。
解决方法:
方法一:使用纯数字ID查询
# 传入纯数字ID,自动识别Way类型 gdf = ox.geocoder.geocode_to_gdf(366775538, by_osmid=True, which_result=1)
方法二:用Overpass直接查询Way元素
import osmnx as ox way_id = 366775538 # 通过Overpass查询指定Way的几何数据 gdf = ox.features_from_place(f"way/{way_id}", tags={})
内容的提问来源于stack exchange,提问作者Sarkis Sulyan

