☰
全国地貌shp实用指南:坐标系检查、裁剪与格式转换
2026/10/8 4:37:25 网站建设 项目流程

简介:全国地貌分布shp矢量图层数据面向GIS从业者、城乡规划与地理科研人员,提供全国尺度、可直接使用的地貌分类空间数据。数据采用shapefile格式,内含地貌代码、地貌类型等关键属性字段,辅以投影信息与说明文档,可用于专题制图、地貌分类统计及多要素空间叠加分析。包体共10个文件,核心为shp矢量文件,dbf属性表存储地貌分类字段,prj定义坐标系,mxd为ArcGIS工程文件,doc为数据说明,shx与sbn分别记录几何索引与空间索引,整体可快速导入主流GIS平台使用。全包仅6.17MB,结构精简,便于本地存储与共享;已有397人学习下载,适合需要规范化的基础地理数据的项目与课堂实践。通过该数据可减少自行采集、配准与分类的重复工作,直接获得带属性、带投影的全国地貌图层,并依据说明文档理解字段含义与数据来源,免去前期处理的繁琐环节。

1. 全国地貌分布shp:一张矢量图看清中国地形,但细节决定成败

做地质灾害评价、国土空间规划或者区域生态研究时,第一份要搞到手的数据往往就是全国地貌分布shp——它把陆地按起伏程度拆成山地、丘陵、台地、平原等类型,每个多边形都带类型代码和面积字段,叠加省界就能直接出专题图。但这份矢量图层数据绝不是拖进GIS就完事的:坐标系声明缺失、属性字段乱码、边界和地形对不齐,是拿到数据后最先撞上的三件事。这篇笔记按我做项目的顺序来写,从数据检查、符号化渲染、按行政区裁剪,到dwg转shp、导出WKT这类下游格式转换,把能直接照抄的参数和容易翻车的细节都摆在桌面上。适合正在做地貌相关项目、刚下载这份shp或者准备把它整合进现有图件的从业者。

2. 先别急着画图:坐标系、属性表与图层完整性检查

2.1 三种常见坐标系:WGS84、CGCS2000与Albers等面积投影

全国地貌shp的坐标系不像普通路网数据那么统一。市面上的数据源常见三种:CGCS2000地理坐标系、WGS84地理坐标系,以及Albers等面积投影。做全国尺度面积统计时Albers投影误差最小,但和在线底图叠加时它又是异类。拿到文件第一步不是打开地图,而是先看投影声明——很多从网盘或老GIS系统里流出来的数据,.prj文件是缺失的。

用GDAL自带的ogrinfo可以快速摸清底细,比打开ArcGIS属性快得多:

# 查看shp文件的完整元数据:范围、要素数、投影 ogrinfo -so landform.shp landform # 如果只关心投影,直接读.prj文件(纯文本WKT格式) cat landform.prj

-so参数表示只输出概要信息(summary only),不会把几万个多边形的属性全打出来。ogrinfo输出里重点看三点:Extent(范围对不对,全国数据纬度应该在18°~54°N,经度73°~135°E)、Geometry(是MultiPolygon还是Polygon,这会直接影响后续融合和转换)、CRS(有没有投影声明)。如果cat landform.prj显示文件不存在,说明这是一份没有投影信息的裸shp——后面所有叠加分析都会出问题。

2.2 属性表结构:类型代码、类型名称与面积字段怎么读

地貌shp的核心价值在属性表。打开属性表后,常见字段长这样:type_code(数字代码,如21代表低海拔丘陵)、type_name(中文名称如“平原”“台地”)、area_km2(多边形面积)。如果字段名是拼音缩写或者一串数字,别慌,这是老数据常规操作,对照图例说明就能解码。

用ogrinfo读取字段结构:

# 查看属性表字段名和类型,不输出几何 ogrinfo -al -so landform.shp

-al表示所有图层,-so仍然是概要模式。输出会列出FieldName: type_code (Integer)这样的字段清单。注意:如果字段值全是(null),先怀疑编码或字段名问题,别急着拿空属性表做渲染——常见原因在第五章的排查清单里。这里我一般会顺手做一次字段统计:ogrinfo -al -sql "SELECT type_code, count(*) FROM landform GROUP BY type_code" landform.shp,看每个代码有没有对应记录,顺便确认类型代码不是断码。

2.3 边界对不齐:地貌图层和行政区边界叠不上的三种原因

