好久没更新了,一方面是事真的多,另一方面是自己有多松懈了,今天研究的是填好造陆的变化。本人地理较差,专业问题请大佬多指正!本文主要是记录栅格缓冲区,重分类,消除孤岛等等一些GEE函数操作 。现在开始~
1.数据的选取
选取数据考虑的是水和陆地的年际变化,于是选取以下数据作为本次的实验数据: 【google earth engine随缘学习(四)研究海岸线变化】
文章图片
下面是数据波段的介绍:
文章图片
这里我把季节性水体和永久性水体都归为海洋(即会把部分滩涂归为海洋,或是把坑塘水田误归为海洋)
2.代码部分
function erode(img, distance) {
var d = (img.not().unmask(1)
.fastDistanceTransform(256).sqrt()
.multiply(ee.Image.pixelArea().sqrt()))
return img.updateMask(d.gt(distance))
}function dilate(img, distance) {
var d = (img.fastDistanceTransform(256).sqrt()
.multiply(ee.Image.pixelArea().sqrt()))
return d.lt(distance)
}var land = ee.Image("USGS/SRTMGL1_003").unmask(0).gt(0)
var landMask = erode(dilate(land, 3000), 10000).mask().eq(1)//这两个函数是用来做栅格的缓冲区
var oceanMask = erode(land.not(), 10000).mask().eq(1)var imageCollection=lt.map(function(img){//这里lt为引用的water classification数据集
img=img.remap([0,1,2,3],[0,0,3,3]).unmask(0).not();
//重分类函数
var waterMask=img;
var minwaterSize = 1024;
var minlandSize = 60;
waterMask =waterMask.where(landMask,1);
waterMask =waterMask.where(oceanMask,0);
var segmentSize = waterMask.connectedPixelCount(Math.max(minwaterSize,minlandSize),false);
//清除孤岛
var minSize = ee.Image(minwaterSize).where(waterMask,minlandSize);
waterMask = waterMask.where(segmentSize.lt(minSize),waterMask.not());
return waterMask ;
});
var coastline = imageCollection.first().reduceToVectors({
reducer: ee.Reducer.countEvery(),
geometry: roi,
scale: 200,
maxPixels: 1e10
});
var simpleBound = coastline.geometry().simplify(50);
var feature = ee.Feature(simpleBound );
var featureCollection = ee.FeatureCollection([feature]);
Export.table.toDrive({collection: featureCollection, fileFormat: 'KML'});
上述代码的大致流程就是,先通过DEM数据做反向缓冲区分析,分别计算沿海地区之外的海洋与陆地面积,用来作为以后的掩模数据,消除内陆水系的影响。对影像集的处理上,是先通过重分类大致区分海洋和陆地,再通过掩模消除内陆水系。然后规定海洋和陆地的最大孤岛面积(单位是像元),然后用connectedPixelCount函数计算每个像元连接周围的数量,最后通过where等一系列函数清除孤岛。
最后是矢量化并简化边界,导出矢量文件,在此不表。
原始图像(经过重分类,并对缺失的陆地数据通过ummask()函数补充之后的数据)
处理后的图像:
文章图片
矢量化的海岸线边界(随便截取的一块区域):
这里将季节性的水体直接划分为海洋还是会带来一些误差的~