使用R的osmar包下载OSM数据时出现XML解析错误求助
解决osmar包下载OSM数据时的XML解析错误
我之前也碰到过一模一样的错误,这些XML标签不匹配的报错说明你的请求没有拿到预期的OSM地理数据,反而收到了网页错误内容,大概率和OSM API的访问规则或者网络连接有关,给你几个可行的排查和解决步骤:
1. 给请求添加合法的User-Agent标识
OSM公共API要求请求必须附带明确的User-Agent,用来识别请求来源,没有这个标识很容易被服务器拦截或返回错误页面。你可以在get_osm里加上这个参数:
library(osmar) src <- osmsource_api() bb <- center_bbox(174.76778, -36.85056, 700, 700) # 替换成你的名称和邮箱,方便OSM团队联系(如果需要) ua <- get_osm(bb, source = src, user_agent = "YourName/1.0 (your.email@example.com)")
2. 检查OSM API的访问限制
OSM公共API有请求频率限制(默认每分钟最多60次请求),如果短时间内重复请求,可能会被临时封禁。可以先暂停10-15分钟再尝试,或者改用OSM的官方API端点,明确指定完整URL:
src <- osmsource_api(url = "https://api.openstreetmap.org/api/0.6/map")
3. 排查网络连接问题
- 先手动验证你的bbox对应的API链接是否能正常访问:把
center_bbox生成的范围转换成OSM API支持的bbox格式(比如计算后大概是174.762, -36.855, 174.773, -36.846),在浏览器打开对应链接,若能看到XML内容,说明网络本身没问题;若无法访问,可能需要检查代理或防火墙设置,在R中配置代理的代码示例:
# 替换为你的代理地址和端口 Sys.setenv(http_proxy = "http://your.proxy.address:port", https_proxy = "http://your.proxy.address:port")
4. 考虑换用更现代的osmdata包
osmar包已经很久没有更新,社区现在更推荐使用osmdata包,它对OSM API的支持更稳定、功能更灵活,实现相同需求的代码示例:
library(osmdata) # 生成范围相同的bbox bb <- getbb(center = c(174.76778, -36.85056), dist = 700) # 下载该范围内的所有OSM要素(可通过add_osm_feature筛选特定类型) osm_data <- opq(bbox = bb) %>% add_osm_feature() %>% osmdata_sf() # 查看结果 osm_data
内容的提问来源于stack exchange,提问作者La Cordillera
相关产品推荐
相关产品推荐

