GEE洪水风险映射代码报错:dem is not a function,求技术支持
问题分析与修复方案
核心错误原因
- 数据源错误:你使用的
COPERNICUS/S2_SR是哨兵2号光学卫星影像,根本没有elevation(高程)波段,导致elevation变量是空影像对象,后续操作全部失效。 - 概念混淆:
ee.Terrain.hillshade()是生成山体阴影的工具,不是创建DEM(数字高程模型)的方法——DEM本身就是高程数据,无需通过山体阴影生成。 - 无效对象触发报错:前面的
elevation为空,生成的dem是无效影像,调用dem.expression()时就会出现“dem is not a function”这类异常。
修复后的完整代码
// 确保roi已在GEE中定义,示例为Houston区域 var roi = ee.Geometry.Rectangle([-95.6, 29.4, -95.2, 29.8]); // 导入标准DEM数据源(SRTM 30米全球高程数据) var dem = ee.Image('USGS/SRTMGL1_003').clip(roi); // 可选:生成山体阴影用于可视化辅助 var hillshade = ee.Terrain.hillshade(dem); // 计算洪水风险(基于高程正态分布,可按需调整逻辑) var floodRisk = dem.expression( 'exp(-((x - mean)^2) / (2 * sigma^2))', { 'x': dem, 'mean': dem.reduceRegion({ reducer: ee.Reducer.mean(), geometry: roi, scale: 30, maxPixels: 1e9 }).get('elevation'), 'sigma': dem.reduceRegion({ reducer: ee.Reducer.stdDev(), geometry: roi, scale: 30, maxPixels: 1e9 }).get('elevation') } ); // 可视化结果 Map.centerObject(roi, 12); Map.addLayer(dem, {min: 0, max: 100}, 'DEM'); Map.addLayer(floodRisk, {min: 0, max: 1, palette: ['blue', 'yellow', 'red']}, 'Flood Risk');
关键修正说明
- 替换DEM数据源:用
USGS/SRTMGL1_003替代哨兵2影像,这是GEE中获取高程数据的标准方式。 - 修正统计值计算:原代码中
dem.mean()、dem.stdDev()是异步对象,需用reduceRegion()在研究区内计算实际统计值,确保表达式能读取有效数值。 - 优化风险逻辑:示例用高程正态分布计算风险(低洼区域风险值更高),你可根据需求调整,比如直接设定高程阈值(如低于5米标记为高风险)。
内容的提问来源于stack exchange,提问作者Nidhi Verma
相关产品推荐
相关产品推荐

