目录

若觉得代码对您的研究 / 项目有帮助,欢迎点击打赏支持!需要完整代码的朋友,打赏后可在后台私信(复制文章标题发给我),我会尽快发您完整可运行代码,感谢支持!
海岸线是海岸带动态监测的核心地理要素,其精准提取对海岸侵蚀评估、湿地保护、海平面上升响应等研究具有重要意义。传统海岸线提取依赖人工矢量化或现场实测,效率低、成本高。本文基于Google Earth Engine(GEE)云平台,利用Sentinel-2多光谱影像,构建了一条从数据预处理→中值合成→NDWI水体指数计算→水体掩膜生成→Canny边缘检测的自动化海岸线提取流程。核心优势在于:(1)依托GEE的海量影像库与云端计算能力,无需下载数据;(2)通过QA60波段位掩膜实现精准去云;(3)中值合成有效压制云残留与噪声;(4)NDWI阈值与Canny算子结合,兼顾水体识别精度与边缘连续性。本文适合遥感领域学习者、GIS研发人员及海岸带科研工作者阅读参考。
一、研究区域与时间范围设定
javascript
var roi = geometry;
var startDate = '2023-10-01';
var endDate = '2024-03-31';
roi是用户在GEE地图上绘制的感兴趣区域(Region of Interest),可以是多边形或矩形。时间范围的选择需考虑研究区的气候特征------若研究区雨季较长,云覆盖率高,可适当放宽时间窗口以获取足够数量的有效影像。代码中选取了2023年10月至2024年3月共6个月的影像,覆盖秋冬季节,对于中低纬度地区而言云量相对较少。
注意事项:若研究区位于热带雨林气候区,6个月的时间窗口可能仍不足以获取无云影像,建议将时间范围扩展至1年,并配合后面的中值合成策略处理。
二、Sentinel-2影像集加载与云掩膜
javascript
var s2Collection = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED')
.filterBounds(roi)
.filterDate(startDate, endDate)
.filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20))
.map(maskS2clouds);
COPERNICUS/S2_SR_HARMONIZED是Sentinel-2 Level-2A地表反射率产品,已经过了Sen2Cor大气校正,将原始DN值转换为地表反射率。这里使用filterBounds按空间范围筛选,filterDate按时间筛选,filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20))则从元数据层面过滤掉云量大于20%的影像------这是第一道"粗筛",可显著减少后续计算量。
去云函数maskS2clouds的核心逻辑如下:
javascript
function maskS2clouds(image) {
var qa = image.select('QA60');
var cloudBitMask = 1 << 10;
var cirrusBitMask = 1 << 11;
var mask = qa.bitwiseAnd(cloudBitMask).eq(0)
.and(qa.bitwiseAnd(cirrusBitMask).eq(0));
return image.updateMask(mask).divide(10000);
}
Sentinel-2的QA60波段采用位掩码(bitmask)机制 存储质量信息。第10位(bit 10)标记普通云层,第11位(bit 11)标记卷云。1 << 10即二进制的10000000000,通过bitwiseAnd运算提取特定位的值------若该位为1,说明该像素被云覆盖,应予以掩蔽。divide(10000)将uint16整型反射率值转换为0-1范围的浮点数,与后续可视化参数(max:0.3)相匹配。
注意事项 :若print('有效影像数量', s2Collection.size())输出为0,说明时间范围内无符合条件的影像。可尝试:(a)降低CLOUDY_PIXEL_PERCENTAGE阈值至50;(b)扩大时间范围;(c)检查roi是否有效。
三、中值合成
javascript
var s2Image = s2Collection.median().clip(roi);
median()方法对影像集合逐像素取中值,生成一幅合成影像。中值合成相比均值合成对离群值(如云残留、传感器噪声)更具鲁棒性,能有效剔除极端值的影响。clip(roi)将结果裁剪至研究区域边界。
四、NDWI水体指数计算
NDWI(Normalized Difference Water Index,归一化差异水体指数)的计算公式为:
其中Green对应Sentinel-2的B3波段(约560 nm),NIR对应B8波段(约842 nm)。
normalizedDifference是GEE内置的归一化差值计算函数,公式为(B3 - B8) / (B3 + B8)。水体在绿光波段反射率较高、在近红外波段反射率极低,因此NDWI值偏高;植被则相反,NDWI值偏低;裸土和建筑用地介于两者之间。NDWI的取值范围为-1, 1。
五、水体掩膜生成
javascript
var waterMask = ndwi.gt(-0.05);
阈值分割是将连续指数值二值化为水体/非水体的关键步骤。代码采用gt(-0.05)(大于-0.05判定为水体),这是一个相对宽松的阈值------传统研究中NDWI阈值通常取0,此处下调至-0.05旨在减少对浑浊水体或薄云影响区域的漏判。
注意事项:阈值选取需根据研究区实际水体光谱特征调整。对于清澈深水区,NDWI可达0.3以上;对于泥沙含量高的浑浊水体,NDWI可能降至0附近甚至负值。建议先计算NDWI的直方图分布,选取水体与陆地的"谷值"作为最优阈值。
六、Canny边缘检测提取海岸线
javascript
var coastline = ee.Algorithms.CannyEdgeDetector({
image: waterMask,
threshold: 0.5,
sigma: 1
});
Canny边缘检测算法通过四个独立滤波器识别对角线、垂直和水平方向的边缘。在GEE中,ee.Algorithms.CannyEdgeDetector接受三个参数:
| 参数 | 类型 | 说明 |
|---|---|---|
image |
Image | 输入图像(此处为二值水体掩膜) |
threshold |
Float | 梯度阈值,仅梯度幅值高于此值的像素被判定为边缘 |
sigma |
Float | 高斯滤波器的Sigma值,用于边缘检测前的平滑处理 |
| [Canny边缘检测算法参数说明] |
此处threshold:0.5、sigma:1的组合适用于大多数场景。sigma值越大,平滑效果越强,对噪声的抑制越好,但可能损失细微边缘细节。
注意事项 :若提取的海岸线过于破碎,可尝试降低threshold值(如0.3)以捕获更多边缘;若噪声过多,可增大sigma值(如1.5)加强平滑。
七、地图可视化
javascript
Map.centerObject(roi, 7);
Map.addLayer(s2Image, {bands: ['B4', 'B3', 'B2'], min: 0, max: 0.3}, 'Sentinel-2 真彩色');
Map.addLayer(ndwi, {min: -1, max: 1, palette: ['brown', 'yellow', 'blue']}, 'NDWI');
Map.addLayer(waterMask.updateMask(waterMask), {palette: 'blue'}, '水体掩膜');
Map.addLayer(coastline.updateMask(coastline), {palette: 'red'}, '海岸线');
真彩色合成选用B4(红)、B3(绿)、B2(蓝)波段,max:0.3与前面divide(10000)的归一化处理相呼应。NDWI采用brown-yellow-blue渐变色盘,便于直观识别水体分布。updateMask(waterMask)确保仅显示水体区域,updateMask(coastline)则仅显示边缘像素。
八、总结
本文系统介绍了基于GEE的Sentinel-2海岸线自动提取全流程,核心技术与经验可归纳为以下几点:
核心价值:将原本需要多软件协作、大量人工干预的海岸线提取工作,浓缩为一套可在GEE云端一键运行的自动化流程,大幅降低了海岸带动态监测的技术门槛与时间成本。
关键技术要点:
-
QA60位掩膜去云 :理解
1 << 10与1 << 11的位运算原理是精准去云的前提; -
中值合成:相比均值合成,中值对云残留和椒盐噪声更具抗干扰能力;
-
NDWI阈值 :
-0.05为经验参考值,实际应用中应结合研究区水体光谱特征进行直方图分析后调整; -
Canny边缘检测 :
threshold与sigma的调参是平衡边缘完整性与噪声抑制的关键。
适用场景:海岸线变迁监测、滩涂湿地动态分析、湖泊岸线提取、洪水淹没范围评估等。
九、运行结果
研究区Sentinel-2真彩色遥感影像
研究区NDWI水体指数计算结果
研究区水体掩膜计算结果
研究区海岸线提取结果
若觉得代码对您的研究 / 项目有帮助,欢迎点击打赏支持!需要完整代码的朋友,打赏后可在后台私信(复制文章标题发给我),我会尽快发您完整可运行代码,感谢支持!