郑州市OSM道路数据处理全流程:从原始下载到SHP、3DTiles转换实战
简介本资源为郑州市OpenStreetMapOSM道路矢量数据集经清洗与格式标准化处理专为GIS初学者、城市规划研究者及交通分析从业者设计可直接用于空间可视化、路网密度计算、最短路径分析、多源数据叠加如人口分布、公交站点等典型应用场景。压缩包共9个文件含核心Shapefile组件.shp道路线几何、.dbf含道路等级/名称/方向等属性、.prjWGS84坐标系定义、.cpg中文编码支持、.shx/.sbn/.sbx索引加速读取及.shp.xml元数据文件并附关键参考图《郑州市道路数据OSM类别对照表.jpg》帮助准确解译OSM标签体系。资源大小仅4.49MB轻量易用适配QGIS、ArcGIS等主流平台。目前已有394人学习下载开箱即用无需额外处理即可开展教学演示、课程设计或科研预研工作。1. 项目背景与数据价值最近在做一个关于城市交通网络分析的课题需要用到郑州市的道路矢量数据。找了一圈发现OpenStreetMapOSM是获取这类数据最直接、最开放的来源。OSM的数据质量参差不齐直接下载下来的原始数据往往包含大量冗余信息比如各种非道路的要素、属性字段混乱、几何拓扑错误等对于直接进行空间分析来说需要经过相当复杂的清洗和处理流程。这让我想起了之前处理其他城市数据时光是清理拓扑错误、统一道路分级就花了好几天时间。所以这次我决定把处理郑州市OSM道路数据的过程完整记录下来并且把处理好的、干净可用的数据分享出来。如果你也在做城市规划、交通模拟、GIS分析或者WebGIS可视化比如想尝试把shp转成3DTiles放到Cesium里这份“开箱即用”的数据应该能帮你省下不少前期准备的时间。这份“郑州市OSM道路矢量数据已处理”的核心价值就在于它完成了从原始OSM数据到专业GIS分析可用数据的转换。我不仅下载了数据还进行了坐标转换、数据裁剪、属性筛选、拓扑检查与修复、道路分级重分类等一系列操作最终生成了标准的ShapefileSHP格式。你拿到手后可以直接用ArcGIS、QGIS等软件打开进行分析或者进行进一步的格式转换比如转GeoJSON、转CAD的DXF或者尝试shp转3DTiles而无需再纠结于数据预处理的各种坑。2. OSM数据获取与原始数据处理获取OSM数据有多种途径对于城市级别的数据我通常推荐两种高效的方式通过QGIS插件下载或者使用Geofabrik等网站提供的区域提取服务。考虑到我们需要的是郑州市的道路数据并且希望获取的属性尽可能完整我选择了使用QGIS的“QuickOSM”插件。首先你需要在QGIS中安装并启用“QuickOSM”插件。安装完成后在插件菜单里找到它。关键的一步在于查询语句的构建。OSM数据是基于标签keyvalue系统组织的道路数据主要存在于highway这个标签下。为了获取郑州市所有的道路我的查询语句核心是“highway” IN (“motorway”, “trunk”, “primary”, “secondary”, “tertiary”, “unclassified”, “residential”, “motorway_link”, “trunk_link”, “primary_link”, “secondary_link”, “tertiary_link”, “living_street”, “service”, “pedestrian”, “track”, “bus_guideway”, “escape”, “raceway”, “road”, “footway”, “bridleway”, “steps”, “path”, “cycleway”)。这个列表几乎囊括了OSM中所有被标记为道路的要素类型从高速公路到人行小道。但是直接以郑州市的名义去查询可能会因为边界定义不精确而漏掉部分数据。更稳妥的做法是先获取郑州市的行政边界。我通过一些公开的GIS数据平台找到了郑州市的行政区划Shapefile文件。在QGIS中加载这个边界文件后使用QuickOSM插件选择“按多边形提取”功能将上述查询语句和郑州市的边界多边形结合起来。这样插件会自动下载并裁剪出完全落在郑州市范围内的所有道路要素。下载下来的数据QGIS通常会以GeoPackage或临时图层的形式加载。原始数据包含的字段非常多比如osm_id,name,highway,maxspeed,lanes,surface,bridge,tunnel等等其中很多字段存在大量空值。而且几何类型可能是LineString或MultiLineString。第一步我使用QGIS的“修复几何”工具处理潜在的几何错误比如自相交、重复节点等。然后利用“矢量”-“数据管理工具”-“合并矢量图层”功能如果存在多种几何类型先将它们合并。接着最关键的一步是坐标系统一。OSM数据使用的坐标系是WGS84EPSG:4326这是地理坐标系。在进行长度、面积计算或与许多国内底图叠加时我们通常需要投影坐标系。对于郑州市我选择使用“CGCS2000 / 3-degree Gauss-Kruger zone 38”EPSG:4547这是一个适用于该区域的投影坐标系能保证距离测量的相对准确性。使用“投影”工具完成坐标转换。注意在下载和处理过程中网络稳定性很重要。有时QuickOSM插件会因超时导致下载失败如果遇到这种情况可以尝试将郑州市边界拆分成几个小块分多次下载最后再合并。另外OSM数据是众包数据其完整性和准确性在不同区域可能有差异市中心通常很详细而新兴城区或偏远地区可能缺失这需要在后续分析中留意。3. 数据清洗、裁剪与属性优化拿到投影后的数据我们得到的仍然是覆盖范围可能略大于郑州市边界的全部道路线。第二步是精确裁剪。使用QGIS的“矢量”-“地理处理工具”-“裁剪”工具输入图层是道路数据覆盖层是郑州市边界多边形。这一步确保了每一条道路线段都被严格限制在郑州市的行政边界之内边界处道路会被精确切断。裁剪之后的数据量依然庞大属性杂乱。我们需要进行属性字段的筛选和优化。原始OSM属性有几十个但大部分对于常规的道路网络分析并非必需。我保留了对分析最有价值的几个核心属性并进行了标准化处理fclass(道路分类)这是最重要的字段。原始的highway标签值过于细致我根据中国的道路设计规范和通用分析习惯将其重分类为几个大类高速路包含motorway,motorway_link。快速路/主干道包含trunk,trunk_link,primary,primary_link。在实际中trunk和primary在国内城市常对应城市快速路和主干道。次干道对应secondary,secondary_link。支路对应tertiary,tertiary_link。城市内部道路包含residential,living_street,unclassified,service。这些道路构成了城市内部的毛细血管网。步行与自行车道包含pedestrian,footway,cycleway,path,steps。 我使用QGIS的“字段计算器”新建了一个fclass字段通过CASE WHEN语句根据highway字段的值进行赋值。例如CASE WHEN “highway” IN (‘motorway’ ‘motorway_link’) THEN ‘高速路’ … END。这样后续分析中就可以直接按大类进行符号化或统计。name(道路名称)直接保留OSM中的name标签。对于没有名称的道路如一些小区内部路该字段为空。maxspeed(限速)保留maxspeed字段。注意其值可能是数字如60也可能是字符串如60 km/h。我进行了一次清理尝试提取数字部分并统一单位为km/h。对于空值保持为空这在实际分析中代表限速未知。lanes(车道数)保留lanes字段并尝试将字符串值转换为整数。同样空值代表未知。oneway(单行道)这是一个布尔型或字符串型字段常见值为yes、no、-1反向等。我将其统一处理为文本型的是或否便于理解。bridge(桥梁)和tunnel(隧道)这两个字段标记道路段是否为桥梁或隧道部分。我将其处理为简单的是/否标志。处理完属性后我删除了所有其他不必要的字段使数据表变得非常清爽。接下来是拓扑检查。道路网络应该是连接的但OSM数据中常存在一些微小的悬挂节点即一条路的端点没有连接到任何其他路或者重复的线段。我使用QGIS的“拓扑检查器”插件设置规则如“不能有悬挂点”允许一定容差比如1米和“不能有重复的要素”。对于发现的错误手动或半自动地进行修复比如捕捉节点到附近道路的端点删除重复线。这一步对于后续进行网络分析如路径规划至关重要能避免因数据拓扑错误导致分析中断或结果异常。4. 最终成果SHP文件的结构与使用经过上述步骤我们得到了一个干净、规整的郑州市道路矢量数据集。我将其导出为标准的Shapefile格式因为它仍然是GIS领域最通用、支持最广泛的交换格式之一。一个完整的Shapefile实际上由多个文件组成.shp存储几何图形这里是折线的主文件。.shx几何图形的索引文件用于快速定位。.dbf存储属性数据的数据库文件里面就是我们整理好的fclass、name等字段。.prj存储坐标投影信息的文本文件。这里记录的是CGCS2000 / 3-degree Gauss-Kruger zone 38的WKT定义。.cpg可选文件用于指定.dbf文件的字符编码如UTF-8。这里有一个常见坑点如果你在导出SHP时没有生成.cpg文件或者用某些软件如旧版ArcGIS打开时出现中文乱码那是因为默认编码可能不是UTF-8。你可以在QGIS导出时在“编码”选项中选择“UTF-8”这样通常会生成.cpg文件。如果手动处理可以用记事本创建一个名为你的文件名.cpg的文本文件里面只写一行UTF-8然后和.shp等文件放在一起。这份处理好的数据你可以直接用于多种场景在ArcGIS或QGIS中可视化与分析加载SHP文件可以根据fclass字段进行分级设色快速得到郑州市道路等级图。可以进行密度分析、缓冲区分析、网络分析等。数据格式转换正如网络热词中提到的你可以用ArcGIS Toolbox或专门的转换工具如ogr2ogr命令行工具将其转换为GeoJSON用于Web地图转换为DXF用于CAD软件甚至探索使用工具如Cesium ion或py3dtiles将SHP转换为3DTiles用于三维数字孪生场景。与其他数据集成你可以将道路数据与郑州市的POI兴趣点、行政区划、人口数据等进行叠加分析研究城市结构。提取子集如果你只需要某个区如金水区的道路可以使用ArcGIS的“按属性选择”或“按位置选择”功能或者使用“分割矢量图层”工具进行批量提取。实操心得在处理“oneway”字段时要特别小心。OSM中“onewayyes”表示车辆只能沿着数字化方向行驶。但在实际网络分析中你需要根据分析工具的要求来设置。例如在ArcGIS Network Analyst中你需要根据方向设置“限制”属性。另外道路名称的缺失在郊区很常见如果分析对道路名称有强依赖可能需要结合其他数据源进行补全。5. 从SHP到其他格式应对常见需求很多朋友拿到SHP数据后下一步就是想把它转换成自己工作流需要的格式。结合热搜词我针对几个常见需求分享一下我的方法和遇到的坑。5.1 SHP转GeoJSON / 转DXF这是最常规的操作。在QGIS中右键点击图层选择“导出”-“另存要素为…”在格式中选择“GeoJSON”或“DXF”即可。对于GeoJSON务必确保编码选择“UTF-8”以保留正确的中文。对于DXF需要注意版本如AutoCAD R14或更新以及如何映射属性字段到DXF的扩展数据或文本标签。一个更强大且可批处理的方法是使用GDAL的ogr2ogr命令行工具。例如在命令行中确保已安装GDAL# 转换SHP到GeoJSON ogr2ogr -f “GeoJSON” zhengzhou_roads.geojson zhengzhou_roads.shp -t_srs EPSG:4326 # 如果需要转回WGS84 # 转换SHP到DXF ogr2ogr -f “DXF” zhengzhou_roads.dxf zhengzhou_roads.shp使用命令行工具的优势是可以写脚本批量处理多个文件效率极高。5.2 SHP转3DTiles用于三维可视化这是当前的一个热点尤其是想构建三维城市场景。将二维道路SHP直接转为具有高度的3DTiles模型通常需要为道路赋予一个高程值可能是常数或来自DEM地形数据。目前没有一键式的完美工具但有几个探索方向使用Cesium ionCesium官方的ion平台提供上传GIS数据包括SHP并发布为3D Tiles的服务。你需要将SHP文件打包成ZIP上传。ion会自动将其拉伸为具有一定高度的白色3D模型。你可以指定一个基础高度和拉伸高度。这种方法最简单但高度是统一的且模型细节较简单。使用Py3dtiles库这是一个开源Python库。你需要先将SHP转换为具有高度属性的GeoJSON或GLTF模型然后使用py3dtiles进行转换。这需要一定的编程能力。基本思路是用GIS软件或脚本为每条道路线段添加一个“height”字段比如根据道路等级设定不同高度然后将线段转换为三角网格面再导出为GLTF或直接使用py3dtiles的转换器。在建模软件中处理如热搜词提到的“su怎么导入shp”指的是SketchUp。你可以使用SketchUp的GIS相关插件如“Placemaker”或“Import Shapefile”插件将SHP作为二维底图导入然后手动或通过脚本将其推拉成三维道路模型最后再导出为其他格式或通过工具转为3DTiles。这种方法更灵活可以设计更美观的模型但手工工作量巨大。踩坑提示3DTiles转换的核心挑战在于“体量化”。道路是线而3DTiles通常是三角网格体。你需要决定道路的宽度、高度和横截面形状。一个取巧的办法是在GIS中先用“缓冲区”工具将道路线转成面根据fclass设定不同宽度然后再将这个面数据赋予高度进行转换。这更接近真实的三维道路。5.3 处理SHP文件乱码与CPG文件正如前文所述中文乱码问题十有八九是编码问题。如果你从别处拿到一个SHP用ArcGIS打开发现属性表中文是乱码但用QGIS打开却正常或反之首先检查是否存在.cpg文件。如果没有尝试以下方法在QGIS中修复用QGIS打开该SHP在图层属性-源信息中查看编码。尝试不同的编码如GBK、GB2312、UTF-8直到显示正常。然后右键图层导出在导出时明确选择正确的编码如UTF-8并勾选“创建空间索引”等选项生成一套新的、带正确.cpg的文件。在ArcGIS中修复较新版本的ArcGIS Pro对UTF-8支持较好。如果乱码可以尝试使用“转换工具”-“转出至地理数据库”将SHP导入File GeodatabaseFile Geodatabase内部使用UTF-8通常能解决乱码。然后再从GDB中导出为SHP。手动创建CPG直接创建一个同名的.cpg文本文件内容写UTF-8或GBK与.shp放在同一目录。5.4 批量处理与分割SHP“渔网分割shp”和“arcgispro怎么把shp拆分”指向同一个需求将一个大范围的SHP文件按规则分割成多个小文件。这在数据分发或并行处理时很有用。渔网分割在ArcGIS中可以先创建一个“渔网”Fishnet工具生成覆盖研究区域的规则网格面。然后使用“空间连接”或“按位置选择”工具将道路要素归属到每个网格。最后使用“分割”工具ArcToolbox - 分析工具 - 提取 - 分割输入道路数据分割字段选择网格ID即可批量输出。按属性分割如果你想按行政区划如郑州市内各个区来分割道路数据而你的道路数据属性表里没有区划信息就需要先进行“空间连接”将区划名称连接到每条道路上。然后使用“分割”工具分割字段选择区划名称。在QGIS中可以使用“处理工具箱”中的“分割矢量图层”工具直接按选定的属性字段进行分割非常方便。对于“批量把多个shp转为cad”可以编写一个Python脚本利用arcpy模块或ogr2ogr循环处理目录下的所有SHP文件。例如使用arcpy的FeatureClassToDXF_conversion函数。这需要一定的编程基础但一劳永逸。6. 数据质量评估与局限性说明尽管我们已经进行了细致的清洗和处理但必须清醒认识到基于OSM的数据存在固有的局限性。这份“已处理”的数据在可用性上得到了极大提升但在用于严肃的项目或研究前仍需进行质量评估。6.1 完整性评估OSM数据的完整性依赖于本地贡献者的活跃度。在郑州市主城区如金水区、中原区、二七区的道路网络通常非常详尽甚至包含了大量小区内部道路、人行道。然而在新开发的郑东新区扩展区域、航空港区或者远郊的县市道路数据的完整性可能下降可能存在缺失的新建道路或者道路属性如车道数、限速记录不全。评估时可以将我们的数据与最新的卫星影像或官方地图进行对比在GIS软件中通过卷帘工具快速查看缺失情况。对于关键区域可能需要手动在OSM上补充或从其他权威来源如高德/百度地图开放API需注意其使用条款获取数据进行融合。6.2 属性准确性评估属性准确性是另一个挑战。maxspeed限速和lanes车道数这类信息在OSM中可能未及时更新。一条道路拓宽后车道数可能已经改变但OSM中的数据还停留在旧状态。oneway单行道信息有时也会出错特别是在复杂的立交桥或交通组织频繁变更的区域。对于交通分析类项目建议对这些关键属性进行抽样核实可以通过街景地图如百度街景进行人工验证。在我们的处理中我保留了这些原始字段但将其视为“参考信息”而非“权威数据”。在分析报告中需要明确指出这一点。6.3 几何精度与拓扑逻辑在拓扑清理中我们修复了明显的悬挂点和重复线。但OSM数据的几何精度本身是存在波动的。道路形状可能只是大致拟合曲线处由折线段组成不够平滑。此外对于复杂的立体交通多层立交桥OSM通常使用bridge和tunnel标签以及不同的layer值来表示但在二维的SHP线数据中这些线路在平面上是交叉的。如果进行二维平面上的网络分析如最短路径这会导致错误的连通性判断。对于需要处理立体交通的网络分析必须将bridge、tunnel和layer属性纳入连通性规则中设置特殊的通行规则。6.4 时效性OSM数据是持续更新的。我今天处理的数据快照可能到下个月就有新的道路被添加或修改。因此在分享或使用这份数据时必须注明数据的下载和处理日期例如“基于2023年10月OSM数据快照处理”。对于长期项目需要考虑建立定期更新数据的流程。个人经验在将这份数据用于路径规划算法测试时我曾遇到一个典型问题算法在某个立交桥区域陷入了循环。检查后发现就是因为平面交叉的桥梁和隧道线段在没有考虑layer属性的情况下被算法误认为是平面交叉口导致了逻辑混乱。后来在构建网络数据集时我利用bridge和tunnel字段设置了高度限制才解决了这个问题。所以“已处理”不代表“完美无缺”理解数据的来源和局限与掌握数据本身同样重要。这份数据的最佳定位是一个高质量的“基底”或“起点”可以极大减少你的初始工作量但针对特定项目的深度需求可能还需要在此基础上进行二次加工和验证。本文还有配套的精品资源点击获取