简介:这份资源是面向GIS、遥感及地形分析学习者的重庆市30米分辨率数字高程模型数据包,基于ASTER GDEM V3全球数据集自行拼接裁剪而成,可直接用于城市规划、地质灾害评估、水文模拟、交通选线等场景,适合具备一定GIS基础的中高级用户。压缩包共10个文件,约125.77MB,以GeoTIFF栅格数据为核心,辅以Shapefile矢量边界(含shp、shx、dbf、prj等配套文件)、tfw坐标信息文件及xml元数据,覆盖WGS84投影,便于在ArcGIS、QGIS等软件中直接加载并开展坡度、坡向、汇流等分析。目前已有904人学习下载,数据经过拼接与重投影处理,省去原始分幅数据整合的繁琐步骤,读者可快速获得覆盖重庆全市的连续DEM图层,并结合行政边界矢量数据完成裁剪、地形复杂度计算与可视化制图,为科研与工程决策提供可靠的地形底图。
1. 重庆DEM(30米分辨率):山城地形数据到底怎么用起来
第一次拿到重庆DEM(30米分辨率)的人,十有八九会先愣一下:打开一看全是灰不溜秋的栅格,山在哪里、江在哪里、坡度在哪里,全得自己算。重庆这地方又特殊,主城夹在两江之间,渝东北、渝东南全是深丘和山地,海拔从一百多米一路爬到两千多米,用平地的思路去处理这套数据,翻车是迟早的事。这篇笔记讲的就是:重庆DEM(30米分辨率)从哪来、怎么读、坡度坡向汇流怎么算、山城特有的坑在哪,以及这套数据到底值不值得你投入时间去做。适合做GIS分析、选址评估、水文模拟、遥感入门的人,新手能照着命令跑通,熟手能对一下参数边界。
2. 重庆DEM(30米分辨率)的数据来源与选型:为什么不是随便下一份就行
2.1 30米这个分辨率对重庆意味着什么
先把概念钉死。DEM是数字高程模型,每个栅格存一个海拔值。30米分辨率,就是一个像素代表地面30米×30米的方块。放到重庆,这个尺度刚好卡在一个尴尬又实用的位置:比1弧秒(约30米)的SRTM、ASTER GDEM粗不到哪去,又比12.5米的ALOS World 3D、5米的商业数据省存储、跑得快。
重庆主城核心区南北不过十几公里,30米一格意味着一条嘉陵江江面宽度大概就2到4个像素。这就带来第一个认知:在重庆用30米DEM,江面、陡崖、桥隧这些细节是被抹平的。你要是做城市级微地形、单体建筑选址,30米不够;但做区县级坡度分级、流域划分、大范围适宜性评价,30米是性价比最高的档位。
常见做法是优先选经过水文校正的DEM,比如填洼处理过的版本,而不是直接拿原始SRTM。原因后面避坑章会细说。
2.2 数据获取:几个能落地的渠道
不编造具体下载链接,只说渠道类型,你自己按需找:
- 地理空间数据云、国家对地观测科学数据中心这类平台,能拿到SRTM 1弧秒、ASTER GDEM V3,覆盖重庆全境。
- 测绘地理信息主管部门发布的公开版基础地理数据,部分省份有1:5万DEM,精度和现势性更好,但申请流程长。
- 商业或科研合作渠道的ALOS World 3D 30米,全球覆盖,山地表现比SRTM稳。
选型判断就三条:覆盖是否完整、是否做过填洼/去噪、坐标系是否明确。重庆跨了WGS84下的多个UTM带,主城在48带,渝东北部分落到49带,直接混用会错位,这是新手最容易忽略的点。
2.3 拿到数据先做的三件事
别急着算坡度。先做这三步,能省掉后面一半的返工。
# 1. 查看栅格基本信息:尺寸、坐标系、NoData值 gdalinfo chongqing_dem_30m.tif # 2. 统一到投影坐标系(重庆主城推荐UTM 48N,EPSG:32648) gdalwarp -t_srs EPSG:32648 -r bilinear -of GTiff \ chongqing_dem_30m.tif chongqing_dem_utm48.tif # 3. 裁剪到研究区(以某个区县边界为例) gdalwarp -cutline study_area.shp -crop_to_cutline \ chongqing_dem_utm48.tif chongqing_dem_clip.tif逻辑说明:gdalinfo先确认NoData值,很多SRTM的NoData是-32768,不处理会在坡度计算时变成巨大异常值。gdalwarp重投影时重采样方法选bilinear,高程数据不要用near,否则会出现阶梯状伪影。裁剪用-crop_to_cutline而不是先裁后投影,能减少边界插值误差。
参数说明:-t_srs是目标坐标系,重庆做面积、坡度、汇流这类量算,必须用投影坐标系,地理坐标系(经纬度)算出来的坡度单位是度/度,没有物理意义。-r重采样,高程连续数据用双线性或三次卷积。
3. 从DEM到坡度坡向汇流:重庆山地必须调的参数
3.1 坡度坡向计算:算法选择和单位陷阱
坡度是DEM最常用的派生量。GDAL和RichDEM、WhiteboxTools都能算,但结果差异不小。核心在算法:Horn算法(3×3窗口)平滑,适合大范围;Zevenbergen-Thorne适合地形起伏剧烈的区域。重庆这种山地,我一般用Horn,因为更稳,不容易在陡崖处爆出极端值。
import richdem as rd import numpy as np dem = rd.LoadGDAL("chongqing_dem_clip.tif") # 计算坡度(度) slope = rd.TerrainAttribute(dem, attrib='slope_degrees') rd.SaveGDAL("chongqing_slope.tif", slope) # 计算坡向 aspect = rd.TerrainAttribute(dem, attrib='aspect') rd.SaveGDAL("chongqing_aspect.tif", aspect) # 统计坡度分布,看有没有异常 valid = slope[slope > -9999] print("坡度均值:", np.mean(valid)) print("坡度>35度占比:", np.sum(valid > 35) / valid.size)逻辑说明:RichDEM的TerrainAttribute内部处理了边缘和NoData,比手写卷积稳。算完一定要做分布统计,重庆山地坡度>25度的比例很高,如果算出来均值只有几度,八成是投影没换或者NoData没处理。
参数说明:slope_degrees输出度,slope_percent输出百分比,做工程边坡分级用度更直观。坡向输出是0-360度,正北为0,注意它和坡度一样对平坦区无意义,平坦区坡向是噪声,后续用坡度阈值掩掉。
3.2 填洼与汇流累积:山城水文分析的关键一步
重庆的DEM里,喀斯特洼地、水库、采石场会形成大量伪洼地。不填洼直接算汇流,水流会断在坑里,河网支离破碎。填洼用Wang & Liu算法,WhiteboxTools里叫FillDepressions。
# 填洼 whitebox_tools -r=FillDepressions \ --dem=chongqing_dem_clip.tif \ --output=chongqing_dem_filled.tif # 计算流向(D8算法) whitebox_tools -r=D8Pointer \ --dem=chongqing_dem_filled.tif \ --output=chongqing_flowdir.tif # 汇流累积 whitebox_tools -r=D8FlowAccumulation \ --input=chongqing_flowdir.tif \ --output=chongqing_flowacc.tif \ --pntr --out_type=cells逻辑说明:填洼会改变原始高程,所以填洼后的DEM只能用于水文分析,不能拿去算坡度,这是血泪经验。D8算法每个格子只往一个方向流,简单快,但在重庆这种复杂地形上会人为拉直河道,做精细水文模拟建议换D-infinity或MFD。
参数说明:--out_type=cells输出汇流累积的格子数,换成catchment_area输出面积。提取河网时用阈值法,重庆山区一般取汇流累积>500到1000个格子作为河道起点,具体值要按流域大小试。
3.3 山影与地形起伏度:给选址和景观分析用
重庆做光伏选址、观景平台、通信基站,地形起伏度和山影是硬指标。起伏度就是窗口内最大最小高程差,窗口大小按需求定,做宏观地貌用1km窗口,做局地微地形用100到300米。
import richdem as rd dem = rd.LoadGDAL("chongqing_dem_clip.tif") # 地形起伏度,窗口半径15格(约450米) roughness = rd.Roughness(dem, radius=15) rd.SaveGDAL("chongqing_roughness.tif", roughness) # 山影(hillshade),方位角315,高度角45 hs = rd.Hillshade(dem, azimuth=315, altitude=45) rd.SaveGDAL("chongqing_hillshade.tif", hs)逻辑说明:起伏度窗口半径直接决定结果粒度,半径太小全是噪声,太大就糊成一片。重庆主城用10到15格(300到450米)比较合适,渝东南深山可以放大到30格。山影的方位角和高度角按出图需求调,做地形可视化常用315/45,做日照分析要按真实太阳位置算。
参数说明:radius单位是格数不是米,换算时记得乘30。山影输出是0-255灰度,可以直接叠加到地图上。
4. 重庆DEM(30米分辨率)避坑:五个真实踩过的坑
4.1 坑一:投影没换,坡度算出来全是错的
现象:坡度图看着挺正常,但统计均值只有2到3度,明显偏低。 原因:DEM还是WGS84地理坐标系,栅格单位是度,坡度算法按度/度算,数值被严重压缩。 解决:先gdalwarp到UTM投影,重庆主城用EPSG:32648,渝东北渝东南按经度选49带(EPSG:32649)。换完再算,山地坡度均值一般能到15到25度。
4.2 坑二:NoData值没设,边缘出现巨大异常
现象:坡度图边缘一圈黑或者白,数值动辄几百度。 原因:原始DEM的NoData是-32768,算法把它当真实高程参与计算,相邻格差几万米。 解决:gdalinfo查NoData,用gdalwarp -dstnodata或RichDEM的rd.SetNoData显式设置,再算派生量。
4.3 坑三:填洼后的DEM拿去算坡度
现象:坡度图出现大片平坦区,和实际地形对不上。 原因:填洼把洼地填平了,高程被改,坡度自然失真。 解决:填洼DEM只用于流向和汇流,坡度坡向起伏度一律用原始(或仅去噪)DEM。两份数据分开管理,文件名标清楚。
4.4 坑四:跨带拼接不处理,接边处错位几百米
现象:把渝东北和主城的DEM拼一起,接缝处地形对不上,河流断开。 原因:两块数据用了不同UTM带,直接拼接坐标系不一致。 解决:统一重投影到一个带,或者用地理坐标系拼接后再整体投影。跨带大范围分析建议用Albers等积投影,重庆可用CGCS2000 Albers。
4.5 坑五:汇流阈值拍脑袋,河网要么太密要么断流
现象:提取的河网密密麻麻像毛细血管,或者主河道都断成几截。 原因:汇流累积阈值没按流域面积调,重庆山区小流域多,统一阈值不适用。 解决:按研究区最小关心流域面积反推阈值。比如关心1平方公里以上的沟道,阈值约等于1000000/(30×30)≈1111个格子。分区域试,主城和深山用不同阈值。
5. 进阶:用重庆DEM做一套可复用的地形因子流水线
单次分析做完就完了,但实际项目里DEM派生量要反复用。我一般搭一条流水线,把重投影、去噪、坡度、坡向、起伏度、汇流一次性跑完,输出统一命名、统一坐标系、统一NoData的成果包。这样下次换研究区,改个边界和投影参数就能复用。
import subprocess import os def build_terrain_pipeline(dem_path, out_dir, epsg=32648, rough_radius=15): os.makedirs(out_dir, exist_ok=True) base = os.path.join(out_dir, "dem_utm.tif") # 重投影 subprocess.run(["gdalwarp", "-t_srs", f"EPSG:{epsg}", "-r", "bilinear", "-dstnodata", "-9999", dem_path, base], check=True) # 坡度、坡向、起伏度 import richdem as rd dem = rd.LoadGDAL(base) rd.SaveGDAL(os.path.join(out_dir, "slope.tif"), rd.TerrainAttribute(dem, attrib='slope_degrees')) rd.SaveGDAL(os.path.join(out_dir, "aspect.tif"), rd.TerrainAttribute(dem, attrib='aspect')) rd.SaveGDAL(os.path.join(out_dir, "roughness.tif"), rd.Roughness(dem, radius=rough_radius)) # 填洼+流向+汇流 filled = os.path.join(out_dir, "dem_filled.tif") subprocess.run(["whitebox_tools", "-r=FillDepressions", f"--dem={base}", f"--output={filled}"], check=True) flowdir = os.path.join(out_dir, "flowdir.tif") subprocess.run(["whitebox_tools", "-r=D8Pointer", f"--dem={filled}", f"--output={flowdir}"], check=True) subprocess.run(["whitebox_tools", "-r=D8FlowAccumulation", f"--input={flowdir}", f"--output={os.path.join(out_dir, 'flowacc.tif')}", "--pntr", "--out_type=cells"], check=True) print("流水线完成,成果在:", out_dir) build_terrain_pipeline("chongqing_dem_30m.tif", "./cq_terrain_out")逻辑说明:把重投影放第一步,后面所有派生量都在统一投影下算,避免跨带问题。填洼单独走一条支线,不和坡度混用同一份DEM。函数化之后,换区县只改输入路径和EPSG。
参数说明:epsg按研究区经度选,重庆主城32648,渝东北渝东南32649。rough_radius按分析尺度调,宏观用30,局地用10。输出统一NoData为-9999,方便后续批量处理。
验证方法:跑完后抽查三个点——一个已知山顶、一个江面、一个陡崖,用gdallocationinfo读高程和坡度,和实地或高精度数据对比。误差在合理范围(30米DEM高程误差通常几米到十几米)就说明流程没问题。
我自己做重庆项目这些年,最大的习惯就是先看坐标系和NoData,再动手算任何东西。这两样不对,后面全是白干。重庆DEM(30米分辨率)不算精细数据,但把投影、填洼、阈值这几个参数调对,它能撑起区县级大部分地形分析需求,投入产出比很高。希望帮到你。
本文还有配套的精品资源,点击获取