tmaptools中read_osm函数报错:原因排查与修复咨询
问题描述
执行以下R代码时触发错误:
bg = read_osm(bb(c(min(lons)+0.5,min(lats)+0.2,max(lons),max(lats))), type='esri-topo')
错误信息:
java.lang.NullPointerException at edu.cens.spatial.RTileController.getTileValues(RTileController.java:109) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at RJavaTools.invokeMethod(RJavaTools.java:399) Error in osmtile(x%%nX, y, zoom, type) : could not obtain tile: 65 36 7
已加载tmaptools、tmap、rnaturalearth、raster、ncdf4库,lons与lats为指定数值向量,目标是获取指定区域地图但失败。
问题原因
- 目标瓦片不存在:ESRI地形地图(esri-topo)在缩放级别7下,编号为65/36的瓦片无数据,或该区域不在此地图服务的覆盖范围内。
- 边界框参数异常:计算后的边界框可能超出地图服务支持的坐标范围,或区域范围与自动匹配的缩放级别不兼容,导致请求了不存在的瓦片。
- Java交互问题:
NullPointerException说明rJava调用Java组件时出现空值传递,可能是Java环境配置不稳定,或参数传递过程中出现异常。
修复方法
- 调整边界框范围:检查
min(lons)+0.5和min(lats)+0.2的偏移是否合理,先尝试使用无偏移的原始边界框测试:
若正常,再逐步调整偏移量,确保请求区域在地图服务覆盖范围内。bg = read_osm(bb(c(min(lons),min(lats),max(lons),max(lats))), type='esri-topo') - 更换地图类型:如果esri-topo在目标区域无数据,切换为其他地图服务类型,比如:
# 使用OpenStreetMap bg = read_osm(bb(c(min(lons)+0.5,min(lats)+0.2,max(lons),max(lats))), type='osm') # 或使用ESRI卫星影像 bg = read_osm(bb(c(min(lons)+0.5,min(lats)+0.2,max(lons),max(lats))), type='esri-worldimagery') - 手动指定缩放级别:避免自动匹配的缩放级别请求不存在的瓦片,尝试调整zoom值:
bg = read_osm(bb(c(min(lons)+0.5,min(lats)+0.2,max(lons),max(lats))), type='esri-topo', zoom=8) - 修复Java环境:重启R会话,确保rJava正确加载;若问题持续,重新安装
tmaptools并检查Java环境配置是否正常。 - 验证边界框有效性:打印边界框数值确认坐标范围合理(经度-180180,纬度-9090),避免因计算错误传入无效参数:
target_bb = bb(c(min(lons)+0.5,min(lats)+0.2,max(lons),max(lats))) print(target_bb)
内容的提问来源于stack exchange,提问作者DonQUijote
相关产品推荐
相关产品推荐

