
打开我百度网盘的时候看着这份“中国371个城市坡度矢量数据”的文件夹我第一反应并不是高兴而是想起自己上个月还在ArcGIS里对着高程数据一帧一帧提取坡度的画面。这个需求在行业里太常见了——城市规划、光伏选址、农业区划、地质灾害评估凡是跟地表形态沾边的工作都绕不开坡度。你要是跟Python玩得熟可能直接用DEM但更多时候甲方要的就是一份现成的shp矢量文件加一张Excel统计表能直接拖进软件里出图出数。所以我把这套数据整理出来不仅是分享结果更想把整个数据处理链路里容易被坑的地方一次讲清楚。这套数据覆盖了全国371个地级及以上行政单元包含两类核心文件一是每个城市的坡度栅格经过矢量化后的shp面或线图层二是以城市为统计单元的坡度属性Excel表。先别急着问下载链接我建议你先花五分钟看完这篇文章。一方面你要确认这份数据适不适合你的项目精度另一方面我会把“Excel经纬度数据导入ArcMap生成shp”这条操作链完整走一遍——这是很多人拿到任何空间数据后第一件要做的事热搜里的高频问题我今天直接给你排掉。1. 先说清楚这套坡度数据到底存了什么内容1.1 数据来源与生产逻辑我先讲生产逻辑不然你拿到shp也不知道它的可信度边界在哪。这套数据的原始底稿是公开的SRTM和ASTER GDEM高程数据前者分辨率30米后者也是30米国内区域还有部分融合了12.5米的ALOS数据。我在处理时统一重采样到30米分辨率避免不同数据源拼接后出现明显的“拼接缝”。坡度提取用的是ArcGIS的Slope工具以及部分GDAL批量脚本输出单位为度degree不是百分比。这一点很重要后面我单独展开。城市边界的定义参考了最新行政区划以地级市市区及下辖区县为裁剪范围。这里有个容易被误解的点371个城市不是“主城区范围”而是整个地级行政区的全域范围。也就是说一个城市下辖的山区县也会被包含进来。如果你做的是中心城区精细坡度分析这份数据的城市化程度不够建议再裁剪到建成区边界。但如果你做的是全省、全国尺度的宏观对比那这个口径就比较合适。1.2 矢量数据与Excel表怎么配合用压缩包里主要有三类文件分城市的坡度矢量图层格式为shp按城市编码命名比如“110000_北京坡度.shp”汇总的“中国371城市坡度统计表.xlsx”包含城市名称、所在省份、平均坡度、最大坡度、最小坡度、坡度标准差、≥25°面积占比等字段一个“字段说明.txt”记录每个字段的名称、单位和统计口径。我用表格把Excel核心字段列出来你先对照清楚字段名含义单位City_Name城市名称-Province所属省份-Admin_Code行政区划代码-Slope_Avg全域平均坡度度Slope_Max最大坡度度Slope_Std坡度标准差度Area_Total全域总面积平方千米Area_Over25坡度大于25°面积平方千米Pct_Over25坡度大于25°面积占比百分比为什么要单独给一份Excel因为很多人做宏观分析时不需要频繁打开GIS软件直接用Excel就能排序、筛选、做图表。比如想看哪些城市坡度最平缓PivotTable一拖就出来了。同时Excel里也保留了每一行的经纬度重心点坐标方便你在仅有表格工具的情况下做位置判断。不过这里我要提醒一下这个重心的经纬度是高德坐标系或者WGS84坐标系取决于你拿到的版本使用前一定要看“字段说明.txt”里的说明别上来就套在ArcMap里。对于shp矢量文件我的做法是每个城市单独一个文件而不是把371个城市放在一个超大图层里。原因很简单在Arcmap里加载371个城市的全量要素缩放到单个城市时卡顿会非常明显而拆分成独立文件单个图层往往只有几千到几万个面要素运行流畅得多。代价是你需要写一个简单的批处理来合并这个我放到后面讲。2. 坡度数据为什么值得下载我梳理的真实应用场景很多人下载这类数据时其实没想清楚用到哪结果文件在硬盘里吃灰。我自己经手过的项目里有几个典型的应用方向你可以对照自己手头的活。2.1 光伏选址和风电场微观选址光伏项目是个典型的“越平越好”场景。虽然现在山地光伏也不少但坡度直接影响阵列间距、桩基长度和施工难度。正常情况下坡度为0°到5°的区域是首选5°到15°需要做地形改造超过15°就要慎重评估造价了。用这套数据你可以直接筛查哪个城市的Pct_Over25最低或者把坡度大于某阈值的面从矢量图层里剔除得到“可建设区域”。风电场稍微不同风资源好的山头往往坡度不小这时候你需要的是坡度分级图和坡向数据而不是单纯的“越平越好”。我一般在选完机位后会用这个坡度shp检查机位平台开挖量——一个机位平台的面积大约是50米乘50米如果这个范围内高差超过10米那平整费用就非常吓人了。判断方法把机位点转换成面再与坡度图做Zonal Statistics。2.2 农业适宜性评价与高标农田建设农业上坡度是耕地质量等级的重要分界线。国家标准里坡度≤2°是一等地2°到6°是二等地6°到15°是三等地15°到25°是四等地超过25°原则上要退耕还林。每年做耕地质量年度更新时我都会拿坡度图跟现状耕地图斑叠加计算某个区县有多少耕地落在25°以上这个数字直接关系到整改任务量。Excel统计表在这时候就特别管用。你可以不用打开GIS直接按省份筛选比较不同县的15°以上耕地占比排序后就知道哪些地方是重点整改区域。我记得有次汇报领导要我十分钟内给出全省各县的坡度结构对比表我就是直接拿这份Excel做的数据透视比现去ArcGIS统计快太多了。2.3 地质灾害易发性初判地质灾害滑坡、泥石流跟坡度的关系非常强。虽然没有坡向、岩性、植被覆盖这些因素就不够做完整评价但坡度可以作为第一层筛查因子。业内常用的经验阈值是坡度在25°到45°之间的斜坡最容易发生滑坡小于10°相对安全大于50°反而因为残积层薄而风险降低。拿到这套数据后你可以通过属性筛选把每个城市坡度在25°到45°的区域单独导出再叠加上断层带和降雨分布做一个初判级别的易发性图。我们之前做某县的地灾详查前期就是这样圈定重点核查区域再让技术人员带着无人机去现场飞效率比盲跑高出一大截。3. 数据落地把Excel经纬度转成可用shp的标准链路拿到这套数据后很多人第一件事就是把Excel表里带经纬度的城市重心或者采样点转成shp。我这里直接给出ArcMap环境下的完整操作顺便把最容易翻车的几个细节说透。3.1 ArcMap添加XY数据的操作流程第一步打开Excel文件确认至少有两列分别是经度X和纬度Y。打开ArcMap在菜单栏找到“文件—添加数据—添加XY数据”。注意如果你的Excel是.xlsx格式版本老一点的ArcMap可能读不了建议另存为.xls格式或者用ArcGIS Pro它对xlsx的支持好很多。第二步选择包含经纬度的Sheet表系统会自动识别X和Y字段。这里有一个性别之分如果你的数据是WGS84经纬度X字段对应经度LongitudeY对应纬度Latitude如果你的数据是国家2000投影坐标那就直接选对应的X、Y投影坐标列。选错之后的结果是整个点群飞到大洋或者显示为Null所以这步值得多看一眼。第三步指定坐标系。如果是GPS采集的经纬度一般选WGS 1984如果是从高德或百度地图里抠出来的坐标那要小心——它们通常是GCJ-02加密坐标直接使用会产生100米到600米不等的偏移叠加到遥感影像上会非常明显。处理加密坐标的办法是使用坐标纠偏工具网上有公开算法这里不展开。第四步点击“完成”后地图上会生成一个临时事件图层。这个图层还不是真正的shp必须右键图层选择“数据—导出数据”选择保存类型为Shapefile指定输出路径才能得到可以二次编辑的矢量文件。我用一个操作清单帮你快速核对准备数据Excel中必须有X、Y两列数值添加XY数据文件→添加数据→添加XY数据选坐标系经纬度选WGS84投影坐标选对应的投影坐标系导出shp右键临时图层→数据→导出数据→选择Shapefile验证把shp加载到带底图的ArcMap中叠到影像上检查位置是否合理。3.2 最容易翻车的几个实操细节第一字段类型问题。Excel里如果经纬度列被识别成文本格式ArcMap添加XY数据时会读不出数值表现为所有点都在原点附近。解决方法是先在Excel里把这两列设置为数值格式保留小数点后至少6位。第二列名有空格或特殊字符。ArcMap对字段名的限制比较多字段名里带空格、括号、中文都可能报“Invalid field name”错误。最稳妥的方式是把表头改成纯英文比如“Lon”“Lat”。第三导出shp时默认的编码经常出问题。中国用户属性表里如果有中文地名导出后在其他软件里打开可能乱码。我建议在导出之前先修改环境设置把ArcMap选项里的字符集设置为UTF-8如果你已经导出了shp且乱码可以试试用QGIS重新设置编码或者用Notepad直接编辑DBF文件的头信息但后者操作比较复杂不如重导一遍。第四Excel中两列数据存在差异需要标红的情况。比如你有两个版本的经纬度列需要快速找出哪些行不一致我通常直接在Excel里加一列公式IF(ABS(D2-C2)0.0001,差异,一致)然后对“差异”列做条件格式标红。这个 0.0001 度的容差大约对应11米如果两个坐标点在这个范围内认为一致超过就标出来。这个技巧在做数据质检时非常实用尤其是从不同系统导出的同一批点位需要比对时能省下大量眼睛盯屏的时间。4. 数据真正用起来之后我踩过的坑都在这里数据分享是好事但你如果直接把数据丢进项目里不检查很容易被暗坑坑哭。我在这里把我实际使用中踩过的几个大坑原原本本列出来希望你能避开。4.1 坡度单位是度还是百分比直接影响结论这是最隐蔽的坑。ArcGIS的Slope工具默认输出的是度Degree但很多国内教程和规范用的是百分比Percent Rise比如道路纵坡“8%”指的就是百分比坡度。两者换算关系百分比坡度 tan(坡度角) × 100%举个例子坡度角度百分比坡度5°8.75%10°17.63%15°26.79%20°36.40%25°46.63%30°57.74%如果你设置的阈值是“坡度不超过15%”但在度单位图层里按15°去筛选出来的区域面积会差一倍。我建议你在做任何计算之前先打开图层属性表随便看几个要素的数值如果平均坡度都集中在0到60之间大概率是度如果出现100、200这种大数那就是百分比。我自己经历过一次用百分比标准去套度单位图层结果把本来安全的区域大片误判为陡坡回头看真是够呛。4.2 栅格转矢量的精度损失比你想象的大这套数据里shp文件是从坡度栅格转来的矢量面每个城市按坡度级划分成不同的面要素。转换过程中有一个关键参数叫“简化面”Simplify如果采用了默认的简化规则很多锯齿状的边界会被拉直导致实际面积跟栅格统计有偏差。我处理数据时选择了“不简化面”的选项让每个面要素尽量保留栅格的原始边界。这样做的问题是需要保存的文件体积变大了属性表里的要素数量也多了不少。但优先保证的是空间精度。如果你拿到手的数据在局部边界出现平整的切角那说明生产时开了简化用于宏观比例尺出图问题不大但做精确到地块的叠加分析时需谨慎。另一个办法是我直接在说明文件里告诉用户如果你需要精确面积建议以栅格数据为准用Excel表里的统计值不要依赖shp面要素自己的Shape_Area字段。这不是偷懒而是栅格转矢量后每个边界段的几何简化都会带来面积变化累积起来不容忽视。4.3 城市边界版本不一样统计数字就对不上我在整理这套数据时城市边界用的是2022年版本的行政区划数据。但是要知道中国的行政区划调整非常频繁时不时有撤县设区、合并地市的事情。你的项目如果用的是2020年版本边界那有些城市的面积和坡度统计就对不上。举个例子某个县在2021年撤县设区划入了邻近的地级市。如果你用2020年的边界去裁剪2022年的DEM那个区域会被分到旧城市名下导致两个城市的统计都失真。所以要养成先检查边界版本的习惯。拿到数据后把城市边界套合到最新天地图影像上重点看行政区界和实际山脊线、河流走向是否大致吻合遇到明显不一致再单独处理。4.4 shp属性表字段编码最容易出现的隐性bug打开shp后中文地名全部乱码这是很多初学者一上来就会碰到的。造成乱码的核心原因是shp的dbf文件编码问题。ArcMap 10.x对中文环境默认使用的编码是GBK或系统语言编码而很多数据处理工具默认输出UTF-8两者一冲突显示出来就是乱码。遇到乱码不要慌有两种比较有效的处理方式用QGIS打开QGIS会弹出“选择编码”的提示选择UTF-8再打开然后另存为新的shp就能修复用ArcGIS Pro打开它在读取dbf时会自动识别编码很多乱码问题在Pro里不会出现。我做数据分享时特意让“字段说明.txt”尽量使用英文和数字就是为了避免编码问题在传输途中被二次破坏。5. 进阶玩法自己从DEM生产一份城市坡度数据如果这套数据的分辨率或者覆盖范围满足不了你或者你想更新某一年的数据我建议直接自己动手生产一份。流程并不复杂但每一步的参数会直接影响最终成果质量。5.1 完整的处理工作流生产一套城市坡度矢量数据按顺序通常走以下流程获取DEM数据。公开常用的有SRTM、ASTER GDEM、ALOS 12.5米。国内还有一些机构发布的30米数据可以自己找。下载时需要按行政边界图幅去检索如果有跨越多个图幅的情况要把所有相关瓦片都下载下来。拼接DEM。如果城市跨了多个图幅用Mosaic To New Raster工具拼接并设置像素类型为16位有符号整型背景值设为NoData。裁剪到城市边界。用Extract By Mask工具把拼接后的DEM裁到城市边界。这一步要注意mask栅格和矢量边界必须位于同一坐标系否则裁剪结果会出现错位。计算坡度。使用Slope工具指定输出测量单位“Degree”Z因子一般设为1。但如果你用的DEM是经纬度坐标系以度为单位计算坡度前必须用Project Raster把DEM投影到等面积或等距离投影不然结果会出现严重的纬度畸变。坡度分级重分类。根据你自己的标准把连续坡度值分成若干级别比如0-2、2-6、6-15、15-25、25以上。使用Reclassify工具将坡度栅格变成分级栅格。栅格转面。使用Raster to Polygon工具把分级栅格转成矢量面并勾选“No simplify”保持边界细节。字段汇总。在ArcGIS中使用Zonal Geometry as Table或者直接在Excel里做数据透视统计每个城市的平均坡度、面积占比等。添加经纬度重心。用Feature To Point工具生成面要素的重心点然后添加X,Y坐标导出Excel。这套流程里投影转换是最容易被忽略的一环。很多人在经纬度坐标系下直接跑Slope出来的数值不是偏高就是偏低。统一的做法是在流程开头就投影到Albers等积圆锥投影适合中国全境或者UTM投影适合小范围之后所有分析都在投影坐标系里做。5.2 用Python脚本批量化处理的思路如果你要处理的不是3个城市而是371个城市手动操作肯定不现实。我提供一段使用ArcPy的批处理思路你可以根据自己的目录结构去改import arcpy import os # 设置工作空间 arcpy.env.workspace rD:\slope_data\work arcpy.env.overwriteOutput True # 输入参数 dem_folder rD:\slope_data\dem # 存放已裁剪DEM的文件夹 boundary_folder rD:\slope_data\boundary # 城市边界文件夹 output_gdb rD:\slope_data\result.gdb city_list [] # 你可以填入371个城市的行政区划代码或名称 for city in city_list: dem_path os.path.join(dem_folder, city .tif) boundary_path os.path.join(boundary_folder, city .shp) out_slope os.path.join(output_gdb, city _slope) out_reclass os.path.join(output_gdb, city _reclass) out_polygon os.path.join(output_gdb, city _polygon) # 1. 裁剪DEM out_extract os.path.join(output_gdb, city _extract) arcpy.gp.ExtractByMask_sa(dem_path, boundary_path, out_extract) # 2. 计算坡度 arcpy.gp.Slope_sa(out_extract, out_slope, DEGREE, 1) # 3. 重分类 remap arcpy.sa.RemapRange([[0, 2, 1], [2, 6, 2], [6, 15, 3], [15, 25, 4], [25, 9999, 5]]) out_reclass arcpy.sa.Reclassify(out_slope, Value, remap) # 4. 栅格转面 arcpy.RasterToPolygon_conversion(out_reclass, out_polygon, NO_SIMPLIFY, Value) print(city 处理完成)真实的脚本里还要加投影判断、异常处理、日志输出但核心流程就是上面这些。如果你不熟悉ArcPy用QGIS的批量处理工具也能达到类似效果只是QGIS的图形化界面里每个工具都要单独设置参数批量时不如脚本灵活。5.3 生产过程中的参数建议结合我的实际经验几个参数值得你重点关注Z因子。如果原始DEM是经纬度坐标投影后Z因子保持1即可如果没投影直接算坡度纬度30°以上区域的Z因子会产生明显误差需要用公式修正但最好还是老老实实投影。坡度重分类边界。不同行业标准不一样。农业和国土常用2°、6°、15°、25°城市规划常用5°、10°、20°地质灾害常用10°、25°、45°。做数据之前先问自己这批数据是给谁用的按什么标准分级。输出格式。shp的字段名长度有限制超过10个字符可能被截断如果你需要保留完整字段名建议用File Geodatabase的Feature Class替代shp。普通分享场景shp更通用但字段名一定要精简。低洼平原和城市的特殊处理。不少平原城市整个辖区坡度都小于0.5°栅格转面后会生成海量小碎块造成文件膨胀。这种区域可以考虑在保证分级正确率的前提下把nodsata和邻近面合并阈值设置得稍微高一点或者直接用行政区面整体赋值不做过细拆分。6. 拿到数据后的行动建议在文章最后我没有打算做总结。给你几条我已经验证过的经验直接照着做就行第一先花十分钟做数据体检。打开Excel看Pct_Over25字段把数值排序找几个熟悉的城市对照一下比如北京、成都、贵阳、兰州这些城市的坡度差异明显心里有数了再开始深入分析。第二如果只是做省级对比或PPT汇报用Excel统计表就足够了。如果要做空间叠加、面积计算或者出专题图再导入shp。别一上来就把371个城市的shp全部拖到一个地图文档里不然电脑风扇转起来你会后悔的。第三这份数据的坡度是基于30米分辨率DEM提取的跟实际场地测量值会有出入。任何涉及工程决策的环节必须现场实测复核。数据能做的是初筛和宏观判断不是工程设计的最终依据。第四如果你想把这个数据集扩展到乡镇级甚至村级思路完全一样。把裁剪边界从城市换成乡镇边界或村庄边界重新跑一遍处理流程即可。这也就是你搜到的“全国乡镇级矢量数据”“全国村界矢量数据”背后的通用逻辑。上面这些就是我对这份371城市坡度数据的全部使用经验。希望你的项目因为这份数据少走几步弯路。