利用Google Earth Engine分析土壤pH值
这篇博客将介绍如何使用Google Earth Engine (GEE) 分析和可视化特定区域的土壤pH值。我们将使用OpenLandMap提供的土壤pH值数据集,探索不同深度的土壤pH值分布,并创建交互式地图和图表。
1. 研究区域与环境设置
与之前的博客类似,我们首先定义一个地理坐标点来确定研究区域。这里我们仍然使用相同的坐标(位于埃及尼罗河三角洲附近):
var geometry = /* color: #0b4a8b */ee.Geometry.Point([31.21614767609318, 30.03815159053311]); // 定义研究区域的中心点
你可以根据自己的兴趣修改此坐标,选择你关注的区域。或者,你也可以使用城市边界数据,仅针对你所在的城市运行此代码。
接下来,我们加载并筛选行政边界数据,以确定我们的研究范围:
// 加载二级行政区划数据,并根据定义的点进行过滤
var country = ee.FeatureCollection("WM/geoLab/geoBoundaries/600/ADM2").filterBounds(geometry);
Map.addLayer(country); // 将筛选出的行政区域添加到地图
Map.centerObject(geometry, 8); // 将地图中心定位到定义的点,并设置缩放级别为8
这段代码将选定的行政区域边界添加到地图,并将地图视图居中于我们定义的点。
2. 土壤pH值数据处理
我们将使用OpenLandMap的土壤pH值数据集(OpenLandMap/SOL/SOL_PH-H2O_USDA-4C1A2A_M/v02
)。该数据集提供了1950-2018年间,全球不同深度(0cm, 10cm, 30cm, 60cm, 100cm, 200cm)的土壤pH值估算,范围在4.2到11之间。原始数据的单位是pH值乘以10,所以我们需要进行除以10的处理。
为了简化数据处理流程,我们定义了一个名为 soil
的函数:
// PH 0-200 数据范围是 4.2-11
Map.centerObject(country) // 将地图中心定位到研究区域
// 定义一个函数来处理土壤pH值数据
function soil(id, band, name){
var image = ee.Image(id).select(band).divide(10); // 加载图像,选择波段,并将值除以10
Map.addLayer(image.clip(country),[],name,false); // 将裁剪后的图像添加到地图(默认不显示)
print(ui.Chart.image.histogram(image, country, 250)); // 打印图像的直方图
// 计算区域内的统计信息(中位数、最小值、最大值)
var stat = image.reduceRegion({
reducer: ee.Reducer.median().combine({reducer2: ee.Reducer.minMax(), sharedInputs: true}),
geometry: country,
scale: 250
});
print('statistical information for '+name,stat); // 打印统计信息
// 将图像导出到Google Drive
Export.image.toDrive({
image: image.clip(country),
description: name,
scale: 250,
region: country,
crs: image.getInfo().crs,
folder: 'test' // 导出到名为 'test' 的文件夹
});
return image;
}
这个函数的主要功能包括:
- 加载和预处理: 从指定的数据集ID (
id
) 和波段 (band
) 加载图像,并使用.divide(10)
将原始数据值转换为实际的pH值。 - 裁剪: 使用
clip(country)
将图像裁剪到我们选择的行政区域。 - 可视化: 使用
Map.addLayer()
将裁剪后的图像添加到地图。 - 直方图: 使用
ui.Chart.image.histogram()
生成并打印图像的直方图,以查看pH值的分布情况。 - 统计: 使用
reduceRegion()
计算区域内的中位数、最小值和最大值。 - 导出: 使用
Export.image.toDrive()
将裁剪后的图像导出到你的Google Drive。
现在,我们可以调用这个函数来处理不同深度的土壤pH值数据:
// 分别处理不同深度的土壤pH值数据
var ph = soil("OpenLandMap/SOL/SOL_PH-H2O_USDA-4C1A2A_M/v02", 'b0', 'ph0'); // 0cm深度
var ph = soil("OpenLandMap/SOL/SOL_PH-H2O_USDA-4C1A2A_M/v02", 'b10', 'ph10'); // 10cm深度
var ph = soil("OpenLandMap/SOL/SOL_PH-H2O_USDA-4C1A2A_M/v02", 'b30', 'ph30'); // 30cm深度
var ph = soil("OpenLandMap/SOL/SOL_PH-H2O_USDA-4C1A2A_M/v02", 'b60', 'ph60'); // 60cm深度
var ph = soil("OpenLandMap/SOL/SOL_PH-H2O_USDA-4C1A2A_M/v02", 'b100', 'ph100'); // 100cm深度
var ph = soil("OpenLandMap/SOL/SOL_PH-H2O_USDA-4C1A2A_M/v02", 'b200', 'ph200'); // 200cm深度
//绘制时间序列图
var dataset = ee.Image('OpenLandMap/SOL/SOL_PH-H2O_USDA-4C1A2A_M/v02').clip(country).divide(10)
print((ui.Chart.image.series(dataset,country,ee.Reducer.mean(),250,'system:time_start')).setOptions({title:'pH soil 0-200 depths 1950',interpolateNulls:true,lineWidth:1,pointSize:2,curveType:'function',vAxis:{title: ('42-110')}}))
这段代码将分别处理0cm, 10cm, 30cm, 60cm, 100cm, 和 200cm 深度的土壤pH值数据,并将结果添加到地图、打印统计信息和直方图,以及导出裁剪后的图像。
绘制1950年间土壤PH含量均值的时间序列图。
3. 可视化与图例
为了更直观地展示土壤pH值的空间分布,我们为每个深度的图像设置了可视化参数:
// 为不同深度的图像设置可视化参数
vis = {bands: ['b0'],min:5.2,max: 6.8,palette: ['ff0000', 'ff1c00', 'ff3900', 'ff5500', 'ff7100', 'ff8e00','ffaa00', 'ffc600', 'ffe200', 'ffff00', 'e3ff00', 'c7ff00','aaff00', '8eff00', '72ff00', '55ff00', '39ff00', '1dff00','01ff00', '00ff1c', '00ff38', '00ff54', '00ff71', '00ff8d','00ffa9', '00ffc6', '00ffe2', '00fffe', '00e3ff', '00c7ff','00abff', '008fff', '0072ff', '0056ff', '003aff', '001dff','0001ff', '1b00ff', '3800ff', '5400ff',]};
Map.addLayer(dataset,vis,'Soil pH 0 cm depth');
var vis = {bands: ['b10'],min:5.542,max: 6.8,palette: ['ff0000', 'ff1c00', 'ff3900', 'ff5500', 'ff7100', 'ff8e00','ffaa00', 'ffc600', 'ffe200', 'ffff00