
简介这份30米分辨率DEM数字高程数据覆盖四川省自贡市全域边界附带部分邻近地区可满足城市级地形分析与跨区域研究的边缘效应需求适合地理信息初学者、GIS从业人员及高校学生用于地形分析、洪水模拟、地质灾害评估、城市规划、课程设计与毕业设计等教学与实践。压缩包共12个文件核心为自贡市dem.tifTIFF高程栅格并配套自贡市范围.shp、.shx、.dbf、.prj、.sbn、.sbx等shapefile完整要素另有ovr金字塔、tfw世界文件、xml元数据与aux辅助文件可直接在ArcGIS、QGIS等平台识别加载。资源包仅14.72MB轻量紧凑。已有421人浏览学习。获取后可立即获得一套完整可用的自贡市30米地形栅格与市级行政边界矢量数据省去自行裁剪、投影配准等前置处理快速开展坡度坡向分析、等高线提取、洪水淹没范围模拟等后续工作。1. 拿到自贡30米DEM压缩包先想三件事再动手拿到“四川省自贡市DEM数字高程数据30m含本市级范围shp文件.zip”这个包很多人的第一反应是解压、拖进ArcMap、看一眼地形晕渲然后就开始各种分析。但以我处理四川盆地周边数据的经验动手前最好先想三件事这份DEM的分辨率适合做什么尺度的事里面那层shp边界到底该怎么用以及数据本身的坐标系、无效值有没有坑。这个包的价值在于它把“高程栅格”和“行政边界”一次性给齐了意味着你可以直接裁出干净的自贡市范围来做坡度、坡向、淹没分析、视域分析不用满世界找边界、对坐标。这篇文章就顺着解压、查验、裁剪、出图的完整路径走一遍把中间最容易翻车的地方提前讲清楚。2. 30m DEM是个什么量级分辨率选型、数据格式与来源判断2.1 30米分辨率在自贡这种丘陵地形里能看清什么自贡的地貌很有代表性典型的四川盆地南缘低山丘陵区中心城区海拔300米上下荣县、富顺往西能到800米以上整体高差不大但地形破碎沟谷、垭口、浅丘一个接一个。30米分辨率在这种地形上一个格网对应大约900平方米能清楚表达一个丘包、一段沟谷的宏观起伏做市级尺度的流域划分、坡度分级、地质灾害易发性评价、淹没模拟精度完全够用。但如果你要做的是单条冲沟的精细切割、道路中线两侧3米范围内的坡向分析30米就不够了那需要12.5米甚至更高精度的数据。区分这个边界很重要因为30米DEM的“刚刚够用”和“明显不够用”之间隔着完全不同的生产流程。我的经验是凡是最终成果图比例尺在1:5万到1:10万之间的30米绰绰有余凡是成果要求到1:1万甚至更大比例的尽早换数据源别在30米上硬磨。这里给出一个常见的选型参照分辨率常见来源类型能看清什么典型用途数据体量12.5米ALOS等卫星雷达/光学立体像对单沟道、小冲沟、人工陡坎县级精细调查、线路工程选址大一个地级市往往数百MB以上30米SRTM30、ASTER GDEM等丘陵包络、沟谷走向、宏观坡向市级/流域级分析、灾害易发性、淹没模拟中等一个地级市几十MB量级90米SRTM90地貌单元、大区域趋势省级以上概查、气候水文模型粗算小全省也就几十MB我一般拿到30米数据先做个坡度统计看一眼自贡这种丘陵地区30米格网算出来的坡度在0到30度之间平滑过渡是正常的如果出现大范围60度以上的陡坡条带那基本可以判断数据有噪声或无效值没处理好这个放到第五章细说。2.2 拿到数据先查三样东西格式、无效值、坐标系不管数据从哪来解压之后先别急着加载打开栅格属性查三样东西。第一是格式。常见交付格式是GeoTIFF或者IMG。GeoTIFF最省事ArcGIS、QGIS、Global Mapper读它都不会出幺蛾子。如果压缩包里是IMG注意它经常伴随.rrd、.aux这些旁文件拷数据的时候容易漏漏了也能打开但显示和统计会变慢。如果看到的是分幅的多个tif而不是一个整幅那说明数据是拼接前的原始分幅你后面需要先用Mosaic工具拼一次再裁剪这个工作量要提前算进去。第二是无效值。DEM的无效值常见写法有-9999、0、32767。很多DEM生产时水域、范围外、数据缺失区的无效值没有写进栅格属性里或者写成了0。如果0被当成正常高程参与统计那平均海拔会被生生拉低。我处理过的某份四川数据无效值是-32768整型存储属性里Nodata没设置直接导致后续坡度分析时出现一片黑洞。这个坑到第五章专门讲。第三是坐标系。四川地区常见两套CGCS2000地理坐标系经纬度单位CGCS2000 / 3-degree Gauss-Kruger CM 105E这是高斯三度带投影对应EPSG里4547这一档。自贡市域大致落在东经104度到105度之间所以投影坐标大概率是105度中央经线。怎么看栅格属性里的“Spatial Reference”会写清楚。如果读出来X坐标是八位左右的大数、Y坐标是七位左右的大数那是投影坐标如果X是104左右的两位小数那是地理坐标。这个直接影响后面裁剪和算面积的正确性务必每次新建项目都先看一眼。3. 压缩包里除了DEM那层shp边界才是最值钱的部分3.1 shp不是一个文件是五个以上文件的组合“本市级范围shp文件”听起来像一个文件实际上shapefile是一组文件的集合。很多人交接数据时只拷了.shp后缀的那一个文件拿回去一打开ArcGIS报错“无法打开”还以为数据坏了其实只是缺了兄弟文件。一个完整可用的shapefile至少包含文件后缀角色丢失后果.shp要素几何本身没有它什么都不用谈.shx几何索引打不开或者打开极慢.dbf属性表存行政区名称、代码等能显示但属性为空.prj坐标系定义软件按未知坐标处理无法和其他数据对齐.cpg属性表字符编码中文属性乱码.sbn / .sbx空间索引不影响打开影响查询速度我处理自贡这个包的时候拿到手先看压缩包里shp家族齐不齐。如果只有.shp和.dbf至少要补一个.prj才能可靠使用。更规范的做法是拷完数据之后在ArcGIS里用ArcToolbox的“Feature Class to Shapefile”重新导出一份完整的确保所有旁文件齐全再入库存档。另外注意不排除交付方给的是GeoPackage或File Geodatabase里的要素类。如果压缩包里没有.shp后缀文件而是.gdb文件夹本质一样只是载体不同。这个包既然标题写明含shp文件按shapefile家族处理即可。3.2 市级边界shp在项目里的四个用途很多人觉得shp只是用来“看个范围”实际它在这个DEM项目里的作用要大得多。第一是裁剪栅格。这是最核心的用途。用自贡市边界去裁剪30米DEM输出正好是自贡市辖区的完整高程栅格。没有这层边界你得自己画范围、描轮廓描偏一条边统计面积就错一截。第二是掩膜统计。做县级、乡镇级汇总时按边界做Zonal Statistics可以得到每个行政单元的高程均值、最大最小值、标准差。比如自贡下辖自流井、贡井、大安、沿滩四区加荣县、富顺两县边界shp的属性表里通常会带上区县名称字段直接按这个字段做分区统计就好。数据包里如果只有市级边界没有区县级那需要你另外准备区县界或者从全市边界里自己切。第三是制图与图廓整饰。高程图、坡度图上叠加行政边界读者才知道哪里是哪里。输出图片时把shp线划加粗一层用不着再去描地形线。第四是算面积、算周长。做淹没模拟或者地块平整方案时需要按高程分级统计“某海拔以下有多少平方公里”这时shp就是统计口径的标尺。没有它你统计出来的面积可能把自贡周边眉山、宜宾、泸州的地块都算进来结果就废了。4. 用面图层裁剪DEM掩膜提取设置、批量脚本与三个参数4.1 ArcMap里两个提取工具的区别矩形提取和掩膜提取怎么选把DEM裁剪成自贡市范围ArcMap里有两个长得像的工具很多人在这翻车。一个叫“按矩形提取”Extract by Rectangle一个叫“按掩膜提取”Extract by Mask。搜索引擎里绕不开的那个问题——依靠面图层裁剪dem栅格tif文件和依靠面图层掩码提取有啥区别——答案就在这里。按矩形提取输出的是能包住自贡市范围的矩形外框矩形之外全是无效值或黑边。它的好处是快、简单适合你只是想快速看某个方位的一张图。但如果你拿去统计面积、做坡度分级矩形外的无效区域会混进来必须再做一步“按属性剔除”或者重新裁剪。按掩膜提取是真正沿着shp边界去切输出形状和shp轮廓一致边界外不产生像元。这才是做正式成果该走的路径。具体操作步骤在ArcMap里同时加载DEM和自贡市边界shp打开ArcToolbox依次展开Spatial Analyst Tools、Extraction。双击“Extract by Mask”。Input raster选DEM层Input raster or feature mask data选自贡市边界shpOutput raster填输出路径注意用英文路径路径里别有中文和特殊字符。环境设置里把“Snap Raster”设为DEM本身把“Cell Size”设为和DEM一致保证输出像元大小没有悄悄变化。点OK等几十秒到几分钟看数据大小。如果输出范围和shp不一致优先查环境和坐标系。这个操作本身不难坑通常出在环境设置上。比如ArcMap里开启了“分析范围”默认跟着某个别的地图图层走导致裁剪结果偏大或者偏小。所以每次跑Extract by Mask之前我习惯先在环境设置里把Processing Extent选为“Same as layer DEM”把Mask选为“None”避免历史设置残留影响结果。4.2 用Python脚本批量裁剪替代手工反复点工具只裁一个市级范围ArcMap点两下就够了。但如果你要按区县、乡镇分别出图手工点工具会点到怀疑人生。更可靠的路线是用Python脚本批量处理顺带把坐标系检查、无效值处理写进流程里。下面这个脚本是我常用的裁剪模板直接对着自贡这个场景改路径就能用。import geopandas as gpd import rasterio from rasterio.mask import mask # 1. 读取边界。这里用自贡市边界shp注意确保文件家族齐全 boundary gpd.read_file(shp/自贡市边界.shp) # 2. 统一坐标系到DEM所在坐标系。如果边界是WGS84DEM是CGCS2000 # 两者在地球表面的差距在几十厘米到米级但投影后可能错位必须先统一 boundary boundary.to_crs(EPSG:4490) # 以DEM的坐标系为准这里示例为CGCS2000地理坐标 # 3. 打开DEM栅格 with rasterio.open(DEM/自贡市DEM30m.tif) as src: geoms boundary.geometry.values # cropTrue 让输出紧贴边界范围不保留外围 # nodata 继承原栅格的无效值设置如果src.nodata为None这里要手动指定 out_image, out_transform mask( src, geoms, cropTrue, nodatasrc.nodata if src.nodata is not None else -9999, all_touchedFalse # False:只保留中心点落在边界内的像元边界更干净 ) # 4. 更新元数据否则输出文件还留着原图的范围信息加载会错位 out_meta src.meta.copy() out_meta.update({ driver: GTiff, height: out_image.shape[1], width: out_image.shape[2], transform: out_transform }) # 5. 写结果建议存成GeoTIFF主流软件通吃 with rasterio.open(output/自贡市DEM_裁剪.tif, w, **out_meta) as dest: dest.write(out_image)这段脚本的逻辑分四步先读边界并统一坐标再用rasterio.mask.mask函数按边界几何裁剪然后更新输出元数据里的高度、宽度和仿射变换信息最后写盘。几个参数值得单独说cropTrue是核心它会把输出范围紧贴到边界外接矩形而不是保留整幅原图范围不然裁完的文件还是那么大只是外面变成无效值而已。all_touchedFalse决定边界穿过的像元怎么取舍False表示只保留像元中心点在多边形内部的边缘净一些但个别极窄的沟谷处可能断开True表示只要像元被边界碰到就保留边缘会厚一圈做连续性分析时更安全。nodata参数决定了边界外写什么值建议先用print(src.nodata)看一眼原始数据如果属性里没有设置就直接用-9999并在后续处理中用SetNull把-9999再设为NoData。如果你要按区县分别出成果用boundary里的某个字段分组循环即可核心逻辑不变。常见做法是先用boundary[区县名].unique()拿到列表再逐一遍历写入单独的tif文件。注意区县名的中文编码问题输出文件名建议用拼音或代码避免操作系统路径编码不认。5. 自贡这类DEM项目最常见的5个坑现象、原因、处理5.1 黑边和凭空高程无效值没对齐现象裁剪后的DEM在边界外显示为纯黑的矩形区域或者做分区统计时某块地方出现异常低值。原因原始DEM在范围外可能存储的是0、-9999或一个极端的负数但栅格属性里没有正确标记Nodata。裁剪后这些无效值跟随裁剪范围被保留统计时0值被当成真实海拔参与计算平均海拔被拉低。解决拿到数据先查属性。在ArcMap里右键图层打开属性在“源”选项卡里看“NoData Value”是什么。如果是“无”用“栅格计算器”配合SetNull处理。公式类似SetNull(自贡DEM -9999, 自贡DEM)。处理之后再裁剪边界外的像元才是真正的NoData统计结果才可信。5.2 边界和DEM错位几百米坐标系不统一现象shp边界和DEM套在一起时边界明显偏离实际地形河流沿边界走势对不上或者边界整体偏向一侧。原因八成是边界用了WGS84经纬度而DEM用了CGCS2000投影坐标也可能是边界是西安80老数据DEM是CGCS2000新数据。两者之间差了几十米到几百米不等叠加时肉眼可见。解决以DEM为准。打开ArcToolbox里的Project工具把自贡市边界shp从原坐标系转到DEM的坐标系。注意不要用“定义投影”工具去强行改那是给丢坐标系的裸数据用的用在已经有坐标的数据上会制造更大的错位。转换完成后重新加载两个图层叠加检查一遍河流和山脊线是否吻合。5.3 裁剪边界带锯齿或外扩一排像元栅格网格与矢量边界的取舍现象裁剪后的DEM边缘呈现明显的锯齿状或者沿边界多出来一圈“毛边”面积统计和shp本身的面积对不上。原因这是栅格数据和矢量数据的天然差异。栅格像元是方块矢量边界是折线两者永远不可能完全贴合。ArcMap和rasterio在掩膜裁剪时都有取舍规则只保留中心在边界内的像元边界处就会显得往里收保留所有被边界碰到的像元边缘就会多一圈。解决按面积精度要求来选。做面积统计类工作建议用all_touchedFalse的方式让边界外像元尽量少混入。做连续性分析、汇水区分析用all_touchedFalse太容易出现细碎空洞可以改用True。另外裁剪结果后先用“栅格转面”或“以表格显示分区统计”核对总面积栅格统计面积和shp面积差在1%以内是正常的超过这个范围就要怀疑参数设置有问题。5.4 高程范围出现离谱值整型DEM的无效值设置现象加载DEM后自贡城区中央出现一个海拔两万多米的山包或者河流位置出现负海拔。原因部分DEM用整型存储高程无效值写成-32768或-9999而软件在显示时没有把无效值识别为NoData直接按正常高程渲染。这种情况往往只在特定拉伸方式下才暴露做坡度分析时会形成放射状条纹。解决第一步用识别工具点一下异常位置读出像元值。如果读出来是-9999或-32768这类整数说明是无效值。第二步用栅格计算器把无效值替换为NoData公式如SetNull(自贡DEM -1000, 自贡DEM)。第三步重新检查高程范围自贡市境内正常海拔基本在250到900米之间如果统计结果里出现三位数以下或四位数以上的大范围异常继续追查。5.5 zip解压报错或解压后少文件先验包再干活现象双击zip解压进度条走到一半报错弹出一堆英文常见的是invalid zip archive: could not find EOCD或者解压提示成功但发现shp家族少了.prj和.dbf。原因zip文件末尾有一个叫EOCD的记录相当于压缩包的目录索引。文件没下载完、网盘客户端中断、杀毒软件拦截写入都会导致这个记录缺失或损坏。表面看压缩包能打开很多解压工具会先试解压再校验结果解出一半就报错。少文件的情况则多是杀毒软件误杀了.dbf或.prj。解决动手前先验包。在命令行里用Python一行代码测试import zipfile # 只测试不释放任何文件损坏都会报错 with zipfile.ZipFile(自贡市DEM30m.zip) as zf: bad zf.testzip() if bad is not None: print(f损坏文件: {bad}) else: print(压缩包完整可解压)testzip会逐个解压文件并校验CRC返回第一个损坏的文件名。如果返回None说明包是好的。解压后还要对照shp家族清单检查一遍缺了.prj就上网找同来源数据的坐标系元数据补一个prj文件缺了.dbf那属性表没了边界还能用但没法按区县区分影响大得多。另外我习惯把解压路径放到纯英文目录下之前有过在带空格和中文括号的路径里ArcGIS读取栅格直接报“栅格数据集无效”的情况换成英文路径问题马上消失。6. 交付前先做这三项验证再谈拓展裁剪完成、无效值处理干净之后别急着出图交差。我一般用三项检查来给数据验收每项都很快但能把前面埋下的隐患暴露出来。第一是高程合理性检查。在ArcMap里右键数据看“符号系统”里的拉伸统计确认最小最大值落在我前面说的250到900米范围内。如果最低值出现负数但明显不是水域或者最高值超过了1000米回头查无效值。第二是地形逻辑检查。加载一个卫星影像底图或者河网shp看DEM渲染的山脊线和河流走向能不能对得上。自贡境内的主要河流是沱江及其支流在DEM上应该能看到清晰的沟谷形态。如果河流位置全在“山脊”上那坐标系一定还有问题。第三是面积校准。用栅格转面工具或者Zonal几何统计算出DEM有效像元的覆盖面积和shp里自贡市的面积做对比。自贡全域面积在4300平方公里上下30米分辨率下栅格统计面积和shp面积差在1%以内是正常的差太多就说明裁剪范围或无效值处理有问题。三项验证都过了这个数据包才真正变成可交付的成果。沿着这个基础再往外走你还可以用填挖方工具做场地平整量估算用视域分析看某观测塔台的通视范围或者把裁剪好的自贡DEM转成坡度、坡向数据后接入三维场景做淹没模拟。从我自己的教训来说早几年做流域统计时我偷懒没做无效值检查把一个外省边界的湖面零高程直接算进了自贡的平均海拔里报告差点就交出去了从那以后验包、查Nodata、核对坐标系这三步就再没省过。希望帮到你。本文还有配套的精品资源点击获取