尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

主要公路shp数据处理全攻略:从文件识别到路网分析

发布时间:2026/9/26 8:27:07

资讯中心
01
ARTICLE

主要公路shp数据处理全攻略:从文件识别到路网分析

主要公路shp数据处理全攻略:从文件识别到路网分析
简介这份国家基础地理信息系统数据集面向GIS学习者、城市规划与交通研究人员以及需要中国基础地理底图做空间分析的从业者提供一套可直接加载的SHP矢量数据解决行政边界、路网、水系等要素获取零散、格式不统一的问题。压缩包共93个文件约10.63MB以shp、shx、dbf、prj、sbn、sbx等Shapefile配套文件为主另有少量xml元数据其中shp存储几何图形dbf承载属性字段prj定义坐标投影shx与sbn/sbx负责索引便于在ArcGIS、QGIS等软件中直接读取与空间查询。内容覆盖主要公路、铁路、河流、湖泊、国界与省县地州界、省会及县城驻地、经纬网并附全国县级统计数据可支撑交通规划、行政区划统计、生态与水资源研究等场景。目前已有1943人学习下载适合作为课程实验、论文制图与项目底图的数据基础。1. 从一份 foreste75 的 shp 说起主要公路数据到底怎么用手上拿到一个压缩包名字叫「国家基础地理信息系统数据.zip」解压后目录里躺着foreste75这个前缀的一堆文件其中有一份是主要公路 shp。很多人第一反应是双击结果发现打不开或者用 Excel 打开全是乱码。这不是文件坏了是 shp 本来就不是单文件格式它是一组同名文件凑在一起才能被识别的矢量数据。地理信息系统里shp 是最常见的交换格式之一主要公路图层通常包含道路等级、名称、走向这些属性能直接拿来做路网分析、底图叠加、专题制图。这篇面向的是手里已经有这份数据、或者准备去找同类主要公路 shp 的从业者从文件识别、坐标系判断、属性表解读一路讲到导入、裁剪、导出和踩坑。新手能照着命令跑通熟手能对参数边界心里有数。先别急着上 ArcGIS把文件本身看清楚后面少走一半弯路。2. 拆开 foreste75 这组文件shp 到底由哪些东西组成2.1 同名不同后缀少一个都读不出来shp 是 Esri 定义的矢量数据交换格式一个完整的 shapefile 至少由三个文件组成缺一不可。很多人只拷贝了.shp就发给同事对方打开报错「缺少 .dbf」或者「无法读取几何」血泪经验基本都栽在这一步。后缀作用缺失后果.shp存储几何图形点、线、面坐标完全无法打开.shx几何图形的索引记录每条要素在 shp 中的偏移部分软件能读大文件会报错.dbf属性表存道路名称、等级等字段几何能显示但属性全空.prj坐标系定义WKT 文本坐标值还在但位置会飘到海里.cpg属性表字符编码中文道路名变乱码foreste75这个前缀大概率是数据生产时的项目代号或分幅编号不影响读取但要注意同一目录下可能有多个同名不同前缀的图层别把foreste75和foreste76的 shp 混着拷。判断文件是否完整最直接的办法是看文件大小。.shp通常最大.shx约为 shp 的 1/8 到 1/100.dbf大小取决于字段数和要素数。如果.shx是 0 字节基本可以判定文件损坏或拷贝中断。提示拿到压缩包先别解压到中文路径或带空格的目录部分老版本软件对路径编码敏感容易出玄学问题。2.2 用命令行先验一遍再决定用哪个工具在动手导入之前我一般先用 GDAL 的命令行工具做一次体检比直接开图形界面快得多。GDAL 是地理信息系统领域最通用的底层库QGIS、ArcGIS、PostGIS 导入 shp 时底层大多走它。# 查看 shp 的基本信息几何类型、要素数、坐标系、字段 ogrinfo -so -al foreste75_road.shp # 只看坐标系定义 gdalsrsinfo foreste75_road.shp # 统计要素数量确认没有空几何 ogrinfo -sql SELECT COUNT(*) FROM foreste75_road foreste75_road.shpogrinfo -so输出摘要信息-al表示列出所有图层。重点看三行Geometry是 Line String 还是 MultiLineStringFeature Count要素总数Layer SRS坐标系。如果 SRS 显示(unknown)说明.prj缺失或内容为空这时候不能直接叠加到其他数据上必须先确定坐标系。gdalsrsinfo会把.prj里的 WKT 解析成 EPSG 代码。国内主要公路数据常见的是 CGCS2000EPSG:4490或者带高斯投影的 CGCS2000 3 度带也可能是 WGS84 经纬度EPSG:4326。如果解析出来是projlonglat datumWGS84那就是经纬度单位是度如果是projtmerc那就是投影坐标单位是米。单位搞错后面做缓冲区、算长度全错。2.3 属性表里哪些字段值得留主要公路 shp 的属性表通常有十几个字段但真正有用的就那么几个。用ogrinfo不带-so可以看前几条记录ogrinfo -al -geomNO foreste75_road.shp | head -60常见字段和含义NAME或ROAD_NAME道路名称中文时注意.cpg是否声明为 UTF-8CLASS或ROAD_TYPE道路等级国道、省道、高速等CODE道路编号如 G318、S101LENGTH预计算长度单位取决于坐标系Shape_LengArcGIS 自动生成的几何长度字段如果.dbf里中文显示为????先别改数据检查.cpg文件内容。正常应该是UTF-8或GBK。没有.cpg时GDAL 默认按 Latin1 解析中文必乱。解决办法是手动创建.cpg写入UTF-8或者导入时指定编码。注意不要用 Excel 直接打开.dbf再保存Excel 会截断字段名到 10 个字符并可能改变编码这是最常见的「改坏数据」操作。3. 把主要公路 shp 导进 GIS坐标系、编码、字段三步走3.1 坐标系判断没有 prj 时的补救办法.prj缺失是拿到二手数据时的高频问题。没有坐标系定义数据不是不能用而是不能直接和其他图层叠加。判断原始坐标系有几个线索第一看坐标数值范围。用ogrinfo看第一条要素的坐标如果 X 在 70 到 140 之间、Y 在 15 到 55 之间基本是经纬度。如果 X 是六位数、Y 是七位数那是高斯投影前两位是带号。第二看数据来源。国家基础地理信息系统的公开数据近年多为 CGCS2000。如果是老数据可能是西安80或北京54。第三用已知点位反推。找一条明显的高速公路比如京港澳高速某段把坐标丢到在线地图上比对偏差在几十米内说明坐标系接近。确定之后用gdal_edit.py直接给 shp 写入坐标系不用重新投影# 给缺失 prj 的 shp 补上 CGCS2000 地理坐标系 gdal_edit.py -a_srs EPSG:4490 foreste75_road.shp # 如果是 CGCS2000 3 度带带号为 39中央经线 117 度 gdal_edit.py -a_srs EPSG:4547 foreste75_road.shp-a_srs是 assign SRS只写定义不改坐标值。如果原始坐标确实是经纬度写 EPSG:4490 就对了。如果原始坐标是投影坐标写对应的投影 EPSG。写错的话数据位置会整体偏移但几何形状不变。如果确定要转换坐标系比如从 CGCS2000 经纬度转成 Web 墨卡托给网页用用ogr2ogrogr2ogr -t_srs EPSG:3857 foreste75_road_3857.shp foreste75_road.shp-t_srs是目标坐标系源坐标系从.prj读取。这一步会真正重算坐标值要素形状在投影变形下会有变化但位置正确。3.2 编码问题中文道路名乱码的三种修法中文乱码是主要公路 shp 最烦人的问题之一。现象是属性表里道路名显示为「瀹夊窘」或者「????」。原因分三种第一种.cpg缺失GDAL 按 Latin1 读。解决创建.cpg文件写入UTF-8。echo UTF-8 foreste75_road.cpg第二种.cpg写的是GBK但实际内容是 UTF-8。解决改.cpg为UTF-8。第三种.dbf本身是 GBK 编码.cpg也写 GBK但 QGIS 按 UTF-8 读。解决在 QGIS 图层属性里手动指定编码为 GBK或者用ogr2ogr转成 UTF-8ogr2ogr -lco ENCODINGUTF-8 foreste75_road_utf8.shp foreste75_road.shp-lco ENCODINGUTF-8是图层创建选项输出文件按 UTF-8 写.dbf和.cpg。这一步不改变几何只重写属性表编码。提示如果只是自己看QGIS 里改显示编码就行如果要发给别人或入库务必用ogr2ogr转成 UTF-8避免对方环境不同再次乱码。3.3 导入 PostGIS 和导出 GeoJSON 的最小命令主要公路数据要拿来做空间查询或 Web 展示通常需要入库或转格式。PostGIS 是 PostgreSQL 的空间扩展适合做路网分析。# 导入 PostGIS指定坐标系和编码 ogr2ogr -f PostgreSQL PG:hostlocalhost dbnamegis userpostgres passwordxxx \ foreste75_road.shp \ -nln road_main \ -lco GEOMETRY_NAMEgeom \ -lco FIDgid \ -a_srs EPSG:4490 \ -lco ENCODINGUTF-8-nln是目标表名-lco GEOMETRY_NAME指定几何字段名-lco FID指定主键字段名。导入后可以用 SQL 直接算长度、做缓冲区。导出 GeoJSON 给前端用ogr2ogr -f GeoJSON -t_srs EPSG:4326 foreste75_road.geojson foreste75_road.shpGeoJSON 默认用 WGS84 经纬度所以-t_srs EPSG:4326是必须的。如果原始数据是投影坐标不转直接导出前端地图上位置会偏到几千公里外。3.4 裁剪和筛选只要某个区域的主要公路全国主要公路数据动辄几十万条要素做局部分析时先裁剪能省大量时间。用ogr2ogr配合-clipsrc或者-spat# 按矩形范围裁剪范围是经纬度 minX minY maxX maxY ogr2ogr -spat 116.0 39.5 117.0 40.5 foreste75_road_bj.shp foreste75_road.shp # 按另一个 shp 的边界裁剪 ogr2ogr -clipsrc boundary.shp foreste75_road_clip.shp foreste75_road.shp-spat是空间矩形过滤只保留与矩形相交的要素不切割几何。-clipsrc会真正切割几何边界外的部分被裁掉。如果只是要某省的道路用-clipsrc更干净。按属性筛选比如只要国道ogr2ogr -where CLASS国道 foreste75_road_g.shp foreste75_road.shp-where后面跟 SQL WHERE 子句字段名和值要跟.dbf里完全一致大小写敏感。不确定字段值时先用ogrinfo -al -geomNO看几条记录。4. 主要公路 shp 处理避坑五个让我返工的血泪记录4.1 现象导入后道路位置整体偏移几百米原因坐标系定义写错。最常见的是把 CGCS2000 经纬度当成 WGS84 直接用两者在国内差异虽然只有几十米但叠加到高精度底图上会明显错位。更严重的是把投影坐标当经纬度偏移能到几千公里。解决用gdalsrsinfo确认原始坐标系不确定时找已知点位比对。写入.prj时用gdal_edit.py -a_srs不要手动编 WKT。如果已经导入数据库用UpdateGeometrySRID修正。4.2 现象属性表中文全是问号改 cpg 也没用原因.dbf文件本身已经被 Excel 或某些工具改写过编码信息丢失原始字节被替换成?。这种情况下数据已经损坏改.cpg无法恢复。解决从原始压缩包重新解压不要用 Excel 打开.dbf。如果原始数据就是问号联系数据提供方。日常操作中查看.dbf用ogrinfo或 QGIS编辑用 QGIS 字段计算器不要碰 Excel。4.3 现象ogrinfo 报「Unable to open datasource」原因路径问题或文件不完整。路径含中文、空格、特殊字符时部分 GDAL 版本解析失败。文件不完整时.shx缺失或 0 字节。解决把数据放到纯英文无空格路径下比如/data/road/。检查.shp、.shx、.dbf三个文件是否都存在且非零。用ls -la看文件大小.shx明显偏小说明拷贝不完整。4.4 现象裁剪后要素数量没变但几何被切碎了原因-clipsrc会切割跨越边界的线要素一条路被切成两段要素数增加。如果边界 shp 本身有拓扑错误自相交、空洞切割结果可能异常。解决裁剪前先用ogrinfo -sql SELECT ST_IsValid(geom) FROM boundary检查边界有效性无效的用 QGIS 修复几何。如果不想切割用-spat做矩形过滤或者用-clipsrc加-clipsrclayer指定图层。4.5 现象导入 PostGIS 后查询慢没走空间索引原因ogr2ogr导入时默认不建空间索引或者几何字段的 SRID 与查询条件不一致。解决导入后手动建索引CREATE INDEX idx_road_main_geom ON road_main USING GIST (geom);查询时确保 SRID 匹配比如WHERE ST_Intersects(geom, ST_Transform(ST_GeomFromText(POINT(116.4 39.9), 4326), 4490))。SRID 不匹配时 PostGIS 会报错或全表扫描。5. 从主要公路 shp 到路网分析一个可复用的进阶套路拿到主要公路 shp 只是起点真正有价值的是把它变成可计算的路网。我一般会走一条固定链路shp 入库 → 拓扑检查 → 打断交叉 → 建网络数据集 → 做最短路径或服务区分析。这里说几个关键技巧。拓扑检查用 QGIS 的「拓扑检查器」或者 PostGIS 的ST_IsValid。主要公路数据常见问题是悬挂节点断头路和自相交。悬挂节点不一定是错误可能是数据分幅导致但做路网分析前必须处理否则路径算不通。打断交叉用ST_Node或者 QGIS 的「线段相交」工具。原始 shp 里两条路交叉但没打断网络分析时无法在交叉口转向。打断后每条路段成为独立边节点自动生成。建网络数据集PostGIS 用 pgRouting 扩展-- 创建拓扑 SELECT pgr_createTopology(road_main, 0.0001, geom, gid); -- 最短路径查询 SELECT * FROM pgr_dijkstra( SELECT gid AS id, source, target, ST_Length(geom::geography) AS cost FROM road_main, (SELECT source FROM road_main ORDER BY ST_Distance(geom, ST_SetSRID(ST_MakePoint(116.4, 39.9), 4490)) LIMIT 1), (SELECT target FROM road_main ORDER BY ST_Distance(geom, ST_SetSRID(ST_MakePoint(116.5, 39.95), 4490)) LIMIT 1), false );pgr_createTopology的第二个参数是容差单位与坐标系一致。经纬度数据用 0.0001 度约等于 10 米投影坐标用 10 米。容差太大会把不该连的节点合并太小会漏连。ST_Length(geom::geography)把几何转成地理类型算真实米数比直接算平面长度准确尤其在高纬度地区。如果数据是投影坐标直接用ST_Length(geom)即可。注意pgRouting 的cost字段必须是正数且网络不能有孤立节点。建拓扑后用pgr_analyzeGraph检查连通性有孤立段就回到打断步骤重新处理。导出分析结果回 shp 或 GeoJSON用ogr2ogr反向操作即可。如果结果要给人看建议导出 GeoJSON 配 Leaflet 或 Mapbox 展示比静态图直观。最后说一个我自己的习惯每次处理完主要公路 shp都会把原始文件、处理脚本、坐标系说明、字段字典放在同一个目录写一个README.md记下数据来源和处理步骤。返工的时候不用重新猜直接看记录。这个习惯帮我省了至少三次全量重做。希望帮到你。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。