Claude Managed Agents与Bedrock AgentCore深度对比:企业智能体服务选型指南
2026/5/27 3:52:43
目录
一、研究区设置与地图初始化
二、Landsat 8 影像加载与筛选
三、归一化建筑指数(NDBI)计算
四、建设用地提取(核心阈值法)
五、面积计算函数定义
六、总面积与密度分级面积计算
(一)建设用地总面积计算
(二)密度分级计算(核心逻辑:按 NDBI 值细分)
七、数据导出(本地存储)
八、地图图例添加(可视化优化)
九、代码核心特点与注意事项
十、运行结果
若觉得代码对您的研究 / 项目有帮助,欢迎点击打赏支持!需要完整代码的朋友,打赏后可在后台私信(复制文章标题发给我),我会尽快发您完整可运行代码,感谢支持!
本代码基于 Google Earth Engine(GEE)平台,以 2023 年 Landsat 8 卫星影像为数据源,通过计算归一化建筑指数(NDBI)实现研究区建设用地的提取,并按照 NDBI 数值范围划分低密度、中密度、高密度三个等级,最终完成面积统计、可视化展示与数据导出。核心流程可概括为:设置研究区→加载影像→计算 NDBI→建设用地提取→面积计算→密度分级→数据导出→图例添加,全程围绕 “从影像到专题信息” 的提取逻辑展开。
本代码可用于城市扩张监测、建设用地时空变化分析、城市规划评估等场景,例如:
var roi = table; Map.addLayer(roi, {}, '研究区'); Map.centerObject(roi, 9);roi = table:table是 GEE 中已导入的矢量数据集(如行政区划边界),此处直接作为研究区(Region of Interest),后续所有操作均限定在该范围内。Map.addLayer():将研究区矢量边界添加到地图画布,第三个参数为图层名称,便于在地图界面区分。Map.centerObject(roi, 9):将地图中心定位到研究区,第二个参数 “9” 为缩放级别(范围 1-20,数值越大视角越近、细节越清晰)。var collection = ee.ImageCollection('LANDSAT/LC08/C02/T1_L2') .filterDate('2023-01-01', '2023-12-31') .filterBounds(roi) .sort('CLOUD_COVER') .first(); print('影像元数据:', collection);LANDSAT/LC08/C02/T1_L2是 Landsat 8 的 Level 2 级产品(经过大气校正、辐射定标等预处理),数据质量更高,可直接用于指数计算。filterDate():限定影像时间范围为 2023 全年,确保数据的时间一致性。filterBounds(roi):仅保留覆盖研究区的影像,剔除无关区域数据,提高计算效率。sort('CLOUD_COVER').first():按 “云量(CLOUD_COVER)” 升序排序后取第一幅,即云量最少的影像,避免云层对后续指数计算的干扰。print():在 GEE 控制台输出影像元数据(如拍摄时间、云量、分辨率等),用于数据质量校验。var ndbi = collection.normalizedDifference(['SR_B6', 'SR_B5']); var ndbiClipped = ndbi.clip(roi); Map.addLayer(ndbiClipped, {min: -1, max: 1, palette: ['blue', 'white', 'green']}, 'NDBI');SR_B6为短波红外波段(SWIR),SR_B5为近红外波段(NIR),符合 NDBI 计算公式:NDBI = (SWIR - NIR) / (SWIR + NIR)。normalizedDifference():GEE 内置函数,直接计算两波段的归一化差值,结果范围为 [-1,1]。clip(roi):将 NDBI 影像按研究区裁剪,剔除研究区外的无效数据。min: -1, max: 1限定显示范围,palette设置颜色映射(蓝色→负值区,白色→接近 0,绿色→正值区),直观区分不同地类的 NDBI 特征。var ndbiThreshold = 0; var builtUpArea = ndbiClipped.gt(ndbiThreshold) .selfMask() .rename('BuiltUpArea'); Map.addLayer(builtUpArea, {palette: 'FFF000'}, '建设用地');gt(ndbiThreshold):gt是 “大于(greater than)” 的缩写,返回布尔影像(NDBI>0 的像素为 1,否则为 0)。selfMask():掩膜操作,仅保留值为 1 的像素(建设用地),值为 0 的区域透明显示,避免干扰可视化。rename():为结果影像命名,便于后续面积计算和导出。var calculateArea = function(image) { var pixelArea = ee.Image.pixelArea().divide(1e4); // 转为公顷 return image.multiply(pixelArea); };ee.Image.pixelArea():GEE 内置函数,返回每个像素的面积(单位:平方米),Landsat 8 影像分辨率为 30 米,单个像素面积为 30×30=900 平方米。divide(1e4):1 公顷 = 10000 平方米,将面积单位从平方米转为公顷,便于实际应用。image.multiply(pixelArea):将布尔影像(1 表示建设用地,0 表示非建设用地)与像素面积相乘,得到每个建设用地像素的实际面积,非建设用地像素面积为 0。var builtUpAreaWithArea = calculateArea(builtUpArea); var totalArea = builtUpAreaWithArea.reduceRegion({ reducer: ee.Reducer.sum(), geometry: roi, scale: 30, maxPixels: 1e9 }); print('建设用地总面积(公顷):', totalArea.get('BuiltUpArea'));calculateArea(builtUpArea):调用面积计算函数,得到每个建设用地像素的面积影像。reduceRegion():对影像进行区域统计,核心参数:reducer: ee.Reducer.sum():统计方式为 “求和”,即所有建设用地像素的面积总和。geometry: roi:统计范围为研究区。scale: 30:统计分辨率,与 Landsat 8 影像原始分辨率一致,确保面积精度。maxPixels: 1e9:设置最大处理像素数,避免因研究区过大导致计算报错。print():在控制台输出总面积结果,get('BuiltUpArea')提取统计结果中的面积值。// 低密度:0 ~ 0.05 var lowDensityBuiltUpArea = ndbiClipped.gt(0).and(ndbiClipped.lt(0.05)) .selfMask().rename('LowDensityBuiltUpArea'); var lowDensityArea = calculateArea(lowDensityBuiltUpArea).reduceRegion({...}); print('低密度建设区面积(公顷):', lowDensityArea.get('LowDensityBuiltUpArea')); // 中密度:0.05 ~ 0.10 var mediumDensityBuiltUpArea = ndbiClipped.gt(0.05).and(ndbiClipped.lt(0.10)) .selfMask().rename('MediumDensityBuiltUpArea'); // 高密度:> 0.10 var highDensityBuiltUpArea = ndbiClipped.gt(0.10) .selfMask().rename('HighDensityBuiltUpArea');and()是逻辑 “与” 操作,用于限定 NDBI 的区间范围;中密度、高密度的面积计算逻辑与低密度一致,均调用calculateArea()函数和reduceRegion()统计,最终在控制台输出各等级面积。// 导出建设用地影像 Export.image.toDrive({ image: builtUpArea.uint8(), description: 'BuiltUp_Area_Image', folder: 'GEE_Export', scale: 30, region: roi }); // 导出NDBI影像(GeoTIFF) Export.image.toDrive({ image: ndbiClipped, description: 'NDBI_Full', folder: 'GEE_Export', scale: 30, region: roi.geometry().bounds(), fileFormat: 'GeoTIFF' });image: builtUpArea.uint8():将布尔影像转换为 8 位无符号整数类型(uint8),减少文件体积,便于存储。description:导出文件名称,需唯一且明确。folder:Google Drive 中存储文件的文件夹名称(需提前创建)。scale: 30:导出分辨率,与原始影像一致,保证数据精度。region:导出范围,建设用地影像按研究区矢量范围导出,NDBI 影像按研究区边界的外接矩形导出,避免漏边。fileFormat: 'GeoTIFF':导出格式为 GeoTIFF(地理空间数据标准格式),支持坐标系统,可直接用于 GIS 软件。var legend = ui.Panel({style: {position: 'bottom-left', padding: '8px 15px'}}); var legendTitle = ui.Label({value: '研究区基于NDBI的建设用地分级', style: {fontWeight: 'bold', fontSize: '18px'}}); legend.add(legendTitle); var makeRow = function(color, name, value) { var colorBox = ui.Label({style: {backgroundColor: '#' + color, padding: '8px'}}); var description = ui.Label({value: name, style: {margin: '0 0 4px 6px'}}); var valueLabel = ui.Label({value: value ? value + ' 公顷' : '', style: {margin: '0 0 4px 6px', fontWeight: 'bold'}}); return ui.Panel({widgets: [colorBox, description, valueLabel], layout: ui.Panel.Layout.Flow('horizontal')}); }; lowvalue.evaluate(function(val) { mediumvalue.evaluate(function(val2) { highvalue.evaluate(function(val3) { legend.add(makeRow('FFA500', '低密度', val)); legend.add(makeRow('FF0000', '中密度', val2)); legend.add(makeRow('8B0000', '高密度', val3)); }); }); }); Map.add(legend);ui.Panel():创建图例面板,设置位置(左下角)和内边距,避免遮挡地图主体。makeRow()函数:定义图例的每一行结构,包含 “颜色块 + 等级名称 + 面积值” 三个组件,采用水平布局(Flow ('horizontal'))。evaluate():由于 GEE 中的数据为服务器端对象(ee.Number),需通过evaluate()将其转换为客户端 JavaScript 数值,才能在图例中显示具体面积。核心特点:
table矢量数据)。注意事项:
sort('CLOUD_COVER')为filter(ee.Filter.lt('CLOUD_COVER', 10))(筛选云量 < 10% 的影像)。table需提前导入 GEE(支持 Shapefile、KML 等格式),且需与影像坐标系统一致(默认 WGS84)。若觉得代码对您的研究 / 项目有帮助,欢迎点击打赏支持!需要完整代码的朋友,打赏后可在后台私信(复制文章标题发给我),我会尽快发您完整可运行代码,感谢支持!