ArcGIS逆地理编码经纬度转邮编,大数据量触发JSONDecodeError
报错根因
Expecting value: line 1 column 1 (char 0) 的触发逻辑是程序收到的接口响应为空值/非JSON格式,无法完成JSON解析。结合运行特征(小数据集正常、千条以上数据即报错),核心诱因是触发了ArcGIS Online逆地理编码接口的访问限流。
ArcGIS Online公开接口对单用户的请求频率有严格限制,现有代码逐行发起独立逆地理编码请求,万级数据会产生高频密集请求,频率超过服务端阈值时,不会返回正常JSON结果,仅返回空响应或限流提示页,解析时必然触发上述错误。
该逻辑匹配已完成的排查结果:数据无空值、小数据量下请求频率低未触发拦截,因此运行正常。
修复方案
- 控制逐行请求的频率
逐行处理时,给每次调用增加随机间隔,将每秒请求数控制在接口允许范围内(单用户建议不超过5次/秒)。修改后的核心函数:import time import random def get_zip(df, lon_field, lat_field): # 随机等待0.2-0.5秒,降低请求频率 time.sleep(random.uniform(0.2, 0.5)) try: location = reverse_geocode( Geometry({ "x": float(df[lon_field]), "y": float(df[lat_field]), "spatialReference": {"wkid": 4326} }) ) return location['address']['Postal'] # 捕获解析异常,避免单条请求失败中断全流程 except Exception: return None - 用批量接口替代逐行请求
逆地理编码原生支持批量点位查询,无需逐行调用。直接将所有经纬度转为Geometry列表,使用batch_reverse_geocode一次性提交请求,万级数据仅需1次调用,从根源上避免触发限流,同时大幅提升运行效率。 - 修正代码语法疏漏
原GIS初始化代码缺失右括号,需补全:gis = GIS("http://www.arcgis.com", "username", "password")
内容的提问来源于stack exchange,提问作者chidinzerem
相关产品推荐
相关产品推荐