把地貌shp拖进QGIS,再叠一个省界shp,很多人会发现边界对不齐。这不一定是数据坏了。最常见的原因是数据源本身是基于DEM栅格分类得到的矢量,像元分辨率直接决定了边界精度——30米分辨率DEM分出来的地貌边界,和省界吻合度当然好;如果是1公里分辨率的全球数据,边界差几百米甚至几公里都正常。

第二个原因是坐标系不统一。省界用CGCS2000,地貌shp是WGS84,两者差值虽然只有几十米,放大到1:5万比例尺下就很明显。第三个原因是数据时相不一致——老版地貌数据提取时用的DEM和现在的基准地理底图有系统性偏差。

提示:先投影后分析。全国尺度项目我一般统一投影到Albers等面积(EPSG:102025类参数),省级或市级项目转Gauss-Krüger 3度带,千万别保留地理坐标直接算面积。

排查方法也简单:把两个图层叠在一起,量几条横跨边界线的偏移量。如果偏移量稳定在几十米内,属于正常系统差,出图时以省界为准裁掉就行;如果偏移随位置变化、忽大忽小,那就要怀疑几何本身有问题,用接下来第四章的裁剪流程处理前先做一次几何修复。

3. 用QGIS加载并渲染全国地貌shp:最小流程与出图设置

3.1 拖拽加载与加载失败的快速判断

QGIS里加载shp最直接的方式是把文件拖进图层区。如果拖拽没反应,先看右下角信息栏有没有报错。我见过太多人把.shp文件拷走就以为拿全了数据——shapefile是一个多文件家族,.shp(几何)、.shx(索引)、.dbf(属性表)、.prj(投影)必须同名同目录,缺一个都打不开或打开后表现诡异。

加载后第一时间右键图层→属性→信息,检查“范围”。这里我有血泪经验:范围不对,后面全部白做。比如本该是东经73°开始的全国数据,坐标却显示几十万几百万——那基本是投影坐标被当成了地理坐标。此时千万不能用“导出→重新投影”去修,正确做法是右键图层→设置CRS,手工指定正确的坐标系。

也可以直接用PyQGIS在控制台加载:

# 通过文件路径加载矢量图层 from qgis.core import QgsVectorLayer # 第二个参数是图层面板显示名,第三个参数固定为ogr驱动 layer = QgsVectorLayer("/data/landform/landform.shp", "全国地貌", "ogr") if not layer.isValid(): print("图层加载失败:检查文件完整性,尤其是.shx和.dbf") else: QgsProject.instance().addMapLayer(layer)

这段脚本用到了QgsVectorLayer的三个参数:路径、别名、数据提供器。第三个参数ogr代表OGR矢量驱动,绝大多数shp加载失败都是报在这—常见原因是路径里有中文或特殊字符。GIS这行的玄学之一就是:中文路径十次里有八次能用,但那两次翻车就够你查半天。

3.2 按地貌类型做唯一值渲染:配色方案与代码映射

加载正确后的第一件事是符号化。全国地貌shp的属性表里type_code通常把地貌分成若干等级,比如1系为平原、2系为台地、3系为丘陵、4系为山地。直接用渐变颜色渲染所有多边形没有意义,因为要素不是数值连续的,要用唯一值渲染。

在QGIS里操作路径是:图层属性→符号化→分类→唯一值→选择type_code字段→分类。但更可控的是用PyQGIS脚本,推荐自己写一组颜色映射:

from PyQt5.QtGui import QColor from qgis.core import QgsCategorizedSymbolRenderer, QgsRendererCategory, QgsSymbol layer = iface.activeLayer() # 地貌代码与显示颜色的映射,按代码区间给色 colors = { "11": QColor(148, 210, 130), # 平原/低海拔用植被绿 "12": QColor(190, 225, 145), "21": QColor(245, 230, 140), # 台地/丘陵用过渡黄 "22": QColor(235, 200, 100), "31": QColor(210, 160, 90), # 山地用棕褐 "32": QColor(180, 120, 70), } categories = [] for code, color in colors.items(): symbol = QgsSymbol.defaultSymbol(layer.geometryType()) symbol.setColor(color) # 参数:类别值、符号、图例显示文本 categories.append(QgsRendererCategory(code, symbol, "类型 " + code)) # 第一个参数是分类字段名,第二个是类别列表 renderer = QgsCategorizedSymbolRenderer('type_code', categories) layer.setRenderer(renderer) layer.triggerRepaint()

