上海12.5m DEM高程数据与shp边界:ArcMap裁剪与坡度分析
发布时间:2026/10/27 17:37:37 锦皓数字建站

简介上海市12.5米分辨率DEM数据配套行政边界矢量文件构成一套完整的地理空间数据包适合城市规划、环境研究、灾害评估等领域从业者与GIS学习者使用。包内包含数字高程模型栅格数据tif及辅助文件tfw、ovr、xml等以及上海市行政边界shp要素文件含dbf属性表、prj投影信息等可配合ArcGIS等平台直接加载分析。数据基于WGS84坐标系兼容性与可比性良好。压缩包共15个文件大小约48.05MB文件类型涵盖tif、adf、dbf、shp等常见GIS格式栅格与矢量结合便于分层查看与空间叠加分析。该资源已有806人学习浏览可用于提取坡度坡向、制作地形渲染、分析市域内高程分布特征或结合边界进行分区统计与可视化表达能有效支撑课题研究与项目实践。1. 上海市DEM数字高程12.5m配套边界shp文件裁剪和制图至少省半小时拿到DEM数据却对着行政边界犯愁是地形分析里最常见的翻车现场。这份“上海市DEM数字高程12.5m”不只有一张12.5米格网的高程栅格还带了一份上海市范围shp文件等于把“数据”和“边界”配成一套。你不需要再到处找shp文件下载也不需要手工描边界在ArcMap里用面图层做掩膜提取几分钟就能把全市DEM裁成自己研究的区。适合做淹没分析、坡度分级、建筑选址和规划展示的人尤其是刚接触栅格裁剪的GIS初学者。它解决的是“范围不准、边界对不上、坐标系不明”这三个最耗时间的苦差事。2. 先看懂这套资料12.5m分辨率、坐标系与边界shp的匹配关系2.1 12.5m分辨率不是垂直精度这点必须分清12.5m分辨率的本义是每个像元对应的地面采样间距是12.5米。落到上海市域一张覆盖全市的12.5m DEM大约有2000多万个像元文件体积不小。但要注意这个数字描述的是水平网格密度不是高程测量精度。把“12.5m分辨率”理解成“高程误差只有12.5厘米”是我见过最多的误解。上海平均海拔只有4米左右地形极平东南奉贤一带甚至有低于0米的圩区。但你仍能从12.5m DEM上看出黄浦江走向、外环高架路基和一些农田排灌沟渠的痕迹。我拿到数据后第一件事就是先看渲染效果如果拉伸方式不对整个上海会变成一片亮白有人会误以为数据坏了其实只是符号系统里的直方图没拉伸。这种分辨率适合宏观地形趋势不适合做单体建筑轮廓。如果你在陆家嘴或虹桥枢纽做分析12.5m DEM里那些“凸起”往往是建筑屋顶、植被冠层不是真实地面。雷达干涉获取的高程数据通常代表地表反射面在城市里更接近DSM看见楼顶高度不必惊讶。业内常提“DSM转DEM”那是把地表物体剔除的一套流程和这份数据自带的精度无关。拿这份数据做坡度、坡向、淹没量级评估完全够用拿它去做三维产权定界就很勉强。2.2 用gdalinfo和Python核验范围与坐标系我收到数据的第一步不是直接拉进ArcMap而是先跑gdalinfo。命令行里只看四行Driver、Size、Coordinate System、Corner Coordinates。上海范围大致在经度120.85°到122.0°、纬度30.65°到31.9°之间。如果投影显示是经纬度后续坡度计算会踩“一度不等于一米”的坑必须先投影到平面坐标系再分析。gdalinfo 上海市DEM_12.5m.tif输出里重点关注“Coordinate System is”和“Corner Coordinates”两段。如果空间参考写着GCS_WGS_1984那它是经纬度坐标如果写着WGS_1984_UTM_Zone_51N线性单位才是米。很多从公开渠道下载的12.5m DEM都带着WGS84地理坐标系统直接输入坡度工具会得到异常大的数值。更稳妥的做法是用shp文件作为基准把DEM重投影到和shp一致的坐标系。下面这段Python脚本是我常用的核验和裁剪方式from osgeo import gdal, ogr # 打开边界文件并读取投影 shp_ds ogr.Open(上海市边界.shp) lyr shp_ds.GetLayer() shp_srs lyr.GetSpatialRef() print(shp_srs.ExportToWkt()) # 用边界范围裁剪DEM目标坐标系取shp的坐标系 gdal.Warp(dem_clip.tif, 上海市DEM_12.5m.tif, cutlineDSName上海市边界.shp, cropToCutlineTrue, dstSRSshp_srs.ExportToWkt(), resampleAlgbilinear, dstNodata-9999) print(Clipping done)这里三个参数最容易被忽略。cropToCutlineTrue让输出栅格的范围完全贴合上海市边界而不是保留矩形外框dstSRS强制把结果投影到shp所在的坐标系避免后续坐标单位不统一resampleAlgbilinear用于DEM重采样比最邻近法更平滑不会出现明显的锯齿。如果只是想快速确认范围和坐标系也可以用Python读一下元数据from osgeo import gdal ds gdal.Open(上海市DEM_12.5m.tif) print(ds.RasterXSize, ds.RasterYSize) print(ds.GetGeoTransform()) print(ds.GetProjection()) print(ds.GetRasterBand(1).GetNoDataValue())重点看GetProjection()返回的字符串里是否包含GCS还是PROJCS。如果包含PROJCS且单位是米后面做坡度和等高线就很顺手如果是GCS就先投影。GetNoDataValue()也要记下来很多12.5m数据的无效背景值是-32767或0不清理会让后续统计多出一堆错误极值。2.3 边界shp文件的三重用途裁剪、制图、统计掩膜这份shp不只是用来“框一个范围”它的作用至少有三层。第一层是裁剪用面图层的精确边界去切DEM避免把周边省市的数据包进来第二层是制图最后出坡度图或晕渲图时shp边界作为行政区界线叠在最上层图面才完整第三层是统计把shp作为分区统计的掩膜可以快速算出上海市各个区县的平均高程、最大高差等指标。我一般建议保留原始shp文件不动另存一份mask_上海市区县.shp用于分析。原因很简单原始文件可能带有区县字段如果后续要做按区县分区统计字段被破坏就麻烦了。shp文件不是单个文件至少包含.shp、.shx、.dbf三个文件还可能附有.prj、.sbn等。如果只复制了.shp后缀的文件ArcMap是打不开的。从行政边界到裁剪结果的完整检查路径应该是先投影统一再裁剪然后做面积校验。面积校验的具体做法后面会说但思路是裁剪后的DEM有效像元数乘以像元面积应该接近上海市域面积。如果差得太多多半是投影或NoData出了问题。3. 加载与裁剪ArcMap中按掩膜提取和栅格裁剪的差别3.1 加载数据先从属性里的“源”开始打开ArcMap后用“添加数据”把DEM和shp都加进去。我习惯先加载shp再加载DEM这样图层顺序是DEM在上、边界在下便于检查边界线和地形起伏是否套得准。不要急着做工具先右键DEM图层选“属性”切到“源”选项卡看以下三个信息像元大小、NoData值、空间参考。像元大小必须是12.5米或接近12.5米。如果看到0.000138这样的数值说明栅格仍是经纬度坐标。这时处理步骤多一步用“投影栅格”工具把DEM投影到shp所在平面坐标系再继续裁剪。我这里特别强调因为很多人就是省了这一步裁剪出来的坡度值大得离谱最后怀疑数据本身有问题。如果DEM显示为一片亮白或黑漆漆右键图层→符号系统→拉伸选项里把拉伸类型改成“百分比截断”设置截断范围2%到98%。上海这种平坦地区高程变化区间很窄默认的直方图拉伸会把平坦区域拉成饱和色看着像坏图其实只是渲染问题。3.2 按掩膜提取的完整操作与参数说明按掩膜提取是ArcMap里针对“用面图层裁剪DEM栅格tif文件”最常用的工具。它在Spatial Analyst工具箱里路径是Spatial Analyst Tools - Extraction - Extract by Mask。操作步骤不复杂但每一步都有容易踩坑的地方输入栅格选择已经投影好的DEM不要选原始经纬度数据。输入掩膜数据选择“上海市边界.shp”。输出栅格路径使用英文路径写到磁盘而不是内存缓存数据量大时写到内存会报错。在“环境”设置里把“处理范围”选为“与掩膜相同”把“栅格分析”的像元大小设为“与输入相同”。点击确定后等待工具执行完成再用“缩放至图层”查看结果。第4步里“与输入相同”的意思是输出栅格的像元大小保持12.5米。如果这里选错了比如被设成掩膜shp的默认像元大小1000米那裁出来的结果会有一大块“马赛克”看起来像模糊处理过实际是重采样造成的分辨率丢失。我在实际项目里见过不止一次最后的坡度图完全不能用。执行完成后先看属性里的像元大小确认还是12.5再往下做分析。掩膜提取的结果通常会在边界外出现一圈NoData这是正常的因为它是按面的真实几何形状切出来的。3.3 栅格裁剪工具与掩膜提取的四个区别ArcMap里还有一个“裁剪”工具路径是Data Management Tools - Raster - Raster Processing - Clip很多人拿不准到底用哪个。两者都可以用面图层做裁剪但细节差别很大我整理了一张表对比维度裁剪工具按掩膜提取工具箱位置数据管理工具空间分析工具输出范围可输出面边界形状也可输出外接矩形始终与掩膜形状一致掩膜类型仅支持要素类和栅格范围支持要素类、栅格栅格掩膜优先级更高对NoData的处理矩形裁剪时保留外部NoData像元掩膜外的像元直接变为NoData性能大数据量更快面边界复杂时计算更慢如果你只是“切一块矩形范围出来”两个工具结果差不多。但如果你是“切出上海市行政区边界”按掩膜提取会更直接因为它对每个像元做掩膜判断输出范围精确贴合边界。而裁剪工具如果勾选了“使用输入要素裁剪几何”也能得到不规则形状两者在最终渲染图上差异很小。真正的区别在于掩膜类型。按掩膜提取的掩膜可以是栅格裁剪工具不行。如果你以后要从一张已分类的土地利用栅格里提取某个类别的DEM区域那只能用按掩膜提取先把类别栅格转成掩膜栅格再做提取。这里不要混淆。3.4 QGIS里同样逻辑的对应操作如果你不用ArcMapQGIS里也有对应的做法。菜单路径是Raster - Extraction - Clip Raster by Mask Layer。对话框里四个关键选项输入图层选DEM掩膜图层选shp裁剪范围选“掩膜图层”输出分辨率不勾选“覆盖”让它保持原分辨率。还有一个选项是“为输出栅格创建可选的VRT”一般不勾选。QGIS的这个工具和ArcGIS的按掩膜提取更接近会在裁剪后把范围外设成NoData。如果遇到裁剪后结果显示整个图层都空通常是因为shp的坐标系和DEM不一致在“重投影图层”后重试。逻辑和ArcMap完全一样只是名字不同。4. 从DEM到成型产品等高线提取、坡度分析和DSM转DEM的边界4.1 等高线提取等高距怎么设才不出锯齿裁剪完的DEM可以继续提取等高线。上海这种平缓地区等高距设置非常讲究。设成10米整个上海可能只能抽出几条线图面空荡荡设成1米又会暴露12.5m数据本身的噪声出现大量细碎小圈。我一般会给上海用5米等高距作为中间产品再抽一个25米等高距用于制图简化。在ArcMap里工具路径是Spatial Analyst Tools - Surface Analysis - Contour。输入栅格选裁剪后的DEM输出要素选一个保存路径等高线间距填5起始等高线可以不填。如果数据单位是米Z因子填1如果这时发现等高线数值异常比如城市平地突然出现几百米高差那一定是没有先投影。等高线提取完成后常见问题是锯齿严重。锯齿来源于DEM栅格的阶梯边界特别是在河道和道路处。解决办法不是改等高线工具参数而是先对DEM做一步平滑比如用“焦点统计”取3×3窗口平均值再把平滑结果输入等高线工具。这样等值线会顺滑很多代价是稍微损失一点细节。对于上海这种本来就平的城市损失这点儿细节完全值得。4.2 坡度与坡向分析Z因子和单位不要想当然坡度工具同样在Spatial Analyst Tools - Surface Analysis - Slope。输入DEM输出单位选“度”Z因子填1。这里最关键的就是Z因子它只在XY单位与Z单位不一致时才需要调整。比如XY是米Z是米Z因子就是1如果XY是经纬度Z是米那Z因子大约是111320但这个值随纬度变化上海需要用约111000。实际操作中我建议不要在经纬度坐标系下算坡度因为ArcMap的坡度工具在经纬度下会对Z因子做近似处理结果不如投影坐标系下稳定。先把DEM投影到平面坐标系再算坡度数值可解释性更强。上海大多数地区的坡度集中在0到3度之间如果结果里满屏是10度、20度基本可以判定投影出了问题。坡向工具和坡度放在一起参数更少。对上海这种地势平坦的地方坡向往往受噪声影响很大因为高程差异太小稍微有一点噪声坡向就会乱跳。所以我在城市场景里很少直接看坡向更多是配合山体阴影做晕渲效果。山体阴影工具的方位角设315度高度角设45度出来的立体感比较自然。4.3 DSM和DEM不要混用12.5m数据更接近哪一类前面提到12.5m的雷达高程数据在城市里更接近DSM这一点做分析前必须确认。DSM是地物表面模型包含屋顶、树冠DEM是纯地面模型去掉了这些。如果拿DSM直接做淹没分析建筑位置的高程会比实际地面高水漫不过去模拟结果失真。ArcGIS里没有一键“DSM转DEM”的单独工具常见做法是用中点滤波或形态学运算。比如用“焦点统计”取窗口内的最小值窗口大小可以设成15×15或21×21这样能把独立建筑屋顶削掉但也会抹掉一些真实的轻微起伏。另一种做法是设置最大屋顶尺寸然后对DEM做开运算。这个方法需要试参数没有标准答案。我自己的习惯是如果不是严格的水利项目先用原始12.5m高程数据做宏观坡度分析不着急做DSM去噪。若必须做城市内涝模拟就配合建筑轮廓shp把建筑覆盖区域的栅格值替换为周边地面高程然后用中值滤波做一次平滑。失真会比直接开运算小很多。这里特别提一句因为很多从网上下载的12.5m高程数据标着DEM实际属性却包含大量地表物体不加处理直接算径流路径容易翻车。5. 避坑上海市DEM实践里最常见的五个翻车瞬间5.1 现象裁剪后整个图层全黑压缩直方图也不管用现象按掩膜提取完成后图像变成一片黑色只有零星亮斑。原因大概率是原始DEM没有正确设置NoData背景值-32767或0被ArcMap判定为真实高程在拉伸渲染时把整体颜色压成了黑色。解决先右键属性→源查看NoData值如果没设置可以用“复制栅格”工具重建文件在NoData值栏填-32767。也可以在环境设置里把“NoData值”统一设为一个确定值再重新裁剪。5.2 现象上海出现大量“负高程坑洼”和巨大黑洞现象打开DEM后整个市区很多像元是-32767或-9999统计最小值低得离谱山体阴影图里到处是黑色深坑。原因这些区域是原始数据在陆地范围之外的填充值没有转换成NoData就参与计算。解决先识别无效值的具体数值然后用“栅格计算器”把等于该值的像元赋值为NoData。公式是SetNull(dem -32767, dem)。处理后再做裁剪后续统计面积和最小高程才准。5.3 现象添加shp后图层飞到非洲或者北极现象边界shp加载后ArcMap显示范围是整个世界缩小后shp跑到完全不对的位置。原因shp文件缺少.prj投影文件ArcMap默认把它当作WGS1984经纬度而坐标实际可能是WGS84 Web Mercator或CGCS2000带号坐标导致位置漂移。解决打开文件目录确认是否有.prj。如果没有用ArcToolbox里的“定义投影”工具选择正确的坐标系。上海地区常见的是CGCS2000 3度高斯投影CM 120E如果你的shp是经纬度坐标则定义成GCS_WGS_1984即可不要盲目套UTM。5.4 现象执行“按掩膜提取”报错提示无法从shapefile创建掩膜现象工具运行到一半失败错误码通常是010240或者提示“Failed to create raster from the mask”。原因shp里有多部件几何、自相交或悬挂边转栅格时失败也可能是临时目录权限不够或者路径中有中文。解决先用“修复几何”工具清理shp再在环境设置里把临时工作空间改成纯英文目录比如D:/temp。如果还不行把shp用“要素转栅格”转成12.5m栅格掩膜再作为掩膜输入。这个方案最稳。5.5 现象河道全部变成平地淹没模拟水流乱跑现象用这份12.5m高程数据做水流路径分析河流位置完全看不出下切排水方向乱成一团。原因12.5m雷达数据在生成过程中会把狭窄水体平滑掉上海的中小河道只有几米到十几米宽像元尺寸已经接近河道宽度插值后水面高程和周边地面几乎一致。解决不要只用原始DEM做城市排水分析。给河网数据做“河道烧录”把河网矢量转栅格在河道像元上减去一个经验值比如0.5米到1米再把结果加到DEM上。ArcMap里操作是先做“欧氏距离”得到缓冲再用“栅格计算器”减掉固定值最后“镶嵌”回原DEM。这样河道就有明确的相对低洼形态。6. 进阶把上海市DEM快速做成一张可直接汇报的坡度分级图6.1 重分类按上海的地形特点定断点拿到裁剪后的坡度栅格不要直接拿连续色带去出图领导看不明白。先做重分类。一般分类可以用0-2度、2-6度、6-15度、15-25度、25度以上。但上海绝大多数区域都在2度以内这个分档对上海不适用。我建议改成0-1度、1-2度、2-4度、4-8度、8度以上这样能区分出中心城区和河口边滩的差别。重分类工具在Spatial Analyst Tools - Reclass - Reclassify分类方法选“手动”把断点填进去。输出栅格的类别值直接填0、1、2、3、4。填类别值时注意NoData保持NoData不要给它分配类别。否则在面积统计里会冒出一大块未知区域。6.2 面积统计验证和制图导出分级完成后用“栅格唯一值”工具或“面积制表”统计每个类别的像元数。每个像元面积是12.5×12.5156.25平方米把像元数乘以156.25再除以1,000,000得到的平方公里数应该和上海市域面积接近。上海市面积大约是6340平方公里如果统计结果是7400甚至9000说明NoData没有清理干净或者裁剪范围包含了周边岛屿。这时回去查第5章里的NoData设置。制图导出的技巧有两点。第一比例尺不宜过大上海全市图放到1比20万到1比50万就够了否则等高线和坡度图会糊在一起。第二边界shp要放在所有栅格图层的上面设置一个浅色描边不要用深色粗边不然会遮住地形细节。图例要把分级断点写成“0-1°”“1-2°”这样直接可读的文字而不是“类别1”“类别2”。从那以后我每次拿到新的城市DEM都会强制走一遍gdalinfo投影核验、NoData清理、裁剪后的面积校验这三个动作在上海的项目里基本再没翻过车。希望帮到你。本文还有配套的精品资源点击获取
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。