var VT_boundary = ee.FeatureCollection("projects/ee-yelu/assets/VT_boundary"),
VT_pedons = ee.FeatureCollection("projects/ee-yelu/assets/essex_pedons_all");
在步入高速数字化进程中,我们开辟了观览大地的全新视角——通过使用Sentinel空间卫星系统。该卫星阵列提供世界各地实时观测服务,揭示自然界各类奥秘。今日,让我们探讨如何对通过卫星获得的数据进行预处理和综合分析,直至呈现为用户手中感性的绿色画面。
Sentinel-1与Sentinel-2:地球的守护者
// 研究区
var roi = VT_boundary.union();
Map.addLayer(roi, {}, 'shp', false);
var crs = 'EPSG:4326'; // EPSG number for output projection. 32618 = WGS84/UTM Zone 18N. For more info- http://spatialreference.org/ref/epsg/
function maskS2clouds(image) {
var qa = image.select('QA60');
// Bits 10 and 11 are clouds and cirrus, respectively.
var cloudBitMask = 1 << 10;
var cirrusBitMask = 1 << 11;
// Both flags should be set to zero, indicating clear conditions.
var mask = qa.bitwiseAnd(cloudBitMask)
.eq(0)
.and(qa.bitwiseAnd(cirrusBitMask)
.eq(0));
return image.updateMask(mask)
.divide(10000);
}
Sentinel系列卫星犹如宇宙守卫者,在广袤无垠的星空中洞察地球。Sentinel-1与Sentinel-2,仿佛承载特殊力量的超级英雄,前者不受气候干扰高效拍摄,后者专精捕捉地球多彩面貌。两颗卫星的独特能力相辅相成,为我们带来珍贵无比的地球图像,如同时光瓶罐,详实记录地球每时每刻。
// NDVI
function NDVI(img) {
var ndvi = img.expression(
"(NIR-R)/(NIR+R)", {
"R": img.select("B4"),
"NIR": img.select("B8"),
});
return img.addBands(ndvi.rename("NDVI"));
}
// NDWI
function NDWI(img) {
var ndwi = img.expression(
"(G-MIR)/(G+MIR)", {
"G": img.select("B3"),
"MIR": img.select("B8"),
});
return img.addBands(ndwi.rename("NDWI"));
}
// NDBI
function NDBI(img) {
var ndbi = img.expression(
"(SWIR-NIR)/(SWIR-NIR)", {
"NIR": img.select("B8"),
"SWIR": img.select("B12"),
});
return img.addBands(ndbi.rename("NDBI"));
}
//SAVI
function SAVI(image) {
var savi = image.expression('(NIR - RED) * (1 + 0.5)/(NIR + RED + 0.5)', {
'NIR': image.select('B8'),
'RED': image.select('B4')
})
.float();
return image.addBands(savi.rename('SAVI'));
}
//IBI
function IBI(image) {
// Add Index-Based Built-Up Index (IBI)
var ibiA = image.expression('2 * SWIR1 / (SWIR1 + NIR)', {
'SWIR1': image.select('B6'),
'NIR': image.select('B5')
})
.rename(['IBI_A']);
var ibiB = image.expression('(NIR / (NIR + RED)) + (GREEN / (GREEN + SWIR1))', {
'NIR': image.select('B8'),
'RED': image.select('B4'),
'GREEN': image.select('B3'),
'SWIR1': image.select('B11')
})
.rename(['IBI_B']);
var ibiAB = ibiA.addBands(ibiB);
var ibi = ibiAB.normalizedDifference(['IBI_A', 'IBI_B']);
return image.addBands(ibi.rename(['IBI']));
}
//RVI
function RVI(image) {
var rvi = image.expression('NIR/Red', {
'NIR': image.select('B8'),
'Red': image.select('B4')
});
return image.addBands(rvi.rename('RVI'));
}
//DVI
function DVI(image) {
var dvi = image.expression('NIR - Red', {
'NIR': image.select('B8'),
'Red': image.select('B4')
})
.float();
return image.addBands(dvi.rename('DVI'));
}
影像预处理:给地球拍照前的准备
// 创建
var inStack = ee.Image()
for (var i = 0; i < 3; i += 1) {
var start = ee.Date('2019-03-01')
.advance(30 * i, 'day');
print(start)
var end = start.advance(30, 'day');
var dataset = ee.ImageCollection('COPERNICUS/S2_SR')
.filterDate(start, end)
.filterBounds(roi)
.filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE',75))
.map(maskS2clouds)
.map(NDVI)
.map(NDWI)
.map(NDBI)
.map(SAVI)
.map(IBI)
.map(RVI)
.map(DVI);
var inStack_monthly = dataset.median()
.clip(roi);
// 可视化
var visualization = {
min: 0.0,
max: 0.3,
bands: ['B4', 'B3', 'B2'],
};
Map.addLayer(inStack_monthly, visualization, 'S2_' + i, false);
// // 纹理特征
var B8 = inStack_monthly.select('B8')
.multiply(100)
.toInt16();
var glcm = B8.glcmTexture({
size: 3
});
var contrast = glcm.select('B8_contrast');
var var_ = glcm.select('B8_var');
var savg = glcm.select('B8_savg');
var dvar = glcm.select('B8_dvar');
inStack_monthly = inStack_monthly.addBands([contrast, var_, savg, dvar])
// Sentinel-1
var imgVV = ee.ImageCollection('COPERNICUS/S1_GRD')
.filter(ee.Filter.listContains('transmitterReceiverPolarisation', 'VV'))
.filter(ee.Filter.listContains('transmitterReceiverPolarisation', 'VH'))
.filter(ee.Filter.eq('instrumentMode', 'IW'))
.filterBounds(roi)
.map(function(image) {
var edge = image.lt(-30.0);
var maskedImage = image.mask()
.and(edge.not());
return image.updateMask(maskedImage);
});
var img_S1_asc = imgVV.filter(ee.Filter.eq('orbitProperties_pass', 'ASCENDING'));
var VV_img = img_S1_asc.filterDate(start, end)
.select("VV")
.median()
.clip(roi);
var VH_img = img_S1_asc.filterDate(start, end)
.select("VH")
.median()
.clip(roi);
inStack_monthly = inStack_monthly.addBands([VV_img, VH_img])
print("img_S2_monthly", inStack_monthly)
inStack = inStack.addBands(inStack_monthly.select(inStack_monthly.bandNames()))
}
inStack = inStack.select(inStack.bandNames().remove("constant"))
print(inStack)
拍摄地球美景需经历一系列繁琐准备,即影像预处理环节,也被喻为是向公众展示地球唯美一面的“化妆”环节。此阶段涵盖多项复杂操作,如画面修正、噪音去除及对比度增强等流程,犹如细心雕琢艺术珍品,直至影像清晰且色彩浓郁,呈现完美效果。
print("Predictor Layers:", inStack);
inStack.reproject(crs, null, 30);
Map.centerObject(inStack)
上传矢量数据:数字化地球的纹理
接续投入任务如下,我们需把各类图像资料上传至地球工程(EarthEngine)——这一庞大的数字化地球引擎,能高效处理与解析海量地球观测数据。同时,此项操作亦须添加矢量数据,以作为地球纹理,详细描述诸如河流、森林及城市等地表特性。通过这些数据的复合与运用,使我们得以更加全面地洞察地球的每个细微之处。
逐月合成影像:时间的画卷
var trainingFeatureCollection = ee.FeatureCollection(VT_pedons, 'geometry');
关于逐日合成图像的神奇之处在于,犹如让时间凝固为摄影艺术的画卷,每月元素精妙组合成一个连贯的时间序列。该过程运用for循环技术完成,根据需求自动生成特定时段的图像。这些图像不仅美丽动人,更具有极高科研价值,有助于研究地球气候变迁、植被生长情况等自然现象。
ee.Image().select("波段名称")
计算植被指数:绿色的密码
var bands = inStack.bandNames(); //All bands on included here
在诸如此类的模拟图像中,最为引人深思的即是植被指数的精确计算。如绿色密码般的植被指数,能揭示出植被的健康程度及发展节奏等隐秘信息。借助此等指数,我们得以深度认识地球的生态体系,乃至预测未来环境变迁的走向。整个过程复杂缤纷,然而每一个计算都代表着对于地球绿色生命的一次震撼视界。
样本数据的加载与转换:回归的基础
var training = inStack.reduceRegions({
collection:trainingFeatureCollection,
reducer :ee.Reducer.mean(),
scale:100,
tileScale :5,
crs: crs
});
print(training)
var trainging2 = training.filter(ee.Filter.notNull(bands));
在开展回归研究前的第一步是收集样本数据,这是回归分析的基石。首先,我们将具有资产价值的样本数据VT_pedons.shp从GEE上传至云端,并将其转化为可在GEE环境下调用的ee.FeatureCollection()格式。这样不仅能保证回归模型具有稳固的基础,也使得我们在后续的分析操作中能够更加精准和有效率。
// 在training要素集中增加一个random属性,值为0到1的随机数
var withRandom = trainging2.randomColumn({
columnName:'random',
seed:2,
distribution: 'uniform',
});
var split = 0.8;
var trainingData = withRandom.filter(ee.Filter.lt('random', split));
var validationData = withRandom.filter(ee.Filter.gte('random', split));
提取影像数据:寻找地球的脉络
// train the RF classification model
var classifier = ee.Classifier.smileRandomForest(100, null, 1, 0.5, null, 0).setOutputMode('REGRESSION')
.train({
features: trainingData,
classProperty: 'REDOX_CM',
inputProperties: bands
});
print(classifier);
接下来,需根据样本点坐标,从影像中抽取各层波段数据。此步骤如同探索地球奥秘,每个波段均揭示了地球独特面貌。透过数据提取,我们能更深入洞察地球动态,为后续回归预测提供丰富依据。
设置空间分辨率:精细化的视角
在进行回归分析前,正确地设定空间分辨率至关重要,此次设定的分辨率为30米,目的在于以精密化角度深入洞察地球。此分辨率的选取是出于与前期运用过的预测层重投影的一致性考虑,从而保障我们得到的分析结果具备极高精确度。
分类器的创建与应用:绿色的预测
// Classify the input imagery.
var regression = inStack.classify(classifier, 'predicted');
print(regression);
此刻,我们已做好创建分类器的准备,以先前准备的数据为依据,针对图像进行分类。此过程如同进行绿色前景预测,有助于我们深入了解地球未来状况,并借助分类器探知其各个角落及其变化情况。
回归模型的应用:绿色的魔法
接下来,我们将运用新构建的回归模型对影像进行划分。此过程宛如神奇的绿色魔法,将精准的预测数据转为生动的图像显示。这些画面精美且蕴含丰富科学信息,助我们深化理解地球生态系统。
var palettes = require('users/gena/packages:palettes');
调色板的定义:绿色的艺术
为了实现可视化功能,我们必须创建色调调节板。犹如绿色艺术的色调调节工具,可以运用预测数据生成美观的图片,让大地所有的变动和细微之处尽在眼底。
var palette = palettes.crameri.nuuk[25];
结果的添加与展示:绿色的画卷
终章,将所得成果融入至地图之中加以公示。此举犹如挥动画笔展现翠绿山水图景,切实将预测数据以最为直观精确之形式呈现。透过各式图像,使得全球各地之微妙变迁与详细信息皆一览无遗,尽收眼底。
Display the input imagery and the regression classification.
get dictionaries of min & max predicted value
var regressionMin = (regression.reduceRegion({
reducer: ee.Reducer.min(),
scale: 100,
crs: crs,
bestEffort: true,
tileScale: 5,
geometry: roi
}));
var regressionMax = (regression.reduceRegion({
reducer: ee.Reducer.max(),
scale: 100,
crs: crs,
bestEffort: true,
tileScale: 5,
geometry: roi
}));
Add to map
var viz = {
palette: palette,
min: regressionMin.getNumber('predicted')
.getInfo(),
max: regressionMax.getNumber('predicted')
.getInfo()
};
Map.addLayer(regression, viz, 'Regression');
直方图的制作:绿色的统计
除图像展示外,我们亦可利用直方图深入剖析模型拟合度。通过编制的绿色彩色图表,我们能精确洞察地球各项变更及其详细信息。
任务的导出:绿色的分享
最终,我们将任务成果导出,便于与公众共享我们的绿色魔法。此操作犹如一次绿色理念的传承,能以通俗易懂且易于理解的形式展现预测结果。借助这一共享平台,我们有望更为全面地洞悉地球生态体系,更加精准地捕捉地球上的微妙变化以及每一处细微之处。