这里的选色逻辑是模拟DEM晕渲的观感:低海拔绿色系、中海拔黄棕色系、高海拔深棕褐。这样出图后不需要图例辅助,读者一眼能看出平坝区和山地区的分界。triggerRepaint()是强制刷新画布,不加这一行有时候新样式不会马上显示。注意QgsRendererCategory的第三个参数是图例文本,建议直接写中文类型名,别放纯代码,不然出图后还要挨个改标注。

3.3 叠加DEM验证:地貌图层和实际地形对不对得上

渲染完别急着出图,花两分钟验证一下数据可靠性。叠加一份SRTM或GDEM的晕渲DEM,把DEM放在地貌图下面,设置为半透明叠加,直观对比多边形边界与晕渲的明暗变化。

怎么判断对不对?山地类型的多边形应该覆盖在晕渲显示起伏剧烈的区域;平原类型应该落在色差平缓的河谷和盆地。如果发现大面积错位——比如“平原”多边形盖在横断山区的深褐色条纹上——那这份数据的分类逻辑和你的项目口径不一致,要么放弃使用,要么做重分类。做之前先记录偏差比例:随机抽20个点,逐个对比DEM高程和shp类型,对不上的超过3个就建议换源。这个验证脚本可以在QGIS里用“栅格值提取到点”完成,不复杂但能救命。

4. 把全国地貌shp裁到研究区:按省界裁剪与渔网分割两种做法

4.1 按省界裁剪:Clip工具与Select+Export的取舍

大多数项目用不到全国图,把四川、北京这种目标区域裁出来才是常态。QGIS里最稳的是地理处理→裁剪(Clip),本质是用省界多边形对地貌多边形做叠加求交。优点是输出结果完全保留原属性字段,效率也高。

Processing面板对应的PyQGIS写法:

