郑州市OSM道路数据处理全流程:从原始下载到SHP、3DTiles转换实战
2026/9/13 9:27:35 网站建设 项目流程

简介:本资源为郑州市OpenStreetMap(OSM)道路矢量数据集,经清洗与格式标准化处理,专为GIS初学者、城市规划研究者及交通分析从业者设计,可直接用于空间可视化、路网密度计算、最短路径分析、多源数据叠加(如人口分布、公交站点)等典型应用场景。压缩包共9个文件,含核心Shapefile组件:.shp(道路线几何)、.dbf(含道路等级/名称/方向等属性)、.prj(WGS84坐标系定义)、.cpg(中文编码支持)、.shx/.sbn/.sbx(索引加速读取)及.shp.xml元数据文件,并附关键参考图《郑州市道路数据OSM类别对照表.jpg》,帮助准确解译OSM标签体系。资源大小仅4.49MB,轻量易用,适配QGIS、ArcGIS等主流平台。目前已有394人学习下载,开箱即用,无需额外处理即可开展教学演示、课程设计或科研预研工作。

1. 项目背景与数据价值

最近在做一个关于城市交通网络分析的课题,需要用到郑州市的道路矢量数据。找了一圈,发现OpenStreetMap(OSM)是获取这类数据最直接、最开放的来源。OSM的数据质量参差不齐,直接下载下来的原始数据往往包含大量冗余信息,比如各种非道路的要素、属性字段混乱、几何拓扑错误等,对于直接进行空间分析来说,需要经过相当复杂的清洗和处理流程。这让我想起了之前处理其他城市数据时,光是清理拓扑错误、统一道路分级就花了好几天时间。所以,这次我决定把处理郑州市OSM道路数据的过程完整记录下来,并且把处理好的、干净可用的数据分享出来。如果你也在做城市规划、交通模拟、GIS分析或者WebGIS可视化(比如想尝试把shp转成3DTiles放到Cesium里),这份“开箱即用”的数据应该能帮你省下不少前期准备的时间。

这份“郑州市OSM道路矢量数据(已处理)”的核心价值,就在于它完成了从原始OSM数据到专业GIS分析可用数据的转换。我不仅下载了数据,还进行了坐标转换、数据裁剪、属性筛选、拓扑检查与修复、道路分级重分类等一系列操作,最终生成了标准的Shapefile(SHP)格式。你拿到手后,可以直接用ArcGIS、QGIS等软件打开进行分析,或者进行进一步的格式转换(比如转GeoJSON、转CAD的DXF,或者尝试shp转3DTiles),而无需再纠结于数据预处理的各种坑。

2. OSM数据获取与原始数据处理

获取OSM数据有多种途径,对于城市级别的数据,我通常推荐两种高效的方式:通过QGIS插件下载,或者使用Geofabrik等网站提供的区域提取服务。考虑到我们需要的是郑州市的道路数据,并且希望获取的属性尽可能完整,我选择了使用QGIS的“QuickOSM”插件。

首先,你需要在QGIS中安装并启用“QuickOSM”插件。安装完成后,在插件菜单里找到它。关键的一步在于查询语句的构建。OSM数据是基于标签(key=value)系统组织的,道路数据主要存在于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等等,其中很多字段存在大量空值。而且,几何类型可能是LineStringMultiLineString。第一步,我使用QGIS的“修复几何”工具处理潜在的几何错误,比如自相交、重复节点等。然后,利用“矢量”->“数据管理工具”->“合并矢量图层”功能,如果存在多种几何类型,先将它们合并。接着,最关键的一步是坐标系统一。OSM数据使用的坐标系是WGS84(EPSG:4326),这是地理坐标系。在进行长度、面积计算或与许多国内底图叠加时,我们通常需要投影坐标系。对于郑州市,我选择使用“CGCS2000 / 3-degree Gauss-Kruger zone 38”(EPSG:4547),这是一个适用于该区域的投影坐标系,能保证距离测量的相对准确性。使用“投影”工具完成坐标转换。

注意:在下载和处理过程中,网络稳定性很重要。有时QuickOSM插件会因超时导致下载失败,如果遇到这种情况,可以尝试将郑州市边界拆分成几个小块,分多次下载,最后再合并。另外,OSM数据是众包数据,其完整性和准确性在不同区域可能有差异,市中心通常很详细,而新兴城区或偏远地区可能缺失,这需要在后续分析中留意。

3. 数据清洗、裁剪与属性优化

拿到投影后的数据,我们得到的仍然是覆盖范围可能略大于郑州市边界的全部道路线。第二步是精确裁剪。使用QGIS的“矢量”->“地理处理工具”->“裁剪”工具,输入图层是道路数据,覆盖层是郑州市边界多边形。这一步确保了每一条道路线段都被严格限制在郑州市的行政边界之内,边界处道路会被精确切断。

