十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

ArcGIS加载OSM数据报错?详解Load OSM File常见问题与排查方法

ArcGIS加载OSM数据报错?详解Load OSM File常见问题与排查方法 开篇我先说个场景你兴冲冲从 Geofabrik 或者 BBBike 上下载好了一个城市的 OSM 数据打开 ArcGIS找到 OpenStreetMap Toolbox双击 Load OSM File选好文件点 OK。结果没过几秒工具直接红脸报错要么提示无法读取文件要么报一串看不懂的 Schema 错误要么干脆让整个 ArcMap 卡死。这个工具箱本身是个好东西能帮你把 OpenStreetMap 的原始 XML 数据直接转成 ArcGIS 能用的要素类和属性表省去了写解析脚本的功夫。但它的报错信息向来不友善而且不同版本的 ArcGIS、不同来源的 OSM 文件、不同的输出设置踩坑的方式还都不一样。这篇文章我就围绕 Load OSM File 这个工具把我这几年在项目里遇到的错误、排查思路和解决办法一条一条整理出来。无论你是做城市规划分析、交通路网建模还是做应急制图只要需要把 OSM 数据落到 ArcGIS 里这篇文章应该能帮你省下大半天时间。1. 先搞清楚这个工具到底在干什么1.1 Load OSM File 不是简单的“导入”很多人第一次用 Load OSM File 的时候以为它跟“导入栅格”或者“加载 shapefile”是一个概念选个文件、指定输出位置就完事了。实际上这个工具做的事情要比“导入”复杂得多。OSM 的原始文件是 XML 格式里面记录的是节点node、路径way和关系relation这三类基本元素。节点是一对经纬度坐标路径是由若干个节点按顺序连成的折线或面关系则是把多个节点和路径组织成更复杂的对象比如公交线路、多边界的行政区等。Load OSM File 要做的事情就是解析这个 XML 结构把几何信息转换为 ArcGIS 的要素类同时把 OSM 标签tag里的键值对转换成属性字段。正因为它的核心是“解析 XML 并构建几何”所以对 OSM 文件的完整性、XML 结构规范性、节点引用关系都有要求。很多错误不是出在 ArcGIS 本身而是在于文件里的 XML 结构跟工具的预期不一致。比如某个 way 引用了不存在的节点、某个关系定义有交叉或者文件在下载过程中被截断了这些都会导致工具在解析到一半的时候报错。明白这一点后你再看到那些“奇奇怪怪”的错误提示就不会觉得完全摸不着头脑了。1.2 这个工具箱从哪里来、装在哪里ArcGIS 的 OpenStreetMap Toolbox 并不是 ArcGIS 安装包自带的它是由 Esri 在 ArcGIS Online 上发布的一个免费工具箱需要单独下载。下载之后是一个.tbx文件里面包含了 Load OSM File 和 Download OSM File 这两个工具前者就是本文的主角后者用于从 OSM 服务直接拉取数据。下载完成后你需要在 ArcMap 里通过 Catalog 窗口把它添加到工具箱列表中或者直接打开.tbx文件。实际操作中很多人遇到“找不到工具”或者“工具按钮置灰”的问题并不是 Load OSM File 本身出错而是工具箱没加载成。我见过一个比较典型的场景用户把下载的.tbx文件放在了一个中文路径下或者放在了一个没有写入权限的目录里结果 ArcGIS 每次启动都加载失败工具箱在目录里显示一个红叉。这时候你根本到不了“Load OSM File 报错”这一步因为它压根就没加载进当前会话。所以遇到工具神秘失踪的情况先检查工具箱文件的位置把它拷到纯英文路径下再重新添加一次九成能解决。这个小前提很重要。因为后面所有排查步骤都是建立在你已经能正常打开工具箱、工具能弹出参数窗口的基础上的。2. 错误发生前的必要准备2.1 数据源与文件格式的坑我怀疑有相当一部分“Load OSM File 错误”问题根本不在工具本身而在输入文件上。最常见的一个坑是文件格式选错了。OSM 官方输出的原始数据格式主要有两种.osmXML 格式和.osm.pbf二进制压缩格式。Load OSM File 只认前者也就是 XML 格式的.osm文件。很多下载页面默认提供的是 PBF 文件因为它体积小、加载快、效率高。你要是把.osm.pbf直接改个后缀名变成.osm工具当然读不了因为文件头完全不是 XML。PBF 文件需要先用工具转换成 XML 格式才能使用。推荐的转换工具是Osmosis这个库提供了一个命令行工具可以很方便地从 PBF 中提取或转换数据。如果你对命令行不熟也可以使用 QGIS 里的OSM Tools插件或者用GDAL的ogr2ogr命令来做格式转换。第二个坑是文件来源渠道不同内容完整性也不一样。Geofabrik 网站下载的区域包通常比较规范因为它是定期从 OSM 数据库切片生成的。而有些第三方下载器或者自制抓取工具下载的 OSM 文件在下载过程中可能遇到网络中断导致文件不完整。这种不完整的文件XML 标签没有闭合加载时经常报出“Unexpected end of file”之类的解析错误。所以我一般建议优先使用 Geofabrik 或 BBBike 等成熟下载源下载完成后顺手用文本编辑器打开文件末尾确认一下是不是以/osm结尾。如果文件是几百 MB 的大文件就用编辑器附带的“大文件模式”打开直接跳转到文件末尾查看就行。这个检查动作只需要一分钟但能避免很多无谓的排错。2.2 输出位置与数据模型选择Load OSM File 工具的第二个常用参数是输出要素数据集Output Feature Dataset。这个参数一旦选错也会立刻报错。注意这里说的是“要素数据集”不是普通的“要素类”。该工具会把 OSM 数据转换成三个要素类点、线、面分别存放 OSM 中的节点、路径和闭合多边形。这三个要素类必须放在同一个要素数据集里才能保证它们共享同一个坐标系和空间范围。所以如果你在输出参数里选择了一个普通的文件地理数据库.gdb路径或者选择了一个空文件夹却想让它直接生成要素类工具通常会有限制。你需要在文件地理数据库中先建好一个要素数据集然后再在 Load OSM File 工具里指定这个要素数据集作为输出位置。另外一个很多人不太注意的选择是Storage Type参数。这个参数决定了解析后的数据存储方式常见的有针对文件地理数据库和网络数据集Network Dataset的选项。如果你的数据只是用于普通绘制和分析直接使用默认的 NDS 类型即可。要特别注意当你选择 NDS 类型时工具会在输出数据集里额外生成一个网络数据集为后续的网络分析做准备。如果只是做简单地图展示这个额外的生成过程既耗时又容易因为投影或数据质量问题报错反而增加了出错的概率。我自己的经验是当只想预览数据或做简单的缓冲区分析时选择普通的要素类存储方式就够了跑起来快、出错少。提示先用小范围的 OSM 文件测试输出设置是否合理再处理大文件。这是一个性价比极高的习惯。3. 一步一步的排查流程3.1 第一步快速判断错误的类型遇到 Load OSM File 报错时建议不要直接百度报错原文而是先对错误类型做一个粗分类。我目前的经验是这个工具报错基本可以归为三类参数类错误、文件解析类错误、资源类错误。参数类错误指的是你在界面里选的东西本身就不对比如输出位置不存在、坐标系定义有问题、Storage Type 和输出类型不匹配。这类错误出现得最快通常一运行立刻弹窗提示也比较直白例如“Invalid output location”“The output feature dataset does not exist”等。解决方式就是检查参数设置。文件解析类错误是出现频率最高的类型。工具在解析 XML 时发现问题比如某个节点编号超出范围、某个 way 的节点引用缺失、某个 tag 字段类型跟目标字段冲突等会有各种不同的报错文本比如“Failed to parse OSM file”“There was an error creating features”等。这类错误排查起来需要点技巧后面我会单独讲。资源类错误则跟你的电脑配置和数据量有关。处理几百 MB 甚至几个 GB 的 OSM 文件对内存的要求很高工具在解析过程中会构建大量临时对象内存不够就容易报出OutOfMemory或者“Not enough storage is available”之类的错误。这类错误通常跟数据量呈正相关数据越大越容易触发。判断完类型后排查方向就清晰了。参数类错误去改参数文件解析类错误去检查数据资源类错误去优化配置和环境。3.2 第二步从最简单场景开始验证排查这类工具错误时我特别喜欢用“最小化验证”的方法也就是用一个尽可能小的文件、最简单的输出配置去跑一遍确认工具本身没问题后再逐步加大数据量、增加复杂性。这个思路跟程序员调试代码是一模一样的。具体操作是这样的你先去 Geofabrik 下载一个小城市的 OSM 文件或者用osmium工具从大文件里抽取一小块矩形范围内的数据得到一个只包含几千个节点、几十个 way 的小文件。然后打开 Load OSM File输入这个小文件输出位置选择你新建好的文件地理数据库Storage Type 选择默认项跑一下。如果小文件跑通了说明工具箱和输出位置没问题问题大概率出在你原本那个大数据文件的解析上。如果小文件都跑不通那就要去看工具箱本身是否完整、ArcGIS 版本是否兼容、输出要素数据集是否建立正确。这个方法虽然听起来简单但能帮你节省大量时间。因为在实际项目中你往往只有一个几 GB 的大文件等工具跑上十几分钟才报错再去看日志、找原因非常浪费精力。先用小文件把所有参数和设置调通再跑大数据文件是更明智的选择。3.3 第三步处理大文件的内存和路径问题当你确认小文件没问题但大文件还是会报错或异常卡死时多半是资源类问题。Load OSM File 在处理大文件时会把整个文件读入内存解析然后构建要素集合。对于几个 GB 大小的 OSM 文件这个内存消耗通常会达到物理内存的 2 到 3 倍。举个例子一个 2GB 的 OSM 文件解析过程可能需要 6GB 甚至更多内存。如果你的计算机物理内存只有 8GB操作系统很容易在工具运行到一半时回收内存导致 ArcGIS 异常退出或模拟出内存不足的错误。解决思路有几种。第一关闭其他占用内存比较大的程序比如浏览器、视频播放器等给 ArcGIS 腾出更多可用内存。第二在 ArcGIS 中开启后台处理和异步运行这样即便工具长时间运行也不会导致界面卡死。第三也是比较有效的一种方式把大的 OSM 文件先切片处理分成几个小文件分别 Load 到同一个要素数据集里最后再用 Merge 工具合并。这样虽然多了一步操作但能显著降低单次运行的内存压力。另外路径问题也容易被忽视。ArcMap 本身对路径长度有限制如果输出路径太长比如放在一个深层的文件夹下或者文件夹名太长也会导致工具在创建要素类时失败。我建议把工作目录尽量精简到纯英文短路径比如D:\GIS\osm_test这样的层级不要用含有空格、中文或特殊字符的路径。这听起来是个小细节但能避开一大堆隐藏问题。4. 几个常见错误和对应解法4.1 提示“Failed to create feature dataset”这个错误在 Load OSM File 的报错中非常常见翻译过来就是“无法创建要素数据集”。但注意这个错误的原因往往藏在参数设置里。出现这个报错时我的第一反应是检查输出位置的权限。工具要在一个文件地理数据库中创建新的要素数据集如果该数据库文件的属性是只读的或者该路径位于没有写入权限的系统目录下就会报这个错。你可以试着手动在 ArcCatalog 里创建一个新的要素数据集如果手动创建也失败那基本可以确认是权限问题。解决方法是把工作目录移到一个纯写入权限的位置比如D:\下的某个文件夹。还有一种情况输出位置本身是一个 shapefile 文件夹或者个人地理数据库.mdb这些格式不支持要素数据集也会导致同样的错误。Load OSM File 要求输出位置必须是一个文件地理数据库.gdb或企业级地理数据库因为它需要在一个统一的数据库中管理三个要素类及其几何关系。如果你只有一个 shapefile 文件夹建议先将输出位置改为文件地理数据库。另一个容易忽略的原因是坐标系冲突。输出要素数据集在创建时需要确定自己的坐标系。如果你的输入文件是原始经纬度坐标WGS84而输出要素数据集却被设置成了别的坐标系工具在创建过程中可能会出现坐标系继承或转换的冲突进而报错。解决办法是如果输出数据集不存在就让它自动创建并把坐标系显式设置为 WGS84如果输出数据集已经存在那就确保它的坐标系与你的预期一致。4.2 提示“Schema ... ”或“Invalid OSM file”这一类报错通常是最让人头疼的因为提示信息里经常带着“Schema”字样或者一些 XML 解析细节看起来像程序内部错误。其实这类报错的根源大多在输入文件本身。先说“Invalid OSM file”。这个提示通常出现在你选了一个不是 OSM XML 格式的文件或者文件扩展名是.osm但内容根本不是 XML。我遇到过有人把.pbf文件重命名成.osm然后直接加载工具根本不认识文件头报的就是这个错。解决办法很简单确保输入的文件是真正的 XML 格式可以用文本编辑器打开看一眼如果开头是osm version0.6 ...之类的 XML 声明就没问题。如果开头是乱码或者二进制内容那文件格式就错了。再说“Schema”相关的错误。这种情况下文件本身是 OSM XML但文件里面出现了工具不认识或者无法处理的元素。比如某些 OSM 文件可能包含版本较老或框架扩展的标签而当前工具版本无法识别或者某些 way 引用的节点 ID 在文件中不存在导致无法构建几何。解决思路是先用小文件测试如果小文件没问题而大文件报 Schema 错误那很可能是大文件里包含了一些小文件里没有的特殊对象。这时候可以尝试用osmfilter或osmium等工具对文件进行清理过滤掉没有节点引用的 way或者只保留需要的标签再重新加载。注意永远不要直接修改 OSM 文件里的 XML 内容来“修复”它除非你非常确定自己在做什么。XML 里的节点 ID 是全局唯一的引用标识随意更改会导致更多解析错误。正确的做法是用专业工具做文件预处理。4.3 OutOfMemory 异常和长时间无响应处理大 OSM 文件时最常见的技术障碍就是内存不足和界面卡死。前面我已经提到了一些处理方法这里再补充几个实操层面的细节。第一建议不要直接用 32 位版的 ArcMap。ArcMap 有 32 位和 64 位两个版本如果你安装的是 32 位版本它能使用的内存上限通常只有 2GB 或 4GB这在处理大型 OSM 数据时是远远不够的。我建议使用 64 位版本的 ArcGIS 或者升级到 ArcGIS Pro64 位环境下内存管理更高效出问题的概率也低很多。第二在运行工具前先给 ArcGIS 设置更大的缓存空间。你可以在 ArcMap 的“地理处理”选项里调整“后台处理”和“临时文件夹”的设置把临时文件路径指向一个空间充足的磁盘同时启用后台处理这样界面就不会完全卡死任务运行过程中你还能查看进度。第三如果文件实在太大超出了单机处理能力建议采用分块处理策略。具体操作是用osmium或osmconvert工具按矩形范围bounding box把你的大文件切分成多个小文件然后分别加载。切分时要注意相邻图块之间增加一点重叠区域避免后续拼接时出现路径断裂问题。每个小文件加载到同一个要素数据集后可以用 ArcGIS 的Merge工具把要素类合并成完整的数据集。这种分块策略在处理全国甚至全球数据时几乎是必须的否则即使工具不报错单个要素类的体量也可能大到你后续做任何分析都要等半天。5. 实战技巧与扩展建议5.1 加载完成后如何检查数据质量工具运行成功后里面赫然多了几个要素类很多人就以为大功告成了。但我建议你做一个轻量的数据质量检查因为 Load OSM File 在转换过程中并不保证所有 OSM 元素都能完美转换成有效的 ArcGIS 要素。第一个检查点是几何有效性。你可以在 ArcMap 里打开属性表用“编辑器”工具检查要素类中是否存在 null 几何或空几何要素。OSM 中有些 way 只有一两个节点比如孤立的小路口ArcGIS 在构建线要素时可能因为节点不足而跳过它们导致某些要素丢失。你可以用检查几何工具Check Geometry快速找出这些问题。第二个检查点是拓扑一致性。OSM 数据本身是由全球网友共同编辑的数据质量参差不齐你下载的数据集中可能存在道路断头、自相交等拓扑错误。这些错误在加载后依然存在会影响你后续做网络分析或缓冲区分析。针对这种情况建议在运行 Load OSM File 之后再用 ArcGIS 的拓扑工具Topology做一次要素类自相交检查必要时手动修整。第三个检查点是属性字段。OSM 的标签是自由填写的同一个键在不同区域可能使用不同的值。比如highway标签有的地方用primary有的地方用trunk有的地方可能拼成principal。加载后这些值会出现在属性表中如果你要按字段值做符号化或查询分析建议先做一次字段值分类统计看看数据里到底有哪些值做到心里有数。5.2 与 PBF、GeoJSON 等格式的衔接虽然本文主要讲的是.osm文件的加载但实际项目中你会发现很多第三方工具导出的数据可能是.pbf或.geojson格式。如果你现在手里的是.geojson那加载到 ArcGIS 就简单多了ArcGIS 原生支持 GeoJSON 文件拖拽导入。如果是.pbf建议用ogr2ogr命令把它转换成 GeoJSON 或 shapefile 后再载入 ArcGIS而不是硬着头皮去改扩展名。举个例子你从某个开放数据平台下载了一份全国道路网数据格式是.pbf用地软件打不开。用ogr2ogr执行下面这行命令就能把它转成 GeoJSONogr2ogr -f GeoJSON roads.geojson roads.osm.pbf转出来的 GeoJSON 文件可以直接拖进 ArcGIS Pro或者用转换工具 转为要素类导入 ArcMap。这个方法虽然多了一步但效果稳定而且不依赖 ArcGIS 自带的 Load OSM File 工具节省了大量的内存和兼容性问题。如果你需要保持要素类和属性字段的完整性也可以把它转成 shapefile 或文件地理数据库。另外如果你需要在 QGIS 和 ArcGIS 之间来回切换处理 OSM 数据我见过不少用户直接用 QR 工具QuickOSM在 QGIS 里提取数据然后导出成 GeoPackage 或 shapefile再拿到 ArcGIS 里继续分析。这个流程比在 ArcGIS 里硬啃 OSM XML 要顺畅得多。我的建议是不要拘泥于某一种工具只要能达到最终目标多学一种格式转换手段并没有坏处。5.3 我在多次实战后的小体会说实话用 Load OSM File 加载 OSM 数据就像开一台老式手动挡车你需要先熟悉它的脾气掌握好换挡时机才能顺畅起步。这个工具本身并不复杂但它依赖的上下游因素太多了文件格式、数据质量、内存配置、输出位置、坐标系定义、路径设置每一个环节都可能成为瓶颈。我自己的使用习惯是凡是从网上下载的 OSM 文件先做三件事一是检查文件是否完整二是确认格式是 XML 而不是 PBF三是先用小文件试跑一遍工具参数。这三件事看着繁琐其实加起来也就不到五分钟却能避免我后面在处理大文件时遇到各种莫名其妙的报错。另外如果加载失败且实在找不到原因不要在一个方案上死磕。你有几条退路第一用 QGIS 的 OSM 插件加载同一个文件再导出成 shapefile 或 GeoPackage第二用osmium命令行工具清洗文件后再回到 ArcGIS 加载第三直接下载已经处理好的 shapefile 或 GeoJSON 格式的地理数据网上有许多基于 OSM 数据制作并定期更新的成品数据包。条条大路通罗马工具只是手段数据的最终价值在于你能用它解决实际问题。最后再分享一个小技巧吧如果你在 Load OSM File 工具的日志窗口里看到了具体的 XML 行号或节点 ID不要忽略它把它记下来。虽然工具不会自动修复问题但这行提示能帮你定位到数据中的可疑对象。你可以用文本编辑器的搜索功能直接跳到那个节点或 way 的位置看看它到底有什么异常。我在一次处理某城市路网数据时就靠这个方式找到了一个自相交的环岛对象手动修掉之后加载就顺利通过了。希望这篇文章能帮正在跟 Load OSM File 较劲的你省下一些时间。如果你在实操中遇到了我没提到的错误可以先试试最小化验证的方法把小文件跑通再一点点排查大文件的问题——这个思路基本能覆盖九成以上的工具故障。
返回列表