import processing from qgis.core import QgsVectorLayer result = processing.run("native:clip", { 'INPUT': '/data/landform/landform.shp', # 被裁剪的地貌图层 'OVERLAY': '/data/boundary/sichuan.shp', # 裁剪范围(省界) 'OUTPUT': '/data/result/landform_sichuan.shp' # 输出路径 }) layer = QgsVectorLayer(result['OUTPUT'], "四川地貌", "ogr") QgsProject.instance().addMapLayer(layer)

native:clip是QGIS原生裁剪算法,不是GDAL的,速度快且不会掉几何属性。两个关键参数:INPUT是被裁剪图层,OVERLAY是裁剪范围图层——注意两者可以互换,但属性表保留的是INPUT的字段。很多人裁完发现属性表不见了,就是裁反了。

还有一个常见做法:按属性筛选后导出。如果只需要某种地貌类型,不用裁剪,直接在属性表按表达式选择再另存即可。但筛选和裁剪不要混在一个图层上操作——筛选会把未选中的要素暂时隐藏,导出时反而容易误操作。

4.2 按经纬度范围或流域边界裁剪:渔网分割shp的实际用法

没有省界shp但知道经纬度范围时,可以用渔网分割shp再裁剪。这也是很多遥感项目里“按格网出图”的标准路子。先生成一个1°×1°的多边形渔网,然后用它逐格裁剪地貌数据,速度和内存占用都可控。

# 生成经纬度1°×1°渔网(多边形类型) processing.run("native:creategrid", { 'TYPE': 2, # 2=Polygon,0=Line,1=Point 'EXTENT': '97,106,28,34', # 格式为 xmin,xmax,ymin,ymax(WGS84) 'HSPACING': 1.0, # 水平间隔1度 'VSPACING': 1.0, # 垂直间隔1度 'CRS': 'EPSG:4326', # 坐标系必须与被裁图层一致 'OUTPUT': '/data/result/grid_1deg.shp' })

渔网生成后,逐格裁剪可以用“按位置选择”加导出,也可以用native:clip写循环。注意HSPACING和VSPACING按地理度数为单位时,高纬度地区网格实际面积会缩水;如果想等面积分割,要把CRS先转成Albers等面积投影再建渔网,这才是标准做法。

注意:裁剪前先确认被裁剪图和渔网的CRS一致。如果一个是WGS84一个是CGCS2000,虽然都是经纬度坐标,但椭球参数有细微差异,裁出来的边界会出现锯齿状。

4.3 融合与简化:把碎多边形合并成一级地貌类型

全国地貌shp的图斑粒度通常很细,同一个山县里碎图斑可能有几百上千个。做小比例尺图件时不需要这么细,按类型代码前两位融合即可。用ogr2ogr命令行一步完成:

ogr2ogr -f "ESRI Shapefile" \ -dialect sqlite -sql \ "SELECT substr(type_code,1,2) AS class, ST_Union(geometry) AS geom, SUM(area_km2) AS area_sum \ FROM landform GROUP BY substr(type_code,1,2)" \ /data/result/landform_class.shp \ /data/landform/landform.shp

-dialect sqlite启用OGR的SQL语法,substr(type_code,1,2)取代码前两位作为一级类型,ST_Union函数把所有同类型多边形合并成一个MultiPolygon,SUM(area_km2)同步累加面积。这一步对老数据特别有用——老shp经常把同一类型切成几百个碎面,融合后文件大小能缩到原来的十分之一。

融合后的图层边界会变得比较“碎”或呈锯齿状,如果还要出印刷级图件,再跑一遍简化工具。QGIS里选择“简化”工具,算法选Douglas-Peucker,容差设0.01度(约1公里)比较合适,千万别设大了,否则山地峡谷的形状会被抹成一块饼。

5. 全国地貌shp的常见排查:乱码、偏移、拓扑错误与加载失败的5个坑

5.1 属性表中文全变乱码

现象:图层能打开,图形正常,但属性表里type_name字段显示为“灞?按?湴??”一类乱码。

原因:历史数据用GBK/GB18030编码存储中文字段,而QGIS默认按UTF-8读取。ArcGIS用户不常见这个问题,因为ArcGIS会自动做编码探测,但QGIS的OGR驱动在.shp文件缺失.cpg文件时按系统默认编码处理。

解决:QGIS菜单“设置→选项→数据源→数据源编码”,改为GB18030或GBK后重新加载图层。另一个更保险的办法是用命令行转换编码,把整个dbf转成UTF-8:

# 先复制一份,然后用iconv转换dbf文本编码——注意此方法只对dbf有效 ogr2ogr -f "ESRI Shapefile" \ -lco ENCODING=UTF-8 \ /data/result/landform_utf8.shp \ /data/landform/landform.shp

-lco ENCODING=UTF-8是Layer Creation Option,它会让输出shp的.cpg文件记录编码方式,下次打开不会再乱。这里补充一句:ArcGIS里右键导出要素类也能指定编码,但用命令行更方便批量处理。

5.2 图层坐标飞了:数据跑到非洲或者海上

现象:加载地貌shp后,缩放到全图看不到中国,数据跑到非洲西海岸或者海里。

原因:图层的.prj文件写的是投影坐标系(比如X坐标几十万、几百万),但QGIS按默认的WGS84经纬度去解释了这些数值。这是最常见也最容易手贱改坏的情况。

解决:在QGIS图层列表右键→图层属性→信息→设置CRS,弹出窗口里手工指定正确的坐标系。指定后图形会立即归位。注意一个关键动作:这里用的是“设置CRS”,相当于给数据贴上正确标签;而“导出→重新投影”是把几何坐标真的重新计算一遍。如果拿投影坐标去重新投影到经纬度,数据就废了。这个坑叫“黑匣子型错误”——表面看不出问题,一算面积全是错的。

5.3 整体偏移:放在底图上位置对不上

现象:加载在线卫星底图后,地貌多边形整体偏离,偏移量从几百米到几十公里不等。

原因:坐标系叠加时缺失或错配。比如地貌数据用的是CGCS2000(EPSG:4490),而底图是WGS84(EPSG:4326),两者虽然同为经纬度,但参考框架有零点几弧秒的系统差,放大后明显。更大的偏移通常是动态投影场景下,把WGS84底图和CGCS2000要素直接生叠。

解决:确认底图CRS后在“图层属性→转换”里只约束显示CRS,不动源数据。如果需要彻底统一,做一次“重投影图层”:目标CRS选EPSG:4326或EPSG:4490,插值方法选“笛卡尔”。重投影之后用“测量工具”量两三个控制点,确认偏移已消除再继续分析。

5.4 缓冲区或叠加分析报“几何自相交”错误

现象:对地貌图层做Buffer或Intersect时,QGIS报GEOSGeom_createLineString: TopologyException: side location conflict。

原因:原始shp里的多边形边界存在自相交或尖角折叠,这是矢量化的老毛病,尤其是从栅格分类图转出来的shp,像元和像元之间的锯齿边界转换时产生大量无效几何。

解决:用Processing里的“修复几何”工具(native:fixgeometries),它会遍历所有要素并自动拆开自相交部分。处理后再做分析,输出成功率会高很多。顺手检查一下修复后要素数量,有时会把一个多边形拆成两个,这时要用Dissolve一次性合并回来。

5.5 打开直接报错“Failed to open shapefile”

现象:双击.shp文件,QGIS提示无法打开;但同一个目录下能看到.shp文件完好。

原因:shapefile是多个文件组成的集合。部分人在下载、拷贝时只复制了.shp主文件,漏掉.shx(几何索引)和.dbf(属性表)。没有.dbf就只剩几何没有属性;没有.shx文件直接被OGR拒绝加载。

解决:在网盘或压缩包解压时确认包含了四个同名文件:.shp、.shx、.dbf、.prj。如果只有.shp没有其他三个,用QGIS的“处理→工具→包”工具重建一个空属性表,但几何和属性可能对不上,不到万不得已别用这招。整理项目文件时的好习惯是:统一把shp四件套放进单独文件夹,不与其他版本混放。

6. 下游格式转换实战:dwg转shp、shp转3dtiles与WKT导出的落地细节

6.1 dwg转shp:CAD图纸到矢量图层的三步流程

项目里经常遇到甲方只给CAD图而不给GIS数据的情况。CAD文件转shp的标准流程是:先在AutoCAD里把文件另存为DXF(或者分离出要转换的图层),然后用OGR读取DXF并转换为shapefile。

# 先中转DXF,再强制按面要素输出 ogr2ogr -f "ESRI Shapefile" \ -nlt POLYGON \ -skipfailures \ /data/result/landform_from_cad.shp \ /data/cad/landform.dxf

-nlt POLYGON是关键参数——OGR读DXF时默认把闭合多段线识别为Polygon,但遇到未闭合的线会丢失,所以要配合-skipfailures跳过坏要素。转换后检查属性表:CAD的图层名会映射到Layer字段,颜色映射到Color字段,而长度面积等属性往往全部为空。这很正常,CAD图的强项是精确几何,不是属性。后续做地貌分析时,把转换后的图按CAD里的填充图例重新做一遍属性赋值。

6.2 shp转3dtiles:地貌建模前必做的几何预处理

做地形三维展示时经常要把shp转成3dtiles格式。常见做法是用CesiumLab或类似转换工具,流程是shp→GeoJSON→3dtiles。但直接转会翻车:shp里的Z值或高程属性如果没有,3dtiles会全部贴着地面,看不出地貌起伏。

所以在转换前,先确认几何有没有高程。如果源数据没有Z值,给每个要素赋高程的做法是用DEM做“值提取至点”,把平均高程写入属性表,并通过height字段传给转换工具。还有一步要和6.3配合——3dtiles对几何自相交比GIS软件更敏感,先跑一遍“修复几何”再转换,能避免大量模型穿孔。

6.3 shp要素导出为WKT与GeoJSON:和Web平台对接的文本方案

在Web端做自定义叠加时,常常需要把shp要素导出为WKT字符串。这一步用ogr2ogr不能直接导出纯WKT文本文件,但可以先转GeoJSON再抽取值,或者直接用ogrinfo带几何输出:

# 带几何输出到文本,每行一条WKT ogr2ogr -f "GeoJSON" /data/result/landform.geojson /data/landform/landform.shp # 如果只要WKT文本做快速验证 ogrinfo -al /data/landform/landform.shp -geom=yes -fields=no | head -30

-geom=yes显式要求输出几何对象,-fields=no去掉属性字段减少刷屏。输出格式是POLYGON ((...))这类OGR风格的WKT。注意:导出WKT时坐标系是原图层坐标系,给Web前端前先确认对方要的是WGS84经纬度还是投影坐标——后端同学常在这栽跟头,拿到手一叠加就偏。

顺带说一句shp转txt这个需求:直接用上面的ogrinfo命令重定向到文件就是最简单的方案。

6.4 一个小习惯:用DEM随机点验证地貌分类

转换全部完成后,我习惯再做一次最终验证:在全国范围随机撒500个点(QGIS“随机点”工具),对每个点用DEM提取海拔和起伏度,再对照shp属性里的类型代码,计算匹配率。匹配率低于85%就要回头检查数据源或分类口径。

这个习惯是从一次返工里学来的。当时拿着别人给的地貌shp直接出图,图面看着没问题,交上去后被审图方指出“丘陵区面积和统计年鉴对不上”。后来一查,那份数据用的分类标准和我手上的DEM分辨率不匹配,丘陵和平原大面积错位。从那以后,任何外部shp进项目,我都会先跑一遍随机点验证。这个流程不复杂——10分钟能跑完,但能挡住后面几天甚至几周的返工。希望帮到你,也希望你拿到手的这份全国地貌分布shp,是那个能让你一次跑通的版本。

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

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

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

立即咨询