裁剪之后的数据量依然庞大,属性杂乱。我们需要进行属性字段的筛选和优化。原始OSM属性有几十个,但大部分对于常规的道路网络分析并非必需。我保留了对分析最有价值的几个核心属性,并进行了标准化处理:

  1. fclass(道路分类):这是最重要的字段。原始的highway标签值过于细致,我根据中国的道路设计规范和通用分析习惯,将其重分类为几个大类:

    • 高速路:包含motorway,motorway_link
    • 快速路/主干道:包含trunk,trunk_link,primary,primary_link。在实际中,trunkprimary在国内城市常对应城市快速路和主干道。
    • 次干道:对应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。这样,后续分析中就可以直接按大类进行符号化或统计。
  2. name(道路名称):直接保留OSM中的name标签。对于没有名称的道路(如一些小区内部路),该字段为空。

  3. maxspeed(限速):保留maxspeed字段。注意其值可能是数字(如60),也可能是字符串(如60 km/h)。我进行了一次清理,尝试提取数字部分,并统一单位为km/h。对于空值,保持为空,这在实际分析中代表限速未知。

  4. lanes(车道数):保留lanes字段,并尝试将字符串值转换为整数。同样,空值代表未知。

  5. oneway(单行道):这是一个布尔型或字符串型字段,常见值为yesno-1(反向)等。我将其统一处理为文本型的,便于理解。

  6. bridge(桥梁)tunnel(隧道):这两个字段标记道路段是否为桥梁或隧道部分。我将其处理为简单的/标志。

处理完属性后,我删除了所有其他不必要的字段,使数据表变得非常清爽。接下来是拓扑检查。道路网络应该是连接的,但OSM数据中常存在一些微小的悬挂节点(即一条路的端点没有连接到任何其他路),或者重复的线段。我使用QGIS的“拓扑检查器”插件,设置规则如“不能有悬挂点”(允许一定容差,比如1米)和“不能有重复的要素”。对于发现的错误,手动或半自动地进行修复,比如捕捉节点到附近道路的端点,删除重复线。这一步对于后续进行网络分析(如路径规划)至关重要,能避免因数据拓扑错误导致分析中断或结果异常。

4. 最终成果:SHP文件的结构与使用

经过上述步骤,我们得到了一个干净、规整的郑州市道路矢量数据集。我将其导出为标准的Shapefile格式,因为它仍然是GIS领域最通用、支持最广泛的交换格式之一。一个完整的Shapefile实际上由多个文件组成:

  • .shp:存储几何图形(这里是折线)的主文件。
  • .shx:几何图形的索引文件,用于快速定位。
  • .dbf:存储属性数据的数据库文件,里面就是我们整理好的fclassname等字段。
  • .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 ionpy3dtiles将SHP转换为3DTiles,用于三维数字孪生场景。
  • 与其他数据集成:你可以将道路数据与郑州市的POI(兴趣点)、行政区划、人口数据等进行叠加分析,研究城市结构。
  • 提取子集:如果你只需要某个区(如金水区)的道路,可以使用ArcGIS的“按属性选择”或“按位置选择”功能,或者使用“分割矢量图层”工具进行批量提取。

实操心得:在处理“oneway”字段时要特别小心。OSM中“oneway=yes”表示车辆只能沿着数字化方向行驶。但在实际网络分析中,你需要根据分析工具的要求来设置。例如,在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地形数据)。目前没有一键式的完美工具,但有几个探索方向:

  1. 使用Cesium ion:Cesium官方的ion平台提供上传GIS数据(包括SHP)并发布为3D Tiles的服务。你需要将SHP文件打包成ZIP上传。ion会自动将其拉伸为具有一定高度的白色3D模型。你可以指定一个基础高度和拉伸高度。这种方法最简单,但高度是统一的,且模型细节较简单。
  2. 使用Py3dtiles库:这是一个开源Python库。你需要先将SHP转换为具有高度属性的GeoJSON或GLTF模型,然后使用py3dtiles进行转换。这需要一定的编程能力。基本思路是:用GIS软件或脚本为每条道路线段添加一个“height”字段(比如根据道路等级设定不同高度),然后将线段转换为三角网格面,再导出为GLTF或直接使用py3dtiles的转换器。
  3. 在建模软件中处理:如热搜词提到的“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 Geodatabase,File Geodatabase内部使用UTF-8,通常能解决乱码。然后再从GDB中导出为SHP。
  • 手动创建CPG:直接创建一个同名的.cpg文本文件,内容写UTF-8GBK,与.shp放在同一目录。

