ARTICLE DETAIL

资讯详情

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

内蒙古道路矢量数据分级到乡道:坐标系、属性表与路网分析实战

内蒙古道路矢量数据分级到乡道:坐标系、属性表与路网分析实战 简介内蒙古自治区最新分级道路矢量数据整合了城市道路、行政等级道路与OSM开源路网三类来源共16种道路线要素适合GIS数据处理、交通规划、路网分析以及专题制图等场景。压缩包为RAR格式整体39.26MB内含城市一级、二级、三级、四级道路线数据高速、国道、省道、县道、乡道等行政等级线数据并补充了Railways铁路、轻轨、窄轨、地铁、有轨电车与Roads主干道、次干道、支道、高速、人行道、住宅街道、自行车道等多类型数据。由于各来源在道路分类和覆盖范围上既有重复又相互补充实际使用时既能交叉验证也能按项目精度灵活选用尤其适合需要精确到乡道的区域路网研究。目前已有216人学习下载对于关注内蒙古交通底图、路网密度和道路分级的研究者或规划从业者这套矢量数据集具备较好的参考和复用价值。1. 一份精确到乡道的道路矢量数据能帮你解决什么做 GIS 的人应该都体会过这种尴尬项目急着要路网底图从网上下载的所谓“全国道路矢量数据”打开一看高速和国道是完整的县道断断续续乡道基本只剩一两条主干。地图上看着是路网真到做分析时才发现车到村口路在图上已经断了。内蒙古这份道路矢量数据的分级精确到乡道——这意味着以前只能靠估算的很多分析现在有了可靠的底图。做交通规划、环境影响评价、国土空间规划、SWAT 小流域建模的从业者以及所有被“全国大而粗”的数据坑过的人都会在接下来的章节里找到自己需要的东西。2. 道路分级与数据结构从高速到乡道的分层逻辑拿到数据包先别急着解压分析第一步应该是搞清楚里面的道路是怎么分级的、每个图层代表什么。这份数据之所以叫“分级精确到乡道”指的是行政等级上覆盖了高速公路、国道、省道、县道、乡道五层而不是像很多公开数据集那样只有高速和国道。先看懂分级逻辑后面做属性筛选、符号化和统计分析时才知道每一层该怎么处理。2.1 道路分级的依据行政区划层次决定数据图层国内的路网分级日常口语里说的“高速、国道、省道、县道、乡道”严格来说是两个维度混在一起的说法。按行业标准 GB/T 917-2017《公路路线标识规则和国道编号》公路的行政等级分为国道、省道、县道、乡道和专用公路技术等级则分高速公路和一、二、三、四级公路。技术等级描述的是建设标准行政等级描述的是管理归属。一份矢量数据里如果出现“高速”这一层它既可以是国道里的国家高速G 字头也可以是地方建设的高速公路属性表里通常用单独的字段区分。编码规则是识别道路身份的捷径。国家高速以 G 加一位或两位数字命名比如 G6 京藏高速、G7 京新高速普通国道用 G 加三位数比如 G110省道用 S 开头县道多以 X 开头乡道多以 Y 开头。内蒙古的东西跨度大西部荒漠区路网稀疏、东部农牧区等级路网密口岸方向还有边防公路和专用联络线这些在实际数据里有时归入乡道、有时单列一层。拿到数据后第一件事就是把各图层的命名规则和编码列一遍能快速判断数据来源的整理习惯也能提前发现图层缺失。这里我想多提醒一句不要想当然认为“乡道图层里只有 Y 编码”。很多旗县级的道路数据在整理时会把未编码的村道、农场路、矿区路也丢进乡道图层属性表里的 Level 字段可能写的是“乡道”或“等外路”。做统计时如果按编码前缀过滤会漏掉一大批实际能通车的道路按行政等级过滤则不会。这也是为什么要先看属性表而不只是看文件名。2.2 属性表与编码规则先看清 Level 和 Code 字段再动手shp 的属性表存在同名的 .dbf 文件里这个格式本身不复杂但有两个天生缺陷字段名最长 10 个字符以及编码没有统一标准。老数据多用 GBK新数据多为 UTF-8软件默认读取编码不一致时道路名称直接显示成乱码。这份数据里如果出现乱码不是数据坏了是软件没有按正确编码读取。拿到 shp 后建议先浏览一遍属性表重点看这几个字段字段名类型说明OBJECTID / FID整型要素唯一编号Code文本道路编号如 G110、S101、X001Name文本道路名称如“京藏高速”Level / Type文本行政等级高速、国道、省道、县道、乡道Length双精度路线长度单位取决于数据预处理需验证Surface文本路面类型沥青、水泥、砂石字段名在不同生产单位手里会有差异有的叫 Class有的叫 Type有的叫 DLZ道路等级拼音缩写。判断依据是字段内容而不是字段名本身。Length 字段是最容易误导人的一个如果数据存的是地理坐标经纬度Length 的值可能是个位数甚至小数那单位就是度而不是公里如果数据已经做了投影Length 通常是米。使用前用 GIS 软件实测两段路的距离做交叉验证比直接信字段要可靠得多。3. 从 rar 到可用图层解压、坐标系校对与加载三步走数据包以 rar 格式分发这一步对很多新手来说反而是第一个坎。rar 不是免费开源格式Linux 环境下常见的 unrar 命令在部分发行版里没有版权授权需要额外安装。Windows 上双击就能解压的国产工具又经常在路径编码和分卷处理上出问题。我的习惯是统一用 7-Zip 处理免费、支持 rar 解压、命令行参数清晰还能做完整性测试。3.1 rar 解压前先做完整性测试大体积资源包在传输过程中很容易出现字节损坏rar 有恢复记录recovery record还好没有的话轻则某个图层解不出来重则整个包都打不开。常见做法是先做完整性测试再解压而不是直接双击解压到一半才报错。# 1. 测试压缩包完整性输出 Everything is Ok 才算下载完整 7z t 内蒙古自治区道路数据最新分级精确到乡道矢量数据.rar # 2. 确认完好后再解压-o 后跟输出目录不要留默认路径 7z x 内蒙古自治区道路数据最新分级精确到乡道矢量数据.rar -oD:/gis_data/inner_mongolia参数说明t 是 test 模式只做完整性校验不解压x 是 extract 模式按压缩包内原目录结构释放文件-o 指定输出目录注意 -o 和目录路径之间不能有空格。如果压缩包是多卷分卷part1、part2 这种7-Zip 会自动按顺序读取分卷只要所有分卷在同一个目录里就行。网上有不少号称能修复损坏 rar 或者破解 rar 密码的工具比如各种 rar recovery 类的软件我的建议是不要碰。注意不要使用来路不明的第三方 rar 修复或密码破解工具这类工具经常在解压时加载广告子程序安全性没有保障。优先核对下载页提供的 MD5 或 SHA1 校验值。没有校验值就多做一次完整性测试确认损坏后重新下载而不是用第三方工具硬修。多卷压缩包下载时尤其容易缺卷缺一卷整个包都解不出来下载前后核对文件名列表比解压失败后再排查省事得多。3.2 坐标系识别prj 文件里写着数据的“前世今生”shp 的坐标系定义存在同名 .prj 文件里用文本编辑器打开就能看到一串 OGC WKT 格式的文字。这里边 DATUM 字段写的是基准面Beijing_1954 是北京54Xian_1980 是西安80China_2000 是 CGCS2000GCS_WGS_1984 是 WGS84。这些基准面在地图上看差别不大叠图时却能差出去几百米到几公里是矢量数据最常见的一种“翻车”来源。更隐蔽的问题是这个 shp 压根没有 prj 文件或者 prj 里只写了“GCS_WGS_1984”这种地理坐标系而没有投影信息。内蒙古全境横跨多个投影带数据生产单位很可能按旗县分别做了投影再合并成一份全省数据。合并后的坐标系是哪个带、有没有统一必须在分析之前确认。import geopandas as gpd # 读取任意一个 shp 图层统一起见先读乡道 road gpd.read_file(Y乡道.shp, encodinggbk) # 打印坐标系。如果输出为 None说明 shp 丢了 prj 文件 print(road.crs) # 再按 Level 字段统计各等级要素数量确认分级粒度 if Level in road.columns: print(road[Level].value_counts())参数说明encoding 参数解决 dbf 中文乱码问题GBK 编码的数据用 utf-8 读会得到一串乱码反过来 GBK 读 UTF-8 数据会直接报错多试一次即可判断。road.crs 输出 None 意味着坐标系未知这时候不能直接投影转换要先根据位置范围人工指定坐标系。乡道图层如果 Level 统计结果里有大量“等外路”或空值说明数据整理时混入了未分级道路后面做分等级统计时要单独处理。3.3 图层加载与套合验证别急着分析先叠一层边界坐标系确认之后把数据加载进 QGIS 或 ArcGIS先别急着做缓冲区、裁剪这些操作。我的固定流程是叠一层内蒙古的行政边界或者在线影像底图看道路图层是否落在正确的位置上。这一步能同时验证两件事道路数据本身的几何位置是否正确以及当前视图所用的坐标系和数据是不是一致。QGIS 里加载 shp 时如果字段中文乱码在“数据源管理器”里把源文件编码手动改成 GBK 或 UTF-8重新加载即可。ArcGIS 里的处理稍麻烦老版本要在注册表里改 dbf 的默认编码ArcGIS Pro 则在选项里设置。相比起来 QGIS 对编码的容错性更好这也是我处理这类历史数据时优先用 QGIS 的原因。加载完成后做一个快速检查随便选一条乡道打开属性表看 Name 字段是否正常显示中文、Length 字段数量级是否合理再量一段路的实际长度和属性里的 Length 对比。如果数据是 CGCS2000 坐标系而工程默认是 WGS84从地图上看几乎没有差别但做面积和长度计算时误差会在不知不觉中进入结果。这就是为什么套合验证只能排除明显错误精确计算前还是要把坐标系统一到位。4. 数据落地实战路网分析、SWAT 建模与格式转换前面的准备步骤做完数据就能真正干活了。这一章我选三个最常见的落地场景缓冲区与可达性分析、SWAT 小流域建模里的辅助图层、以及不同格式之间的转换。这三个场景覆盖了规划选址、水文模拟和跨软件协作三类典型需求参数选择上我会给出具体建议。4.1 缓冲区与可达性把乡道数据用到选址分析上做公共服务设施选址、噪声影响范围评估、或者自然保护区人类活动干扰分析时道路缓冲区都是绕不开的底图运算。乡道这一层尤其关键——高速和国道的缓冲区覆盖的是走廊带而乡道的缓冲区直接关系到村庄居民点的覆盖水平。import geopandas as gpd # 读乡道转到以米为单位的投影坐标系后做缓冲 road gpd.read_file(Y乡道.shp, encodinggbk) road_utm road.to_crs(EPSG:32649) # 呼和浩特一带覆盖 108°E-114°E 的 UTM 49N # 500 米缓冲区距离单位跟随投影这里是米 buf road_utm.buffer(500) buf.to_file(乡道_500m.gpkg, driverGPKG) # 顺便算每个居民点到最近乡道的直线距离 village gpd.read_file(居民点.shp, encodinggbk) dist village.geometry.apply(lambda p: road_utm.distance(p).min())逻辑说明buffer 的作用是把线要素向外扩展指定半径生成面要素用于表达“道路两侧多少米范围内”的空间关系。distance 计算的是点到所有道路线要素的最近距离.min() 取最小值得到“最近乡道距离”。参数说明EPSG:32649 是 WGS84 / UTM 49N覆盖东经 108°到 114°呼和浩特正好落在这个带内。做内蒙古西部的分析时要换成 UTM 48N 或更西的带号具体以工作区中心经度为准。buffer(500) 的 500 是米这个数值取决于分析目标噪声敏感点评估常用 200 米道路红线控制常用 100 米而面源污染缓冲常用 500 米以上。距离计算的结果 dist 单位是米可以进一步转成公里输出到报表。这里有个容易忽略的点如果数据本身是 WGS84 经纬度直接 buffer(500) 得到的不是 500 米而是 500 度——结果会是一个覆盖全球的怪物。所以投影转换必须放在 buffer 之前顺序反了结果全错。4.2 SWAT 小流域建模里道路数据的位置SWATSoil and Water Assessment Tool做小流域分析时标准的输入数据是 DEM、土壤、土地利用和气象数据道路数据并不在必填清单里。但实际项目中道路的用处一点也不小道路密度和道路的排水设计直接影响到局部产汇流过程在 HRU 划分之后做道路密度分区、分析道路对泥沙输移的影响都需要一份可靠的路网底图。有人在网上问“ArcSWAT 做小流域分析要用什么矢量数据”我的回答是除了必填的流域边界矢量道路矢量是一个高价值的可选图层。用法通常分三步。第一步把道路数据投影到和 DEM 一致的坐标系方法是查一下 DEM 的坐标系用road.to_crs(dem.crs)统一第二步用子流域边界裁剪道路只保留研究区内的路段这一步可以在 QGIS 里用“裁剪clip”工具完成第三步把裁剪后的道路转成栅格分辨率对齐 DEM然后参与道路密度或缓冲区的统计。这个流程里道路数据的价值体现在两个方面。一是道路切坡、填方和路面硬化改变了局地的下渗条件道路密度高的子流域产流特征明显不同做 CN 值径流曲线数修正时需要参考二是乡村道路的边沟往往直接连接沟道是泥沙和污染物的快速通道把乡道纳入距离分析能解释很多水文监测点位的异常数据。如果没有精确到乡道的路网这两类分析都只能停留在猜测层面。4.3 shp 转 gpkg 与 kml换格式前想清楚三个问题shp 格式用了几十年问题攒了一堆字段名只能 10 个字符汉字字段名会截断属性表 dbf 文件超过 2GB 就废了一个完整图层要 3 到 5 个同名文件跟着拷给别人时漏一个就加载不了。GeoPackagegpkg是更现代的选择单文件、字段名长、编码统一。KML 则是给 Google 地球这类在线底图用的展示格式。转换前先想清楚三个问题最终在哪个软件里用、要不要保留全部属性字段、坐标系需不需要跟着变。# 把 shp 批量转成 GeoPackage规避 shp 字段名截断和 dbf 编码问题 ogr2ogr -f GPKG 内蒙古道路.gpkg 内蒙古道路_乡道.shp \ -t_srs EPSG:4326 -lco ENCODINGUTF-8 # 转 KML 用于在线底图叠加查看 ogr2ogr -f KML 内蒙古乡道.kml 内蒙古道路_乡道.shp逻辑说明ogr2ogr 是 GDAL 自带的格式转换工具QGIS 安装后命令行里可以直接调用。第一个命令把 shp 转成 gpkg同时用 -t_srs 把坐标系转成 WGS84 经纬度第二个命令转成 KMLKML 本身就是 WGS84 坐标不需要显式指定投影。参数说明-f 指定输出格式的驱动名GPKG 和 KML 都是 GDAL 内置驱动-t_srs 是目标坐标系如果原始数据已经是 CGCS2000 且后续在 ArcGIS 里用可以省略这个参数保持原坐标系减少一次转换误差-lco ENCODINGUTF-8 是图层创建选项保证 gpkg 里的字段用 UTF-8 编码避免在其他软件里乱码。KML 转出来字段会简化适合纯展示不适合继续做空间分析。5. 避坑指南坐标系错乱、字段乱码与拓扑断裂的五个现场这一章是我被不同数据坑过之后攒下的笔记。每一条都按“现象、原因、解决”三步写遇到类似问题可以直接对照排查。5.1 道路图层叠到影像底图上偏了几公里现象道路矢量数据叠加在线影像或天地图上整体向某个方向偏移偏移量从几百米到几公里不等而且不同路段的偏移方向还不一致。原因最常见是坐标系老底子问题。这份数据如果用西安80或北京54坐标系生产而工程环境默认是 WGS84 或 CGCS2000两个基准面之间的转换存在系统偏差如果是按旗县分带投影后合并的不同旗县的数据可能带着不同的投影带合并时又没有统一就会产生“一部分路对得上、一部分对不上”的怪现象。解决先打开 prj 文件确认原始坐标系再用行政边界图层做套合参照找一个明显标志物河流交汇口、城镇边界验证偏移量和方向。确认是基准面问题后在 QGIS 里用“矢量重投影”统一转换到目标坐标系涉及西安80转CGCS2000这类基准面转换时需要一个带七参数的转换公式不要直接选“无位移转换”那种粗暴算法。5.2 属性表里的道路名称全是乱码现象用 QGIS 或 ArcGIS 打开 shp几何图形正常显示但 Name、Level 字段里的中文全部变成“锟斤拷”或者“???”之类的符号。原因shp 属性表用的 dbf 文件编码没有声明机制。老数据用 GBKWindows 中文默认编码写入新一代软件默认按 UTF-8 读取两端对不上就乱码了。在网上下载的资料包里这种情况尤其普遍因为很多数据是 2010 年前后生产后一直没重新整理过。解决QGIS 里加载 shp 时在数据源管理器把“源文件编码”从默认值改成 GBK 或 GB18030重新加载即可。如果改了编码还是乱码试一下 UTF-8两个方向各试一次基本能定位。ArcGIS Pro 可以在项目的选项里设置 dbf 编码兼容性。反正这不需要修数据只是读取方式的问题别急着用工具去“修复”dbf 文件。5.3 乡道在乡镇边界处断开做网络分析时路网不连通现象沿一条乡道做路径规划或网络分析走到乡镇行政边界处路线中断明明两段路首尾相接在拓扑上却是两个独立的线要素分析结果绕了远路。原因数据分乡镇生产后合并时相邻乡镇的同一条路在边界处没有做捕捉处理两条线的端点只差了几十厘米甚至几米肉眼看着连着拓扑上是断的。这是中国县级以下道路数据里非常普遍的接边问题和数据的精度无关纯粹是生产流程导致的。解决做网络分析前先做拓扑修复。QGIS 里可以用 v.cleanGRASS 工具集的 snap 和 break 两个步骤处理或者用 ArcGIS 的“修复几何”工具。更省事的办法是把研究范围的数据先合并成单要素再用“捕捉到线端点”做一次微小的容差处理。记住容差不要设置太大5 米以内通常够用设大了会把相邻的平行道路错误地连起来。5.4 Length 字段算出来的长度明显不对现象属性表里 Length 字段的值只有 0.5、1.2 这种小数或者整条高速的长度算出来只有 3 公里和实际情况完全对不上。原因数据保存为地理坐标系经纬度Length 字段存的是度而不是米。在 WGS84 坐标系下从东经 111° 到 112° 的距离和从北纬 40° 到 41° 的距离是不相等的直接用度做长度单位没有任何实际意义。解决先把数据投影到以米为单位的坐标系再用投影后的几何重新计算长度。QGIS 里用字段计算器输入$length在投影坐标系下自动返回米ArcGIS 里用 Python 脚本或“计算几何”选项。如果不想动原数据也可以只做临时投影在分析过程中使用投影后的副本原数据保持不动这个习惯能避免很多返工。5.5 rar 解压到一半提示 CRC 校验失败现象双击解压 rar 包解到一半弹窗提示 CRC 错误某个图层文件解不出来或者解出来打不开。原因压缩包在下载过程中损坏了。最常见是断点续传导致的字节错位还有部分下载工具的并发分块机制会在合并文件时出错。rar 格式本身有很强的容错能力但如果源文件上传时就带着错误或者下载工具破坏了文件结构连恢复记录也救不回来。解决先删除本地文件重新下载一次下载时不要使用浏览器默认的断点续传改用下载工具从头完整下一遍。下载完成后用 7z t 再做一次完整性测试确认输出“Everything is Ok”再解压。如果重下两次都坏在同一位置问题大概率在源文件本身去下载页面核对分享者是否提供了校验值没有的话可以联系分享者重新打包。6. 进阶技巧用属性查询和符号化把分级路网一次出图数据最终要落到图上给人看。道路分级精确到乡道的优势在出图时体现得最充分——五级道路可以用一套清晰的符号系统一次表达。常见的做法是按等级分配颜色和线宽高速用红色加粗实线国道用橙色省道用黄色县道用浅蓝细线乡道用灰色虚线。这套配色在纸质图和高分辨率屏幕上都容易分辨也是规划类图件的默认习惯。在 QGIS 里做分等级统计不需要写 Python用图层的聚合表达式就能完成。在字段计算器里新建一个字段表达式写成round( sum( Length, Level ) / 1000, 1)逻辑说明sum 是聚合函数按 Level 字段分组求和Length 单位是米除以 1000 转成公里round 保留一位小数。运行结果就是每个道路等级的总里程。配合这个统计结果可以在图例里直接标注“高速 2842 公里、国道 5200 公里”这类信息图件的信息量一下子就不一样了。用 GeoPackage 格式时还能直接上 SQLQGIS 的 DB Manager 里连上 gpkg 数据库执行SELECT Level, ROUND( SUM(Length) / 1000.0, 1 ) AS km FROM 内蒙古道路 GROUP BY Level ORDER BY km DESC;这段 SQL 的意图是分组统计各等级道路里程并按里程降序排列。参数说明SUM 里用 Length 字段如果原始 shp 没有投影、Length 单位不是米先投影再算GROUP BY 是分组依据和 Level 字段一一对应实际使用中换成自己数据里的等级字段即可。从那以后我拿到任何一份矢量道路数据第一件事就是用文本编辑器打开 prj 看一眼坐标系定义再叠一次行政边界验证位置确认无误后才敢往下做分析和出图。这个习惯帮我省掉了大量“分析做到一半发现数据有问题”的返工也希望这份内蒙古道路数据的拆解过程能帮你把同类的矢量数据用得顺手一些。希望帮到你。本文还有配套的精品资源点击获取
返回列表