简介:《陕西各级公路shp文件》是一份面向GIS学习者、交通规划与城市规划从业者的矢量数据包,完整覆盖陕西省高速公路、一二级公路和三级公路的分级路网,并附带各地级市行政区划边界,适用于ArcGIS、QGIS等常用平台直接加载与空间分析。资源共35个文件,由5套标准Shapefile组件构成,包含几何数据、属性表、索引、投影文件、空间索引及元数据,文件结构完整且压缩包仅2.14MB,读取与传递都很便捷;各图层均含投影和元数据,便于坐标统一与来源追溯。目前已有631人学习浏览。基于这些数据,使用者可迅速进行公路等级筛选、里程统计、缓冲区分析、连通性评价,也可将道路与行政区划叠加开展交通规划、选址评估、灾害应急路径设计等工作,为陕西省域尺度的研究与项目落地提供可靠的空间底图。
1. 陕西各级公路shp文件到底是什么:先别急着下载,先看数据长什么样
你可能在项目里遇到过这种情况:领导说“把陕西的高速、国道、省道、县道按等级画出来标到图上”,你打开ArcGIS却发现手里只有一张天地图底图,连一条正经的路网矢量线都没有。这时候“陕西各级公路shp文件”就成了刚需——一份覆盖陕西全省、按照公路行政等级或技术等级分层的线状矢量数据。它解决的不是“有没有路”的问题,而是“路的分类能不能进属性表、能不能按等级出图”的问题。
这份数据对做路网规划、物流选址、交通流量分析、专题制图的人最有用。shp文件本身是ESRI Shapefile格式,几何图形以线要素为主,属性字段里通常带着道路编号、路线名称、等级分类、里程、行政区划等信息。拿到手之后,能做分级渲染、按等级拆层、做拓扑检查甚至做网络分析,前提是你知道怎么把它加载进GIS、怎么处理那些隐藏在字段和坐标系里的坑。
2. 拿到陕西公路shp后第一步:用QGIS做一次别开生面的体检
2.1 加载shp的两种方式和文件编码那点事
打开QGIS后,把陕西公路shp拖进画布是最快的方式,但这里有个前提:你拖进去的必须是一整套完整文件,而不是单独的某个后缀。一个标准shp文件由至少三个文件组成:.shp(几何信息)、.shx(索引)、.dbf(属性表)。如果还有.prj,那是坐标系信息;有.cpg说明编码格式。只拿一个.shp文件喂给GIS软件是会直接报错的。
我一般用“层”菜单下的“添加矢量图层”来加载。弹出的对话框里,文件来源选“文件”,编码选择界面会给你下拉选项。陕西地区的路网数据很多是从国家公开地图或地方测绘部门拿过来的,属性里的中文注释经常是GBK或者GB2312编码。如果QGIS默认用了UTF-8加载,属性表里的中文会变成一堆乱码,这个在后面的避坑章节里我展开说。
参数设置上,加载时不需要额外指定几何类型,QGIS会自动识别线要素。但如果发现有部分图层加载后什么都不显示,第一件事不是怀疑数据坏了,而是检查是否是坐标参考系的问题。陕西用的投影一般是CGCS2000或者Xian 1980,前者是地理坐标系,后者有些数据源里标注为投影坐标。在页面底部的坐标显示区域能看到当前CRS,没有.prj文件的shp会被默认设置成EPSG:4326,也就是WGS84经纬度。这种情况下全省路网会和底图错位几个公里级。解决方式很简单:右键图层,图层属性里手动指派正确的CRS。
2.2 属性表里藏着分级字段:怎么立刻看出全省路网骨架
加载完成后别急着做符号化,先打开属性表。右键图层,选择“打开属性表”,你会看到一行行道路要素对应的记录。陕西各级公路的shp文件里,通常会有类似“公路等级”“道路等级”“grade”“road_class”这样的字段。每个字段的取值差异很大,有的用代码表示,比如1代表高速、2代表国道、3代表省道,有的直接存中文“高速公路”“国道”“省道”“县道”。
拿到一张混在一起的路网表,第一步是用字段统计功能确认等级字段里到底有哪些值。在QGIS里可以选中等级字段,点属性表工具栏上的“字段筛选”或直接点漏斗图标,选“全部唯一值”。这样你能在一屏之内看到这个shp文件把公路分成了几个等级。常见的有5到6类:高速公路、国道、省道、县道、乡道,有的还会带上专用公路。
接下来做一件事:按等级字段分组统计要素数量和总里程。用QGIS的“处理”菜单,找“按字段分组统计”工具,或直接用字段计算器对里程字段做汇总。统计结果能帮你判断这份shp是完整路网还是只有骨架。比如卫星地图上能看到大量的村道,而shp里只有高速国道和省道,那说明它的取数规则是“只保留骨干路网”。这直接影响你在项目里能不能拿它做乡镇一级的分析。
这个体检步骤非常关键,原因是省道以上级别的路网通常数据质量较高,而县道和乡道这一层的断裂、缺段、属性缺漏会明显变多。搞明白数据覆盖到什么等级,比急着做渲染重要得多。
2.3 用“按表达式选择”把高速和国道的数量迅速确认出来
想更精确地了解每条等级的体量,可以在QGIS里打开“选择”菜单下的“按表达式选择要素”。假设等级字段名叫“grade”,且值是中文,表达式就写:
"grade" = '高速公路'执行后,下方状态栏会显示“选择了N个要素”。再用同样的办法查省道、县道。如果你不想反复操作,可以写一条组合表达式:
"grade" IN ('高速公路', '国道', '省道')这条表达式的意思是选中三类的全部要素,适合快速筛查数据中是否包含所有级别的高速和国省道。这里的逻辑说明:QGIS的表达式语法和ArcGIS的Select By Attributes并不完全一致,字符串必须用单引号,字段名用双引号。写错引号类型,表达式会报语法错误。
参数上需要注意:如果等级字段是数字代码而不是中文,就用数字直接比较,比如“grade” = 1。如果用代码型数据去匹配中文,会把要素数统计成0。遇到这种情况,先做一次字段内容目检,再写表达式。这个动作虽然简单,但能省掉后面整理图层时的大量返工。
3. 按公路等级切分全省路网:从混合线层到分级线层
3.1 质检之后,用“按属性导出”拆出各等级shp
拿到已确认字段结构的路网后,下一步就是拆层。做项目时,一张全要素路网图层通常不能满足出图要求。高速要用红色粗线压在最上层,国道用橙色中线,省道用蓝色细线,如果全部混在一起,符号化的时候只能按等级做分类,不利于单独调整线型。
拆层的标准姿势是选中某一等级的全部要素,右键图层,选“导出”为“所选要素另存为”。这里我以QGIS为例,从“处理”菜单找“按属性提取”更可控。工具对话框如下:
输入图层:陕西公路shp 提取依据:表达式 表达式:"grade" = '高速公路' 输出文件:G:/shanxi/roads/高速.shp执行后你会得到一个独立的高速公路线图层。逻辑说明:这个工具本质上是遍历所有要素,把满足表达式的要素写入新shp,属性结构保持不变。参数说明:输出格式保持ESRI Shapefile即可,CRS最好在“几何CRS”里选回原数据坐标,不要随意转为Web墨卡托。因为后续你可能要做拓扑处理或里程计算,保留原始坐标系最安全。如果你打算直接用矢量数据叠加在线底图上面出图,也可以顺手把坐标系转为EPSG:3857,但前提是你已经确认整个项目都用这个坐标系。
按同样方法把国道、省道、县道各导出一份,命名最好带上等级前缀和日期,比如“国道_2024版.shp”。因为我见过太多人导出后分不清哪个是旧的哪个是新的,最后把过期路网混进了汇报图。
3.2 拆层后的字段裁剪:删掉你用不到的列
拆分后的shp会完整保留原属性表的所有字段。有时候原数据里有“规划属性”“管理单位编号”“登记日期”等二三十个字段,但你的项目只需要路线编码和名称。多余的字段会让文件体积变大,也会让后续做拼接或转MapGIS时增加属性映射的麻烦。
可以用“处理”工具箱里的“要素重投影”旁边的“字段管理”或“属性表筛选”来做字段裁剪。在QGIS里也可以打开“处理”菜单,找“按表达式提取”旁边的高级工具,直接拖出“保留字段”工具,勾选需要保留的字段列表:
保留字段 = ['OBJECTID', 'road_name', 'grade', 'length_km']这个参数说明是:字段名必须和原shp完全一致,包括大小写。裁剪后生成的新图层只含指定的列。我一般会保留四个字段:几何对象的自增ID、路线名称、等级、长度。如果你的工作流里要做路网融合或拓扑处理,最好把起终点节点编号、路宽字段也保留下来,因为这些在后续网络分析里可能是关键属性。
裁剪字段还有一个隐藏好处:降低后续在MapGIS里导入时字段类型映射出错的概率。属性字段越少,需要手工匹配的项越少,出错的概率就越小。
3.3 合并层:必须把拆分后再合成总图的口径理顺
拆层和合并听起来是对立操作,但实际工作中经常两个都要做。比如你手头有按地市切分的陕西公路数据:西安市的公路shp、宝鸡市的公路shp、渭南市的公路shp……这些文件要拼成全省一张网时,就要用合并工具。
在QGIS里用“处理”菜单找“合并矢量图层”,把所有分片的shp选进去,点击执行。这里有个关键参数:合并后是否保留输入图层的字段。如果各分片字段结构一致,直接选“串接所有字段即可,但注意每个分片的属性表可能有重复值,合并后会多出来自不同文件但同样代码的重复记录。如果你要做汇总统计,先合并再按等级分组聚合会好很多。
合并的坑常在坐标系上。如果你的西安和宝鸡数据一个来自WGS84,一个来自Xian 1980,合并时QGIS不会自动重投影,结果就是你得到一条在秦岭附近断掉的高速。解决办法是合并之前,先把每个分片用“重投影图层”工具统一到同一CRS。操作顺序是:先重投影,后合并,别反过来。
4. shp转MapGIS线文件:完整流程、参数设置与属性匹配
4.1 为什么要转MapGIS,以及两条可行的技术路线
国内很多地信单位,尤其是自然资源、公路勘察设计系统的日常作业平台还停留在MapGIS。MapGIS线文件的后缀是.WL,跟ArcGIS/QGIS的.shp不互通。如果你拿到的陕西各级公路shp文件要交到这些单位手里,就得转成MapGIS能打开的线文件。
常见做法有两种。第一种是直接用MapGIS的“文件转换”功能,在“输入”里选Shapefile格式,然后导入为线文件。这条路最直接,但坑也最多,常见问题是属性字段丢失、线型变成默认样式、图层名字乱码。第二种是在QGIS或ArcGIS里把shp导出为DXF或DWG格式,再通过MapGIS的DXF接口转成.WL,转完再做属性补充。这条路能保住更多几何信息,但属性几乎全丢,适合只关心几何形态的用户。
我一般推荐直接走MapGIS自带转换,因为后续可以补字段。但转换之前必须先处理两个前置问题:坐标系一致性和属性字段类型。陕西公路shp如果坐标是WGS84,MapGIS工程默认坐标可能是各地的地方独立坐标系,转进去后路网会偏移到离谱的位置。前置做法是先把shp转成Xian 1980或CGCS2000的投影坐标,再执行导入。
4.2 转换前准备:把属性字段统一成MapGIS能读的类型
MapGIS对属性字段类型的容忍度比ArcGIS低很多。在shp里,字段类型可以是双精度浮点、整型、字符串,而MapGIS的线文件属性表对字段长度和类型有严格限制,尤其对中文字段长度。
I通常在QGIS里提前统一字段类型。选中自己图层,打开属性表,用“字段计算器”把字段转换。比如“length_km”字段原来是双精度浮点,MapGIS导入后可能出现长度溢出或显示科学计数法。转换方法是用字段计算器新建一个整型字段“length_m”,表达式为round(“length_km” * 1000, 0)。同理,路线名称字段要检查长度是否够用,如果shp里写的是“G210国道包头至西安段”,而字段长度只有20个字符,后面文字会被截断。在MapGIS导入之前,先在QGIS的字段管理里把该字段长度调成50,确保内容完整。
参数设置的细节:MapGIS里新建线文件,再设置导入参数时,勾选“使用源文件坐标系”,并在“结果坐标系”里选和你工程图一致的坐标系。如果是MapGIS 6.7那种老版本,导入之前还需要在系统库中选择对应的线型库,否则导入后线型会变成默认的单线,并且无法自动匹配到属性里的等级字段。常见做法是导入完成后在MapGIS里重新定义线型,用在QGIS中保存的等级值手动映射。
4.3 在QGIS中执行导出转换,做好几何与属性的双备份
如果你不想让MapGIS直接读shp,可以在QGIS里先做一次中转,这招适合属性数据比较复杂、不能丢失的场景。在QGIS中把准备转手的数据“另存为”DXF格式,然后在MapGIS里“输入”DXF文件,将其转为线文件。这个流程能保证几何不错位,但属性和图层名基本上都保不住。所以我会另存一份CSV属性表作为备份,转完在MapGIS里用关联字段把属性挂回去。
具体字段对应关系可以用表格表示:
| 原始shp字段 | MapGIS线文件字段 | 类型 | 说明 |
|---|---|---|---|
| road_name | 路线名称 | 字符串(50) | 手工挂接 |
| grade | 等级 | 字符串(20) | 用于后续符号化 |
| length_km | 里程 | 双精度 | 注意精度和单位 |
| OBJECTID | ID | 整型 | 用来关联备份CSV |
这样处理下来,MapGIS里得到的线文件不但几何完整,属性也不丢。经验是转完之后立刻打开属性表抽查三条路线的名称,不要等用到时才发现中文乱码。如果出现乱码,回QGIS把.cpg文件里标明的编码改成GBK,重新导出DXF再转一次。
5. 陕西公路shp使用避坑指南:乱码、断线、坐标漂移、字段长度都在这
5.1 属性表中文乱码:问题通常不在shp本身在编码声明
现象:用QGIS加载陕西公路shp,几何显示正常,但属性表里的中文全部显示成“淇℃伅”或者问号。
原因:shp的.dbf文件里中文是用GBK编码存储的,而QGIS默认尝试用UTF-8读取。如果数据里没有.cpg文件,编码检测就会猜错。
解决:在“添加矢量图层”对话框右侧把编码手动改为GBK或GB18030,再加载。如果你已经加载进去了,最简单的办法是直接从图层列表里移除,再重新加载一次,选择正确的编码。注意,只用QGIS的“更改编码”工具并不能修复已读入的乱码,必须重新加载数据。
5.2 路网断头和跨级道路接不上:别急着甩锅数据
现象:高速在某个位置突然中断,和相邻的国道平行但没有任何连通;省道在县市交界处出现错位,两条记录之间有一小段空白。
原因:各级公路数据往往来源不同。高速来自高速路网测绘数据,国道、省道来自基础地理数据,二者精度不同、节点不匹配,接缝处就会断。还有一个原因是shp文件里的路网经过化简,删除了小角度拐点,导致端点坐标对不上。
解决:如果只是用来做宏观制图,断头可以接受,但要学会在出图说明里写清楚数据来源。如果你要做网络分析或里程测量,就必须做拓扑修复。QGIS里用“处理”菜单的“修复几何”工具可以补一些简单的空隙,但它并不能自动连接两个断开的端点。更可靠的做法是找到断头位置,手工编辑节点,或者使用“捕捉”工具把端点捕捉到最近的线段上。批量操作时可以用v.clean工具,参数选择“snap”模式,输入阈值设为10到50米,超过这个距离的断头不会被动。这个阈值要看数据的坐标系,投影坐标用米,经纬度坐标用度,不要混。
5.3 坐标偏移:叠加底图后路网跑到县界外面去了
现象:把陕西公路shp拖进QGIS,配上在线卫星底图,发现公路全部漂移,和底图上的实际道路位置差了几百米。
原因:shp本身是Xian 1980或Beijing 1954坐标,而在线底图是WGS84 Web墨卡托。两者之间的椭球体、投影方式都不一样,直接叠图当然会偏。
解决:在图层属性里重新指定CRS,把原始坐标系填正确。如果shp自带.prj文件,先用“重投影图层”转到EPSG:3857再叠加。注意不要用“在图层属性里改显示坐标系”的方法,那只是临时把坐标显示成3857,几何坐标没变,偏移还在。重投影之后再做一次可视化比对,以某条高速的互通立交位置为参照点,确认能对上。
5.4 属性字段长度不够,导出后路线名称被截断
现象:属性表里明明写着“G65包茂高速陕西段”,导出成shp或者转进MapGIS后变成了“G65包茂高速”。
原因:源数据的dbf字段长度限制了字符串写入。原始字段长度是25,写不下全称,或者不同数据源拼接时字段结构不统一,合并时短字段截断了长字段。
解决:在QGIS属性表里检查字段定义,打开“字段管理”看字符长度。合并多个shp之前,先用“保留字段”或“字段管理”把具体字段长度统一调大到最长的值,比如50或100。执行合并后再检查一遍属性表中有没有出现星号或乱码。这个步骤很短,但能避免让上级部门误读路名。
5.5 拆分图层后总量对不上:筛选表达式写错导致人为丢失
现象:把陕西公路shp拆成高速、国道、省道三个层后,三层要素数量之和小于原始总要素数。
原因:等级字段中除了这三种之外,还有县道、乡道、村级公路和“未知”记录。你只选中三类导出,其他要素自然不在这三个文件里。还有一种情况是等级字段里存在空格,例如“高速公路 ”比“高速公路”多了一个空格,筛选时没匹配到。
解决:先用“全部唯一值检查等级字段,确定所有取值。如果发现带空格的值,先用字段计算器替换掉。表达式为replace(“grade”, ‘ ‘, ”),重点看前后是否有空格。处理完再做拆分,导出后数字加和能对上。
6. 把分级路网做成能交付的图:快速符号化与出图前的验证习惯
6.1 按等级符号化的推荐参数
拆分后的各等级线层,用QGIS图层属性的“符号化”做分类渲染。选择一个单线符号,然后点击“分类”按钮,值选“等级”字段。QGIS会根据全文和中英文的名字自动生成图例项,但线型、颜色、宽度需要你手工调。
我常用的参数表如下:
| 等级 | 颜色 | 线宽 | 线型 | 备注 |
|---|---|---|---|---|
| 高速公路 | 红色 | 1.8 | 实线 | 若重叠,可加白边 |
| 国道 | 橙色 | 1.2 | 实线 | |
| 省道 | 蓝色 | 0.8 | 实线 | |
| 县道 | 绿色 | 0.5 | 虚线 | |
| 乡道 | 灰色 | 0.3 | 点划线 | 可以关闭显示 |
设置完后点“应用”,检查高速和国道是否有互相遮挡。因为高速和国道在空间上有共用路段,比如某些大桥既是高速又是国道,所以原始数据里会有两条重叠的线,渲染时顶层会压住下层。这是正常现象。如果你不想让高速和国道重叠显示,可以在样式里给高速加一个白色描边,宽度调到2.6,制造出“外边距”的效果,图面更清楚。
6.2 用字段计算器给路线加标签
给高速和国道标注路线编号,需要用到标签功能。在图层面板双击“高速”层,“标签”选项卡里选择“单个标签”,值选“road_name”。设置字体大小8号,加粗,颜色黑色,并勾选“仅在图上不重叠时显示”来防止文字挤成一团。
如果数据里有单独的路线编号字段,比如“G65”“G210”,值就用编号字段。如果没有完整编号,可以用字段计算器拼出一个带前缀的字符串。表达式如下:
'G' || "route_number" || ' ' || "road_name"这段表达式的意思是:前部固定一个G字符,中间连接路线编号字段,空一格,再接路线名称。注意在QGIS中字符串连接符号是||,不是Excel里的&。如果route_number本身包含“G”字符,表达式中的前缀G会导致重复标签,这种情况下直接用“route_number”字段本身就好。
导出图片时,用“工程”菜单的“导出为图片”或“打印布局”。打印布局里最需要设置的是比例尺参数,而不是地图分辨率。选择“根据地图范围”或者“根据画布尺寸”都行。出图比例尺选1:500000,适合展示全省路网态势。如果要展示局部城区细节,比例尺调到1:50000,同时把路网图层中乡道取消勾选,避免密集得看不清。
6.3 交付前最后一次验证:把每一条高速都从起点到终点走一遍
我见过太多人在最后交付时才发现sipline把某段高速的字段等级写成了“公路等级”而不是“等级”,导致整张分类图全部变成一种颜色。所以最后一道工序,我会在QGIS里全程目检一遍高等级路网。
翻开“高速”的图层属性,打开“特征显示”下的“显示所有要素”,框选全陕西省,放大到县级视线,沿着G65包茂高速、G70福银高速、G30连霍高速的轴线逐个审视。检查是否有突然中断、变细、颜色被其他图层覆盖的地方。如果发现断线,右键进入编辑状态,使用“线要素切割合并”或“节点编辑”手工拼接。
这一步做完,把图层属性里的“CEPSG:5329”“EPSG:4528”这类坐标编号记录到交付说明文档里,因为你转出去的shp如果别人用别的GIS打开,至少要能看懂坐标系规范。这一点要养成习惯,写进项目备注。这个习惯帮我避免过太多次返工。希望帮到你。
本文还有配套的精品资源,点击获取