5.4 批量处理与分割SHP

“渔网分割shp”和“arcgispro怎么把shp拆分”指向同一个需求:将一个大范围的SHP文件按规则分割成多个小文件。这在数据分发或并行处理时很有用。

  • 渔网分割:在ArcGIS中,可以先创建一个“渔网”(Fishnet)工具,生成覆盖研究区域的规则网格面。然后使用“空间连接”或“按位置选择”工具,将道路要素归属到每个网格。最后使用“分割”工具(ArcToolbox -> 分析工具 -> 提取 -> 分割),输入道路数据,分割字段选择网格ID,即可批量输出。
  • 按属性分割:如果你想按行政区划(如郑州市内各个区)来分割道路数据,而你的道路数据属性表里没有区划信息,就需要先进行“空间连接”,将区划名称连接到每条道路上。然后使用“分割”工具,分割字段选择区划名称。
  • 在QGIS中:可以使用“处理工具箱”中的“分割矢量图层”工具,直接按选定的属性字段进行分割,非常方便。

对于“批量把多个shp转为cad”,可以编写一个Python脚本,利用arcpy模块或ogr2ogr循环处理目录下的所有SHP文件。例如,使用arcpyFeatureClassToDXF_conversion函数。这需要一定的编程基础,但一劳永逸。

6. 数据质量评估与局限性说明

尽管我们已经进行了细致的清洗和处理,但必须清醒认识到,基于OSM的数据存在固有的局限性。这份“已处理”的数据在可用性上得到了极大提升,但在用于严肃的项目或研究前,仍需进行质量评估。

6.1 完整性评估

OSM数据的完整性依赖于本地贡献者的活跃度。在郑州市,主城区(如金水区、中原区、二七区)的道路网络通常非常详尽,甚至包含了大量小区内部道路、人行道。然而,在新开发的郑东新区扩展区域、航空港区,或者远郊的县市,道路数据的完整性可能下降,可能存在缺失的新建道路,或者道路属性(如车道数、限速)记录不全。评估时,可以将我们的数据与最新的卫星影像或官方地图进行对比,在GIS软件中通过卷帘工具快速查看缺失情况。对于关键区域,可能需要手动在OSM上补充,或从其他权威来源(如高德/百度地图开放API,需注意其使用条款)获取数据进行融合。

6.2 属性准确性评估

属性准确性是另一个挑战。maxspeed(限速)和lanes(车道数)这类信息,在OSM中可能未及时更新。一条道路拓宽后,车道数可能已经改变,但OSM中的数据还停留在旧状态。oneway(单行道)信息有时也会出错,特别是在复杂的立交桥或交通组织频繁变更的区域。对于交通分析类项目,建议对这些关键属性进行抽样核实,可以通过街景地图(如百度街景)进行人工验证。在我们的处理中,我保留了这些原始字段,但将其视为“参考信息”而非“权威数据”。在分析报告中,需要明确指出这一点。

6.3 几何精度与拓扑逻辑

在拓扑清理中,我们修复了明显的悬挂点和重复线。但OSM数据的几何精度本身是存在波动的。道路形状可能只是大致拟合,曲线处由折线段组成,不够平滑。此外,对于复杂的立体交通(多层立交桥),OSM通常使用bridgetunnel标签以及不同的layer值来表示,但在二维的SHP线数据中,这些线路在平面上是交叉的。如果进行二维平面上的网络分析(如最短路径),这会导致错误的连通性判断。对于需要处理立体交通的网络分析,必须将bridgetunnellayer属性纳入连通性规则中,设置特殊的通行规则。

6.4 时效性

OSM数据是持续更新的。我今天处理的数据快照,可能到下个月就有新的道路被添加或修改。因此,在分享或使用这份数据时,必须注明数据的下载和处理日期(例如“基于2023年10月OSM数据快照处理”)。对于长期项目,需要考虑建立定期更新数据的流程。

个人经验:在将这份数据用于路径规划算法测试时,我曾遇到一个典型问题:算法在某个立交桥区域陷入了循环。检查后发现,就是因为平面交叉的桥梁和隧道线段,在没有考虑layer属性的情况下,被算法误认为是平面交叉口,导致了逻辑混乱。后来在构建网络数据集时,我利用bridgetunnel字段设置了高度限制,才解决了这个问题。所以,“已处理”不代表“完美无缺”,理解数据的来源和局限,与掌握数据本身同样重要。这份数据的最佳定位是一个高质量的“基底”或“起点”,可以极大减少你的初始工作量,但针对特定项目的深度需求,可能还需要在此基础上进行二次加工和验证。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询