尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

滇池抚仙湖流域地形图制作:从DEM预处理到水文分析全流程

滇池抚仙湖流域地形图制作:从DEM预处理到水文分析全流程 简介针对云南滇池与抚仙湖流域的ArcGIS地形图制作资源包适合GIS初学者、ArcGIS用户及地理环境研究者使用。资源围绕DEM数字高程模型与Shapefile矢量数据展开覆盖地形图制作、等高线/山体阴影生成、流域水文分析等常见场景可用于练手或作为区域地理研究的数据底图。压缩包共68个文件约25.12MB主要包含shp、dbf、prj、shx等矢量图层文件adf、dat、nit等栅格DEM数据以及mxd地图文档和ovr概览文件各类型文件配合可完成从数据加载、符号化到出图的全流程操作目录结构清晰便于按文件类型快速定位和调用。已有1590人浏览学习。通过这份素材可掌握在ArcGIS中加载和管理shp与dem数据、借助dbf属性表统计河流长度或湖泊面积、利用dem生成地形渲染与等高线并参考mxd模板快速制作专业流域地形图对理解滇池与抚仙湖流域的地形地貌和水文特征也有直接帮助。1. “滇池抚仙湖流域地形图”这件事先别急着打开ArcMap接到“滇池抚仙湖流域地形图制作”这个需求不少人的第一反应是下载一个DEM打开ArcMap拉伸着色再拖一条河流shp进去。但实际做下来你会发现真正卡住你的不是渲染而是数据本身DEM从哪个渠道拿、坐标系对不对、NoData有没有处理滇池和抚仙湖分属两个独立汇水区中间隔着分水岭流域边界不靠画框靠水文分析算出来。这篇文章按一条常规可执行的路径展开先搞定shp和dem的下载与预处理再走填洼、流向、流量提取河网然后叠加山体阴影完成地形图制图最后处理分水岭提取、拓扑检查、负面积和格式转换这些交付前的高频坑。适合需要临时出图的项目也适合想把流域分析流程固化成模板的团队。2. DEM与shp数据管线从下载到流域范围裁剪2.1 数据源选择与坐标预检12.5米DEM和shp从哪里拿滇池和抚仙湖这种小流域DEM分辨率建议用12.5米。以滇池流域约2900平方公里、抚仙湖流域约674平方公里计算12.5米数据大约需要2到4幅影像覆盖文件不大处理起来比30米数据更细腻河网和分水岭的边界也更好看。数据源分辨率格式常见问题ALOS PALSAR 12.5m12.5米GeoTIFFNoData常为-9999需预处理SRTM 1弧秒30米GeoTIFF部分区域有空洞需要插值NASADEM30米GeoTIFF质量稳定但分辨率偏低ASTER GDEM30米GeoTIFF伪洼地和条带多填洼压力大下载渠道绕不开地理空间数据云、OpenTopography和USGS EarthExplorer这几个平台注册后按经纬度范围框选下载。ALOS数据在不同平台存储的投影不一样有的是UTM有的是经纬度地理坐标这会直接影响后续填洼和流向计算的连续性拿到手第一件事不是加载而是确认坐标系。shp矢量数据则分两类道路、水体、居民点这类基础要素OpenStreetMap基本够用属性里带highway、waterway字段方便筛选行政边界和流域范围建议用天地图或国家基础地理信息中心公开的成果精度和拓扑关系比OSM可靠。我一般先把研究区域的行政边界合并成一个面要素后续的裁剪、掩膜全部复用它避免每次重新去框选。2.2 用Mosaic和Clip做拼接裁剪而不是直接套矩形滇池和抚仙湖两个流域经常跨多个图幅处理顺序一定是先拼接再裁剪。如果先逐幅裁剪再拼接接缝处会出现明显的错位和NoData边缘。import arcpy from arcpy.sa import * arcpy.env.workspace rD:\dianchi_fuxianhu arcpy.env.overwriteOutput True # 1. 拼接相邻DEM图幅 arcpy.management.MosaicToNewRaster( input_rasters[dem_tile_01.tif, dem_tile_02.tif, dem_tile_03.tif, dem_tile_04.tif], output_locationrD:\dianchi_fuxianhu, output_namedem_mosaic.tif, number_of_bands1, mosaic_methodBLEND, mosaic_tolerance0 ) # 2. 按流域范围掩膜裁剪 dem_clip rD:\dianchi_fuxianhu\dem_clip.tif basin_shp rD:\dianchi_fuxianhu\basin_extent.shp out_extract arcpy.sa.ExtractByMask(out_mosaic, basin_shp) out_extract.save(dem_clip)MosaicToNewRaster里的BLEND模式对重叠区做渐变过渡适合地形连续区域如果换成FIRST模式接缝处会有跳变出图时肉眼可见。mosaic_tolerance单位是像元设为0表示不做容差放宽保留原始数据边界。ExtractByMask支持面要素和栅格两种掩膜如果basin_shp的坐标系与DEM不一致工具会自动做动态投影但动态投影只影响识别栅格输出范围和像元大小仍以掩膜为准坐标差异大时建议先Project再裁剪。2.3 NoData处理与shp的坐标统一ALOS的12.5米DEM下载后经常遇到-9999的NoData值这个值如果不处理填洼会把大面积无值区识别成凹陷地形流出计算直接崩掉。常规做法是在预处理阶段把异常值替换成真正的NoDatadem_raw Raster(rD:\dianchi_fuxianhu\dem_mosaic.tif) dem_clean Con(IsNull(dem_raw), dem_raw, SetNull(dem_raw -9999, dem_raw)) dem_clean.save(rD:\dianchi_fuxianhu\dem_mosaic_clean.tif)这套逻辑的关键是SetNull它把等于-9999的像元转为NoData这样后续所有水文分析都会自动跳过这些区域。shp数据方面建议在工程开始就把所有矢量统一到同一投影坐标系比如UTM 48N否则道路、水系和DEM叠加后明明“看得见”量算距离却是错的。3. 填洼、流向与流量把DEM变成可标记的地形要素3.1 填洼是水文分析的第一步但填洼后的DEM不能出图滇池和抚仙湖地处云贵高原DEM里的伪洼地数量不少。伪洼地主要来自采样噪点和插值算法在平坦区域产生的闭合低值。不填洼的话Flow Direction在洼地内部会生成多个方向值Flow Accumulation算出来的河网断断续续分水岭更是没法看。填洼工具的参数会直接影响分析结果。我常用z_limit来控制最大填充深度比如30米超过这个深度的洼地保留。高原地区存在喀斯特落水洞和真实洼地如果无限填充会把真实地形填平后续分水岭提取大概率出错。这里要特别提醒填洼生成的fill.tif只用于水文分析不要拿它做山体阴影或直接当制图底图视觉效果会非常平坦。3.2 水文分析工具链的最小代码与输出检查表ArcGIS Pro或ArcMap的Python窗口直接运行以下逻辑注意先打开Spatial Analyst扩展import arcpy from arcpy.sa import * arcpy.CheckOutExtension(Spatial) dem_clip rD:\dianchi_fuxianhu\dem_clip.tif fill_out rD:\dianchi_fuxianhu\fill.tif flow_dir rD:\dianchi_fuxianhu\flow_dir.tif flow_acc rD:\dianchi_fuxianhu\flow_acc.tif # 1. 填洼限制最大填充深度 out_fill arcpy.sa.Fill(dem_clip, z_limit30) out_fill.save(fill_out) # 2. 流向计算D8算法 out_dir arcpy.sa.FlowDirection(fill_out, force_flowNORMAL) out_dir.save(flow_dir) # 3. 流量累积 out_acc arcpy.sa.FlowAccumulation(flow_dir) out_acc.save(flow_acc)FlowDirection使用D8算法把每个像元的流向编码成1、2、4、8、16、32、64、128分别对应东、东南、南、西南、西、西北、北、东北这几个方向。这个编码不连续后期如果自己写脚本统计流向直接读数值是不行的。force_flow设为NORMAL表示尊重填洼后的地形FORCE模式会让边缘像元的出水方向强制指向外部只有当研究区小于真正流域范围时才需要。运行完先看输出别急着提河网对照这张检查表排查检查项正常表现异常表现Fill最小值等于或略大于原始DEM最低值出现大面积NoData空洞Flow Direction像元值只出现1、2、4、8、16、32、64、128出现0或负值Flow Accumulation最大值至少是图像列数的量级最大值很小流向断裂3.3 栅格计算器提取河网与矢量化的阈值逻辑流量累积栅格不是河网它只表示每个像元汇集了多少上游像元。提取河网是在栅格计算器里做条件判断把超过阈值的像元标记为1其余设为NoData。river_grid arcpy.sa.Con(flow_acc 2000, 1) river_grid.save(rD:\dianchi_fuxianhu\river.tif) stream_feature arcpy.sa.StreamToFeature( in_stream_rasterriver_grid, in_flow_direction_rasterflow_dir, out_polyline_featuresrD:\dianchi_fuxianhu\river_line.shp )Con的语法是第一个参数是条件满足取第二个参数的值不满足取NoData。2000这个阈值是经验起步值它和DEM分辨率强相关。12.5米DEM的像元面积只有30米DEM的约六分之一同等河道对应的流量累积值会大很多。我一般12.5米数据从2000到5000起步30米数据从500到1000起步。怎么判断阈值合不合适把导出的河网叠加到真实水系图上支流明显偏多就调大阈值主流接不上就调小。试个两三次就能定下来不用纠结一次到位。3.4 山体阴影和坡度底图的地貌“手感”从哪里来地形图不能直接拿DEM色带拉伸当底图缺少立体感。常规做法是生成Hillshade山体阴影叠加在高程染色图上层用透明度混合。hs arcpy.sa.Hillshade( dem_clip, azimuth315, altitude45, model_shadowsNO_SHADOWS ) hs.save(rD:\dianchi_fuxianhu\hillshade.tif)azimuth 315度、altitude 45度是制图常用组合模拟西北方向光照既能体现地形起伏又不会让陡坡变成一片死黑。这里有个容易踩的坑Hillshade输入一定要用原始DEM不能用填洼后的fill.tif。填洼会把真实洼地抹掉生成的阴影图会有平坦斑块出图后地形不真实。所以在数据预处理阶段就按dem_analysis和dem_visual两套保存分析用填洼后的可视化用原始DEM结构清晰交付时也方便别人接手。4. 地形图制图透明度、符号化与图层组织4.1 高程符号化的三个原则DEM染色不是随手拉一个拉伸就完事。出图质量高的地形图通常遵守三个原则。第一色带要有地理含义低海拔用绿色系中海拔用黄棕色系高海拔用褐色系。滇池湖面海拔约1887米抚仙湖略低周边山体在2000到2500米之间这个跨度适合用色带而不是灰度。第二拉伸方式选“百分比截断”不要用“全范围拉伸”。DEM里个别极高或极低像元会把整个颜色分布压扁中间地形的细节全丢。第三分级显示而不是连续渐变。在ArcGIS Pro里用“分级色彩”分6到8级图例读起来直观打印出来也清晰。以滇池流域为例我会按1900、2000、2100、2250、2500设置分界点把海拔分成低湖盆、湖岸台地、低山、中山几个区间每个区间配一个主色调中间用插值过渡。4.2 山体阴影叠加与透明度参数山体阴影和高程染色叠加时用透明度而不是混合模式。在ArcGIS Pro里选中Hillshade图层图层属性-外观-透明度设35%到45%。透明度太低地貌感出不来太高会把高程色带盖得发灰。40%是个不错的起步值根据屏幕效果微调。需要注意同参数下ArcMap和Pro渲染山体阴影的深浅有差别Pro渲染管线不同阴影会更重这不是数据问题。如果只是快速预览也可以把Hillshade的拉伸方式改成“无”直接用原始值显示。具体的图层参数可以这样组织图层参数设置作用DEM高程染色分级色彩6-8级百分比截断表达海拔与地形分区山体阴影透明度40%azimuth 315altitude 45表达地貌起伏与立体感河网蓝色实线线宽0.4pt表达水系格局公路双线或符号化按等级设色表达交通骨架行政边界紫红色虚线0.2pt表达县级及以上边界4.3 公里格网、渔网与图廓排版地形图通常要加公里格网。如果数据框用的是投影坐标系直接在地图属性里打开格网经纬度坐标系就设置经纬网。另一种做法是生成渔网图层适合需要把公里格作为独立要素标注的场合。arcpy.management.CreateFishnet( out_feature_classrD:\dianchi_fuxianhu\fishnet_1km.shp, origin_coord190000 2600000, y_axis_coord190000 2601000, cell_width1000, cell_height1000, labelsNO_LABELS, extentrD:\dianchi_fuxianhu\study_area.shp )origin_coord是渔网的起点坐标y_axis_coord决定网格的方向这里通过指定y轴上第二个点来保证网格正南正北而不是倾斜的。生成后只保留边线部分可在属性表里按字段筛选或手工删除内部线条再叠到地形图上作为公里格。渔网和地图格网不要同时加二选一否则整个图面会变成A4作文纸。滇池和抚仙湖两个流域如果放一张图建议用两个数据框比例尺统一图例分开否则两个流域的面积感会失真。5. 分水岭提取、拓扑检查与shp交付的那几个坑5.1 汇水区提取与栅格转面河网算出来之后流域分析的下一步是提取分水岭。Watershed工具输入两个栅格流向栅格和流出点栅格。流出点的位置是关键滇池的出水口和抚仙湖的出水口要找准确我一般在地形图上沿河网末端手动点出来再转成栅格参与计算。栅格计算结果转矢量时直接用Raster to Polygon会得到一堆锯齿边界的碎面稳妥做法是先做栅格概化再简化面边界最后把两个子流域的缝隙用拓扑规则清理干净。5.2 拓扑检查步骤与负面积处理交付shp前的拓扑检查顺序是新建拓扑、添加要素类、指定规则、验证拓扑。流域面常用两条规则Must Not Overlap不能重叠Must Not Have Gaps不能有缝隙。验证后如果有错误能自动修复的先修复剩余的放大到出错位置手工处理。热搜里常问“arcgis里面积是负的怎么处理”。面积出现负值大部分情况下不是数据坏了而是坐标系用错了。WGS84经纬度坐标直接计算面积单位是平方度数值很小且可能是负值。正确做法是先投影到对应投影坐标系新建字段后用Calculate Geometry计算面积。投影后仍为负再检查要素外环方向是否反了。dwg转过来的面常有坐标单位错乱把米当成了度这类情况先检查坐标系再谈修复。5.3 dem与dxf叠加、shp转kml的交付注意交付时常见两种需求把DXF地形图叠加到DEM上看对比或者把成果转KML放到移动端查看。DXF叠加的痛点在于CAD文件经常没有坐标系或自定义坐标系直接加载会跑到海里。常规做法是在AutoCAD里用ALIGN命令做控制点校正再在ArcGIS里明确指定投影。shp转kml则用Layer to KML工具但要素必须先符号化KML的线宽和点大小在ArcGIS里定义好转出来才会正常。这条经验是实打实踩过的坑现在每次转KML前我都会先检查一遍符号化参数避免交付后对方打开看到一条细得看不见的线。本文还有配套的精品资源点击获取
返回列表