ARTICLE DETAIL

资讯详情

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

全国地貌shp矢量数据处理:坐标系、属性表与面积统计完全指南

全国地貌shp矢量数据处理:坐标系、属性表与面积统计完全指南 简介全国地貌分布shp矢量图层数据面向GIS开发者、地理科研人员和需要全国尺度地貌底图的Python数据分析者适合进行地貌类型可视化、区划统计及专题制图能直接解决缺少可与业务数据叠加的全国地貌矢量边界及字段分类问题。压缩包共10个文件约6.17MB主体为shp格式及其配套文件shp负责几何要素dbf存储地貌代码与地貌类型等属性prj定义坐标系doc提供数据介绍与字段说明mxd、xml辅助工程浏览和元数据管理。目前已有396人学习下载。使用者可在ArcGIS、QGIS或geopandas中直接读取该图层按属性表筛选不同地貌类别并进一步执行叠加分析、缓冲区统计、批量出图等操作附带的说明文档有助于快速理解分类体系与字段含义上手门槛较低。1. 全国地貌分布shp一份能直接用但得先过三关的矢量图层数据第一次用全国地貌分布shp矢量图层数据的人八成会在一个地方卡住数据下下来了ArcGIS 里也能打开可图上只有几何轮廓属性表像黑匣子字段看不懂哪个是地貌类型坐标小数点和行政区划对不上。这个标题要解决的正是这些事——把一份全国尺度的地貌 shp 变成能直接统计、出图、转发的基础数据。做规划、水利、农业区划和地理教学的人拿到这份数据后最想干的是算面积、裁研究区、出专题图新手想尽快接上项目老手想把加工路径跑顺。整体算不上难但坐标系、DBF 编码和几何错误这三关够你折腾一整天。2. 先看清全国地貌shp的底色坐标系、字段与地貌分类体系2.1 坐标系WGS84、CGCS2000 与“老数据”的一眼识别法全国尺度的地貌 shp 在网上流传的版本很杂。我见过最多的三类WGS84 地理坐标系、CGCS2000 地理坐标系还有少量用西安 80 或北京 54 高斯投影的老图。拿到数据先别急着叠加第一件事是打开图层的属性——源。范围框在经度 73~135、纬度 18~54 之间的基本是地理坐标如果你看到 X 坐标是 7 位数、Y 坐标是 3 位数那大概率是投影坐标。区分 WGS84 和 CGCS2000 不能靠肉眼。同一个经纬度在这两套框架下差值通常小于 1 米对全国地貌这种 1:100 万比例尺数据几乎无感但和高精度影像叠加时能看出偏移。我的习惯是用影像底图做交叉验证找一条明显的河流或山脊线分别加载 WGS84 和 CGCS2000 版本的 shp看哪套能严丝合缝。没有影像底图时直接读 .prj 文件里的字符串判断。老数据常见的是GCS_WGS_1984或GCS_Krasovsky_1940新数据多为CGCS2000。还有一类是投影后的 Albers 等积圆锥。全国尺度的面积统计最好用 Albers因为等积投影不歪曲面积如果原始文件已经是 Albers 投影别为了“统一”强行转回地理坐标。地理坐标虽然看着直观但算面积时误差能到 2%~5%。从.prj 里能看到投影参数时优先沿用原始投影。2.2 属性表字段哪些字段决定你有没有白下载打开属性表后常见字段大约有十来个第一眼容易慌。我整理了一张实用对应表照着认就行常见字段名含义使用价值OBJECTID / FID要素编号仅用于选中和定位Shape_Length / Shape_Area图形面积和周长注意单位地理坐标下不是米和平方米NAME / 名称地貌单元名称出图标注首选CODE / 类型代码地貌类型编码首选分类依据TYPE / 地类地貌类型中文或拼音与 CODE 二选一PROVINCE / 省代码所在行政区做省级统计时直接能用AREA_KM2预计算面积平方千米省去自己重算的麻烦记住一个原则CODE 优先于 NAME 使用。字段名不规范、全拼或英文缩写的版本属性表里 TYPE 字段写的是“平原”“山地”这类词看着直观但不同来源的命名口径不一致有的写“低山”有的写“浅山”统计时会裂开。CODE 字段通常是数字或字母组合对照分类体系文档就能统一归并。如果属性表打开后只有几何没有属性先怀疑是不是加载了 .shp 旁边的 .dbf 文件损坏或编码不匹配。此时不要急着删数据先看 5.1 节的乱码修复方法。2.3 地貌分类体系1:100万地貌图分类码不能随意合并全国尺度的地貌数据大量来源于《中国1:100万地貌图》分类体系。这套体系把地貌按形态成因分级一级类型包括平原、台地、丘陵、低山、中山、高山、极高山再往下还有黄土地貌、冰川地貌、火山地貌、流水地貌等成因类型。一级类型适合宏观概览二级类型适合区域分析。实际操作中最大的坑是“地貌类型”和“土地覆被”混用。有些网上的数据把“林地”“耕地”写进地貌属性拿来做地貌分析会闹笑话。你先看属性表里有没有“土地利用”或“覆被”字样有的话要谨慎对待确认数据到底描述的是地表形态还是地表覆盖。单一字段的全国地貌 shp 一般只能支撑宏观叙事比如“全国山地面积占比约 43%”要做流域或县域级分析建议再找二级分类或更高精度的分省数据。3. 把全国地貌shp装进ArcGIS/QGIS下载直连与首次打开3.1 下载后发现“不是一个文件”一套shp的标准构成很多人下载 shp 后只看到一个 .shp 文件其实一套完整的 shp 是多个文件共同组成的。常见的最小集合是 .shp几何、.shx索引、.dbf属性再加 .prj坐标系、.cpg编码共五个完整版还会带 .sbn、.sbx、.xml 等附属文件。分发时压缩包里通常有 5~20 个文件缺了 .dbf 只剩几何缺了 .prj 坐标系全乱。把下载的压缩包解压到本地后一定要保持同名文件在同一目录。有人只拷贝 .shp 文件到 U 盘换台电脑就发现属性表是空的就是因为 .dbf 没跟着走。我一般会把解压后的文件夹直接作为数据目录不改名、不移动等确认能打开后再整理归档。还需要提醒一点全路径不要带中文和空格ArcGIS 对中文路径兼容性还行但 QGIS 和第三方库偶尔会出问题。3.2 在ArcGIS里新建shp与直连数据目录GIS 新手常问怎么新建 shp 文件打开 ArcCatalog 或 ArcGIS Pro 目录窗格右键文件夹→新建→Shapefile可以创建一个全空的矢量文件。但全国尺度的地貌数据不是靠新建再描图能画出来的正确做法是建立文件夹连接后直接加载现成数据。操作路径打开 ArcMap 或 ArcGIS Pro在目录窗格里点击“连接到文件夹”选定解压后的数据目录展开目录看到 .shp 文件后右键→添加至当前地图。不要双击打开双击只会弹默认浏览器下载页。加载后如果图层显示一个小红叉或空白通常是因为路径失效或 .dbf 编码问题用“添加数据”按钮重新定位。3.3 用Python给shp做开机检查要素数、坐标系与字段体检拿到数据后我建议先跑一段脚本做体检。下面的代码在 ArcGIS Pro 的 Python 窗口或 PyCharm安装了 arcpy 环境里都能跑作用是输出要素数量、坐标系字符串和字段列表。import arcpy shp_path rD:\gis_data\全国地貌\landform.shp # 描述对象一次性拿到坐标系、类型、要素范围 desc arcpy.Describe(shp_path) print(数据类型:, desc.shapeType) print(空间参考:, desc.spatialReference.name) print(坐标系单位:, desc.spatialReference.linearUnitName) # 统计要素个数遍历搜索游标并计数 count 0 with arcpy.da.SearchCursor(shp_path, [OBJECTID]) as cursor: for row in cursor: count 1 print(要素数量:, count) # 字段体检因为我们不知道原作者到底给了哪些可用属性 fields [f.name for f in arcpy.ListFields(shp_path)] print(字段列表:, , .join(fields))这段代码解决了三个高频疑问数据是有面还是有点线、坐标系是地理还是投影、字段名会不会与常见版本不一致。搜素游标写成[OBJECTID]只取单字段避免一次性载入全部属性把内存打满。全国地貌数据几十万要素很正常这里只计数不读几何速度很快。如果输出显示shapeType是Polygon、空间参考带CGCS2000字样基本可以放心往下做。3.4 QGIS打开与“拖入即白屏”的解法ArcGIS 之外的备选路线是 QGIS免费且不锁授权。把 .shp 直接拖进 QGIS 窗口通常能正确识别但两个问题高频出现一是要素全白看不到分类颜色二是中文乱码。白屏不是数据丢了是 QGIS 默认按单一符号渲染而地貌数据要素多、多边形小白底白边叠加后肉眼几乎看不清。右键图层→属性→符号化把“单一符号”改成“分类”值选 CODE 或 TYPE 字段色带选一个区分度高的方案如“随机分类”或“地貌色带”。乱码则在图层属性→数据源→编码里把UTF-8改为GBK或GB2312改完点“确定”再刷新。大部分网上流传的 dbf 是用 GBK 写的QGIS 3.x 默认读 UTF-8读出来就是乱码。4. 让shp为你干活面积统计、区域裁剪与基础出图4.1 按省级行政区划拆数据先选中再导出做流域或县域分析时全国范围太大直接裁剪比硬扛全图高效得多。常见做法是先用行政区划 shp 与地貌 shp 做叠加分析或者按属性字段选中目标省份直接导出。如果地貌属性表里自带省代码字段省去空间计算直接用 SQL 选择最快。ArcGIS 里的操作打开属性表→按属性选择→输入PROVINCE 云南右键图层→数据→导出数据。QGIS 里是右键图层→导出→保存所选要素。没有省代码字段时就要用“裁剪”工具ArcToolbox→分析工具→提取分析→裁剪输入要素选地貌裁剪要素选省界。注意裁剪工具会丢失跨省界的地貌多边形做面积统计时需要检查边界处要素被切开后面积是否合理。4.2 用arcpy批量统计地貌类型面积占比手工统计几十个类型太痛苦用 arcpy 加 pandas 一次算完。下面的脚本统计每个地貌类型的要素总数和面积总和。import arcpy import pandas as pd shp_path rD:\gis_data\全国地貌\landform.shp type_filed CODE area_filed Shape_Area # 按字段分组做面积统计 stats arcpy.Statistics_analysis(shp_path, rin_memory\stats, [[area_filed, SUM], [area_filed, MEAN]], type_filed) # 把统计结果转成pandas方便排序和算占比 data_rows [] with arcpy.da.SearchCursor(stats, [type_filed, fSUM_{area_filed}, fMEAN_{area_filed}]) as cursor: for code, sum_area, mean_area in cursor: data_rows.append([code, sum_area, mean_area]) df pd.DataFrame(data_rows, columns[CODE, 面积和, 平均面积]) df[占比%] df[面积和] / df[面积和].sum() * 100 df df.sort_values(占比%, ascendingFalse) print(df.to_string(indexFalse))Statistics_analysis是 ArcGIS 的经典统计工具支持多字段联合分组这里只用单字段。Shape_Area在未投影数据里是“度”的平方算出来的占比仍然有效但要输出平方公里时得先用投影工具转 Albers 或用字段里的自带面积。脚本最后转 pandas 的好处是能直接排序和打印占比不依赖 ArcGIS 的表格视图。4.3 制图出图唯一值渲染的图例与配色出图建议直接做唯一值渲染按CODE 字段分成 8~12 类颜色参考《中国地貌图》常用配色平原用浅绿台地用淡黄低山用黄绿中山用橙黄高山用棕红极高山用紫红。ArcGIS 符号系统→类别→唯一值选择CODE 字段后点“添加所有值”再逐个改颜色。这一步做完图例就已经半成品了。导出地图时常见翻车点是图例文字太小和符号压盖。在布局视图里把图例字体调到 9~10 号符号高度设为 12~14 磅要素多到看不清楚时把背景图层透明度调成 20%。导出分辨率选 300 DPIJPG 或 PDF 都行PDF 用于打印更稳。4.4 把Excel经纬度点转成shp采样点挂接地貌值项目里经常有野外采样点或站点数据想知道每个点落在哪种地貌类型上。先把 Excel 里的经纬度转为点 shp再与地貌面做空间连接。ArcGIS 的操作是右键 Excel 表→显示 XY 数据→X 字段选经度Y 字段选纬度→指定坐标系。导出的点事件要右键→数据→导出数据才会变成真正的 shp 文件。空间连接用 ArcToolbox→分析工具→叠加分析→空间连接目标要素是点连接要素是地貌面匹配选项选“INTERSECT”。结果属性表里会增加地貌类型字段。如果点恰好在边界上会出现多对多连接或空匹配设置“合并规则”为“JOIN_ONE_TO_ONE”并在连接前给点要素加一个唯一编号。这个流程在农业区划和地质调查里几乎每周用一次。5. 全国地貌shp避坑指南5个让我翻过车的高频错误5.1 属性表中文全是问号乱码现象在 ArcGIS 里打开属性表NAME 字段显示“?????”QGIS 里显示“鏉?瑰”一类乱码。导致你根本分不清哪个要素是什么地貌。原因dbf 属性文件的编码与 GIS 软件默认读取编码不一致。Windows 环境老数据多是 GBK 或 GB2312而较新的 ArcGIS Pro 和 QGIS 默认按 UTF-8 读取两边对不上就乱码。解决先用 QGIS 打开右键图层→属性→数据源→编码改为GBK通常立即恢复正常再用 QGIS 里的“保存要素为…”另存一份 shp另存时编码选 UTF-8之后的软件就都能正常读。如果手里只有 Python可以读 dbf 文件后重新写出操作见下面代码块。# 用pyshp修复dbf编码读取GBK字段再另存为UTF-8 import shapefile # 读取旧文件 sf shapefile.Reader(rD:\gis_data\全国地貌\landform.shp) w shapefile.Writer(rD:\gis_data\全国地貌\landform_utf8.shp) # 原样复制字段结构避免字段被丢弃 w.fields sf.fields[1:] for record in sf.records(): # 把字符串字段按GBK解码后再编码成UTF-8 decoded [v.decode(gbk).encode(utf-8) if isinstance(v, bytes) else v for v in record] w.record(*decoded) # 原样复制每个要素的几何 for shape in sf.shapes(): w.shape(shape) w.close()这份代码走的是最保守的路线字段结构、几何形状完全不动只把属性字符串重新编码。注意sf.fields[1:]去掉的是 pyshp 自带的“DeletionFlag”字段不能省。跑完后再把生成的 .prj 文件从原文件夹复制过来否则坐标系信息会丢。5.2 图层与影像底图对不齐整体偏移几百米现象地貌面与天地图影像叠加时山脊线、河流走向明显错位整个图层朝某个方向平移。原因最常见的是坐标系定义错位。文件实际是 WGS84或数据在采集时用的坐标框架整体平移该次数据成果未重新纠正。更隐蔽的情况是文件本身是 CGI中国地理信息框架的老成果却被 ArcGIS 识别成了 CGCS2000两个框架之间差几米到几百米。解决先看 .prj 文件内容确认标注的坐标系然后按标注去做“定义投影”而不是“投影”。如果 .prj 写的是 WGS84底图也是 WGS84 但仍旧对不齐那就要怀疑原始数据本身有系统误差此时只能在 ArcMap 里用“空间校正”工具做一次平移选至少三个均匀分布的明显同名地物点执行仿射变换。5.3 面积计算出现负数或相交报错要素几何坏了现象用“相交”或“联合”工具时报ERROR 999999或者某些要素的 Shape_Area 是负数甚至计算面积没法完成。原因数据经历过多次格式转换或者由 CAD 图形转来拓扑关系没清理。重叠面、自相交、缝隙和悬挂节点都是老问题尤其是从 dwg 转 shp 的成果多段线转面后经常有细微裂缝和自相交。解决首选 ArcGIS 的“修复几何”工具数据管理工具→要素→修复几何能自动处理大部分自相交和空几何跑完再看错误报告。QGIS 里用“矢量几何→修复几何”效果同样好。更强力的是老牌工具 shapechk虽然界面停留在命令行时代但检查 dbf 字段完整性和几何异常仍然管用新环境下我更推荐先把出错的图层复制到文件地理数据库File GeoDatabase里再用“修复几何”处理成功率比直接在 shp 上处理高不少。5.4 属性表里冒出“省1”“省2”重复代码不知道选哪个现象使用省界线或自带行政区属性时省字段里同一个省出现两条记录例如“云南1”和“云南2”选任何一条统计面积都不对。原因这类文件常见于历史图幅拼接成果国界和省界按图幅分开存储相邻两幅图的边界线重叠或接触造成一个省被拆成多个要素记录又或者是某个版本的数据用编号后缀标记了“飞地”和“陆地主区”。解决统计前先按省名分组做融合ArcToolbox→数据管理工具→制图综合→融合融合字段选省名这样同一省的多块面会合并成一条记录。融合前如果还有个位数的零碎细小面片先做一次“消除”工具设置最小面积阈值后把碎面并到相邻大面里。5.5 自己算的全国面积和公开数字对不上现象用字段计算器算出来的全国总面积和统计年鉴或百科里公布的数字差一个量级甚至差 2%~5%。原因绝大多数全国尺度 shp 沿用的是地理坐标或某种投影计算面积时没有切换。经纬度坐标下的面要素直接用!Shape_Area!计算得到的是平方度想转成平方公里会非常麻烦而且直接换算是错误做法投影不同也会带来面积差异。解决先把整个图层投影到 Albers 等积圆锥Krasovsky_1940_Albers 或 CGCS2000_3_Degree_GK_CM_105E 都可再用字段计算器给面积字段赋值公式写!shape.area!。项目脚本里统一用投影后的面积做统计不要在多个坐标系下反复横跳。若原始数据自带 AREA_KM2 字段也要先确认它的单位避免和重新计算的面积混用。6. 从地貌shp到3dtiles与Web端共享进阶用法与我的实效心得想让地貌数据在三维地球或网页地图里跑起来shp 不能直接被前端读取。我通常会走这条路径QGIS 打开 shp→右键导出→GeoJSON然后将 GeoJSON 交给 CesiumLab 或 Mapbox 的矢量瓦片工具转换。转 3DTiles 时注意三个必调参数几何压缩选“Draco”纹理压缩可不选最大 LOD 层级设为 15 左右层级太低近看会糊太高数据量会好几倍膨胀加载速度立刻下降。用 Cesium 加载后在光照下地貌起伏立体感很强但三维只适合看趋势真要统计面积还得回桌面 GIS。这个过程里如果把样式存成 .lyrx 或 .qml 文件下次打开还能留着唯一的配色方案这就是我做项目时留的后悔药比每次重新配色调半天实用得多。做水利或流域项目时我习惯给数据做一次“渔网分割”把地貌 shp 与 10km 格网叠加每个网格内算主导地貌类型后续嵌套进水文模型时维度就统一了。要做塔里木河流域、淮河或南盘江这类中小流域时不要拿全国数据硬扛裁剪后先融合碎面再出图避免图面一片“芝麻点”。心愿是这类公共数据的管理越来越规范我们能少花时间在修数据上把精力放在分析本身。希望这篇笔记帮你在全国地貌数据上少走几步弯路。本文还有配套的精品资源点击获取
返回列表