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

资讯详情

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

重庆乡镇道路矢量数据解析:从shapefile到PostGIS的路网分级提取

重庆乡镇道路矢量数据解析:从shapefile到PostGIS的路网分级提取 简介面向GIS分析、城市规划与地图制图的重庆市道路线要素矢量数据包按“各级城市道路、行政等级道路、OSM来源道路”三套分类体系组织共16种线类型图层。数据既包含城市一级至四级道路也覆盖高速、国道、省道、县道、乡道另有OSM派生的铁路与道路细分图层铁路层涵盖铁路、轻轨、窄轨、地铁等道路层涵盖主干道、次干道、人行道、自行车道等可满足多尺度路网展示与基础查询需求。压缩包共97个文件核心为12组Shapefile矢量数据每组均含shp、shx、dbf、prj、cpg、xml、sbn、sbx等配套文件另有1张预览图整体约53.88MB可直接加载到ArcGIS、QGIS等桌面GIS平台进行属性查询、符号化与出图。整体分级较细且多个来源之间既有重复也有相互补充适合用于道路数据对比校验、路网密度分析或教学案例。目前已有597人浏览学习。1. 这份 .rar 里装的不是地图包是一套可运行的乡镇路网数据做区域规划、物流调度的朋友应该都遇到过这种场景上级要求“把全区乡道以上的路网底图拉出来”你打开在线地图平台导出的大多是一张没法计算的图片或者按级导出的路网在镇街级就断头了。这份“重庆市道路数据最新分级精确到乡道矢量数据.rar”指向的其实是一套矢量路网数据——包含高速公路、国道、省道、县道、乡道五个层级的线状要素精确到乡镇级别文件格式是标准的 shapefile 三件套包成一个 rar 压缩包分发。它的价值在于能直接拖进 QGIS 制图、能用 ogr2ogr 转坐标、能按字段筛选出某一条乡道做分析。今天这篇就把这套数据的结构、解压后的检查流程、分级提取方法和常见坑一次性讲透新手照着做能出图熟手也能从中看到数据层面的几个关键边界。2. 矢量路网数据的底层结构shapefile、要素类与字段分级2.1 一份 .shp 文件实际上是多文件协同缺一个都打不开拿到 .rar 先别急着双击解压。先想清楚一个前提shapefile简称 shp不是单文件格式它是一组同名不同扩展名的文件集合。最少需要 .shp几何信息、.shx几何索引、.dbf属性表三个文件才能被 GIS 软件正常加载。日常解压时常见的问题就是解压工具只解出了 .shp 和 .shx漏掉了 .dbf结果 QGIS 加载后线是画出来了但一打开属性表空白字段名全部丢失。所以解压后第一步是检查文件完整度。# 在 macOS / Linux 下检查解压后的必需文件 ls -lh /path/to/chongqing_roads/ # 期望看到至少这三个文件 # chongqing_roads.shp chongqing_roads.shx chongqing_roads.dbf # 如果有 .prj表示带了坐标系定义 # 如果有 .cpg表示属性表字符编码声明通常是 UTF-8 或 GBK提示Windows 下用 WinRAR 或 7-Zip 解压时建议先“解压到当前文件夹”而不是“直接打开”防止 rar 内文件路径过深导致 shp 配套文件被分散到不同目录。2.2 道路等级在矢量数据里不是“画出来的”是“字段写出来的”矢量路网的“分级”本质上是在属性表里用一个整数字段区分。常见的设计是字段名为kind、class或type数值含义大致为1 代表高速2 代表国道3 代表省道4 代表县道5 代表乡道。也有直接存中文文本的情况比如字段lb的值为“国道”“乡道”这样的字符串。这套重庆市的数据我估计用的是数值型分级因为精确到乡道的路网数据如果直接存中文文件体积会膨胀不少而且在某些命令行工具下会出现编码问题。解压之后第一件事不是急着看图形而是用 ogrinfo 快速查看属性字段和字段类型。# 查看矢量数据图层信息与字段列表 ogrinfo -so /path/to/chongqing_roads/chongqing_roads.shp layerinfo # 通常会输出Geometry: Line StringFeature Count: n # 然后列出所有字段名、字段类型和宽度看到输出里带OGRFeatureCount几万条线字段列表里有至少一个名为kind或Grade的整型字段就说明这份数据在结构上是可用的。之后所有分级提取、符号化、统计长度全部围绕这个字段做文章。2.3 坐标系是这套矢量数据最容易翻车的地方重庆本地常用的坐标系有 CGCS2000国家大地坐标系、西安 80、北京 54以及 WGS84。如果 .prj 文件存在QGIS 打开时能自动识别坐标系但很多网友共享的 rar 包为了压缩体积故意删掉 .prj导致数据默认以未知坐标系加载叠加底图时偏离实际位置几公里到几十公里不等。判别方法很简单先看高速和国道的走向是否与真实地理特征吻合——重庆主城区长江、嘉陵江两江交汇的位置如果明显对不上基本就是坐标系缺失或投影设置错误。我一般会这样处理先用 ogr2ogr 对这套数据做一次强制坐标系转换把数据统一到 WGS84 经纬度。这样做的好处是后面接在线底图OSM、天地图不会跑偏。ogr2ogr -t_srs EPSG:4326 \ -overwrite \ /path/output/chongqing_roads_wgs84.shp \ /path/to/chongqing_roads/chongqing_roads.shp参数作用-t_srs EPSG:4326输出到 WGS84 经纬度坐标系-overwrite目标文件存在时自动覆盖避免二次运行报错-lco ENCODINGUTF-8可选参数如果属性表出现中文乱码时加这个3. 用 QGIS 和 GDAL 做道路分级提取武汉重庆同样适用3.1 先建立一套通用的“分级-符号化”工作流这套重庆路网数据无论后续是入库还是出图第一步永远是分级。不要拿一整条路网直接做分析因为乡道和高速混在一起长度统计、缓冲区分析全部失真。QGIS 里操作路径是这样的加载图层打开属性表用表达式选中某一等级然后右键图层“导出-保存所选要素”。表达式写法如下kind 5选中后会在状态栏看到“共选中 n 个要素”如果 n 为零别急换成文本字段重试type LIKE %乡道%提示LIKE写法在 dbf 字段里可靠但如果字段值前后有空格LIKE %乡道%带两端的%通配符才能命中。3.2 用 ogr2ogr 一步到位做分级导出写进脚本批量处理GUI 里鼠标点击适合一次性出图但做数据交付时命令行批量处理效率高得多。下面的脚本一口气把高速、国道、省道、县道、乡道五个层级分别导出成独立的 shapefile并按等级在文件名上标注#!/usr/bin/env bash # 按 kind 字段分级导出重庆道路矢量数据 BASE/path/output for lvl in 1 2 3 4 5; do case $lvl in 1) nameexpressway ;; 2) namenational ;; 3) nameprovincial ;; 4) namecounty ;; 5) nametownship ;; esac ogr2ogr -where kind $lvl \ -t_srs EPSG:4326 \ -lco ENCODINGUTF-8 \ $BASE/chongqing_roads_${name}.shp \ /path/chongqing_roads.shp # 输出每个层级的要素数量 ogrinfo -so $BASE/chongqing_roads_${name}.shp layerinfo | grep Feature Count done这段脚本核心是-where kind $lvl它直接在 OGR 层做属性过滤导出后每条线的要素数量会跟着减少。参数说明case分支把数字编码换成英文名方便后续在 GIS 里一眼识别-lco ENCODINGUTF-8解决中文字段名和属性值的乱码问题最后用ogrinfo看每个层级要素数量确认过滤生效。乡下路段数明显多于国道是正常的——乡道的特征是“数量大、单条短、分布碎”。3.3 坐标系转换里隐藏的两个常见位置偏移陷阱一是“定义但转换失败”数据本身是 CGCS2000 高斯投影EPSG:4499你直接 ogr2ogr 转 WGS84中间不做-s_srs指定OGR 会因为读取 .prj 失败而把源数据当成经纬度处理输出的道路会变成几乎不可用的乱码。遇到这种情况先强制指定源坐标系再转ogr2ogr -s_srs EPSG:4499 -t_srs EPSG:4326 \ /path/output/roads_4326.shp \ /path/chongqing_roads.shp二是“投影坐标当经纬度”部分矢量数据 .prj 被误删但属性表里的坐标数值范围是 500000 到 36400000 这样的大数这是典型的平面投影坐标比如 6 度带高斯投影。此时如果用没有-s_srs的命令转换出来的图形会缩成一个点。先ogrinfo -al -so看坐标范围范围再回推正确坐标系。4. 实战把重庆乡道数据接进 PostgreSQL实现按行政区裁剪和路网密度分析4.1 用 shp2pgsql 把 rar 解压出来的数据灌进 PostGIS做到这一步我们已经把 rar 包里的数据处理成了可用的 WGS84 路网图层。接下来一个大动作是入库。用 PostGIS 处理路网数据能借用 SQL 做空间过滤、拼接、密度计算比桌面 GIS 处理几万条线要可靠得多。先把 shp 批量灌进 PostgreSQL注意字符编码和几何字段名。shp2pgsql -s 4326 -W UTF-8 -g geom \ /path/output/chongqing_roads_wgs84.shp \ public_roads | psql -U postgres -d chongqing_gis -h localhost参数作用-s 4326源数据坐标系编码强制指定为 WGS84-W UTF-8指定 dbf 属性表的字符编码中文乱码时改 GBK 重试-g geom指定 PostgreSQL 表中的几何字段名为 geom-d可选如目标表已存在则先删除重建导入后建议立刻建空间索引和数据完整性检查CREATE INDEX idx_roads_geom ON public_roads USING GIST (geom); -- 验证几何有效性返回 0 说明没坏线 SELECT COUNT(*) FROM public_roads WHERE ST_IsValid(geom) false;4.2 按重庆区县和乡镇边界裁剪乡道数据做物流网络评估或路网规划时经常需要只看某一个区或某几个乡镇的路网。重庆是直辖市区县界面数据在公开地图平台大多能找到。两套数据都入库后用一条 SQL 就能完成裁剪不必再回 QGIS 用“裁剪工具”等半天。-- 假设已有 qx_boundary 表存区县边界name 字段为区县名 SELECT r.* FROM public_roads AS r JOIN qx_boundary AS b ON ST_Intersects(r.geom, b.geom) WHERE b.name 渝北区 AND r.kind 5; -- 只看乡道逻辑说明ST_Intersects会先把渝北区的边界读出来再把与该边界相交的所有乡道线筛出来性能靠上一步建的 GIST 索引撑住。如果要导出结果直接用pg_dump加--table导出该表或者再ogr2ogr从 PostGIS 读出来转 shapefile。4.3 计算指定乡镇的路网密度检验数据的“精确到乡道”成色“精确到乡道”不应只体现在图层里画了多少条线还应该能在计算层面兑现。以某乡镇为例路网密度等于该乡镇内所有道路的累计长度公里除以区域面积平方公里。注意这里要用带度量的投影坐标系不能在 WGS84 经纬度上直接算长度否则动辄 5%-15% 的缩水。WITH town_geom AS ( SELECT geom FROM xzq_bnd WHERE name 某某镇 ), road_clip AS ( SELECT ST_Intersection(r.geom, t.geom) AS geom FROM public_roads AS r, town_geom AS t WHERE ST_Intersects(r.geom, t.geom) ) SELECT (SELECT SUM(ST_LengthSpheroid(geom, SPHEROID[WGS84,6378137,298.257223563])) / 1000.0 FROM road_clip) AS total_km, (SELECT ST_Area(t.geom) FROM town_geom t) / 1000000.0 AS area_km2;提示ST_LengthSpheroid在椭球体上计算真实距离比平台自带的投影长度准。如果这套数据的精度到乡道层级算出来的乡镇路网密度应该落在 0.5-2.5 之间低于 0.3 或者高于 5 基本可以判定数据有缺失或几何错误。5. 进阶技巧用 MD5 校验数据和识别“换皮数据”防误用假更新拿到一个写着“最新”的 rar 包先别直接替换旧数据。一个非常值得做的操作是对新旧两套矢量图层做特征比对防止纳入了只有坐标抖动、实际路网没有变化的“换皮数据”。具体做法是计算几何哈希对每条道路的起点、终点坐标向下取整到 3 位小数约 100 米精度再拼接字段值计算 MD5。如果整体非常相似说明没什么变化。日常巡检还可以用 QGIS 内的“拓扑检查”快速定位断头线。选择 Geometry Checker 插件规则选“Line endpoints”并设置容差把乡道级别全部跑一遍。乡道因为山区地形复杂的缘故按经验会有少量断头线比例在 2%-5% 算可接受如果超过 10% 就要回到原始数据看是否存在抽取过程中的字段级误筛选。最后提醒一个与 rar 本身相关的细节解压密码和压缩包本身都可能成为资料交换的障碍。实际工作中拿到 rar 后建议立刻用一个固定目录解压并把 .shp 转成 GeoPackage.gpkg单文件格式保存GeoPackage 支持空间索引且不怕缺伴生文件出错概率比 shapefile 低得多。转换命令一行搞定ogr2ogr -f GPKG chongqing_roads.gpkg chongqing_roads_wgs84.shp后续每次分析直接连 .gpkg 就行rar 这个传输载体完成使命后就可以归档了。本文还有配套的精品资源点击获取
返回列表