本文主要是通过对比GEE、PIE和AI Earth平台,主要是计算不同平台,同一个NDVI的均值计算,我们已测试结果如何。
1. PIE-engine
PIE获取北京市获取某一个区域的区域的NDVI平均值,但是结果却显示没有,只能通过加载图层点击图层上的点获取某一个点的NDVI值,而且这里用到区域统计使用的函数仅有min,max,sum计算,而使用mean计算,就没有结果。当我尝试使用以上三个可以计算的reducer的时候结果会呈现下面的结果:
遥感计算云服务
函数:
reduceRegion(reducer,geometry,scale)
对特定区域的所有像素进行统计,返回结果为一个JSON对象;目前可完成最大、最小和求和统计计算。
方法参数:
- image(Image)
Image实例。
- reducer(Reducer)
统计类型,包括最大值、最小值和求和。
- geometry(Geometry)
统计区域范围。默认是影像第一个波段的范围。
- scale(Number)
统计采样比例。
返回值:Dictionary
PIE代码:
//加载北京市边界
var roi = pie.FeatureCollection("NGCC/CHINA_PROVINCE_BOUNDARY")
.filter(pie.Filter.eq("name", "北京市"))
.first()
.geometry();
Map.centerObject(roi, 6);
Map.addLayer(roi, { color: "ff0000", fillColor: "00000000", width: 3 }, "北京市");
//按区域、时间筛选影像
var imgCol = pie.ImageCollection("LC08/01/T1")
.filterBounds(roi)
.filterDate("2019-8-01", "2019-8-30");
print("imgCol", imgCol);
Map.addLayer(imgCol.select(["B2", "B3", "B4"]).mosaic().clip(roi), { min: 0, max: 2500, bands: ["B4", "B3", "B2"] }, "imgCol", false);
//获取影像数量
var count = imgCol.size();
print(count);
function imgCalculate (image1) {
var ndvi1=image1.normalizedDifference(["B5","B4"]);
return image1.addBands(ndvi1).rename("NDVI")
}
var redc = imgCol.map(imgCalculate).mosaic().clip(roi)
print("redc",redc)
var jisuan = redc.select("NDVI").reduceRegion(pie.Reducer.mean(),geometry0,300)
print("jisuan",jisuan)
2.GEE
代码:
//这里ROI是我自己的矢量,这里就不共享了,大家可以换其它地方测试
/*color:#5f9ea0*/
var geometry0 = ee.Geometry.Polygon([
[
[
117.1224239290218,
40.20026024458343
],
[
117.2502681492852,
40.20026024458343
],
[
117.2502681492852,
40.13354201708273
],
[
117.1224239290218,
40.13354201708273
],
[
117.1224239290218,
40.20026024458343
]
]
], null);
function imgCalculate (image1) {
var ndvi1=image1.normalizedDifference(["B5","B4"]);
return image1.addBands(ndvi1).rename("NDVI");
}
function ndv_LANDSAT_8(image) {
var ndvi = image.normalizedDifference(['B5', 'B4']);
return image.addBands(ndvi.rename('NDVI'));
}
var imgCol = ee.ImageCollection("LANDSAT/LC08/C01/T1_SR").filterBounds(roi)
.filterDate("2019-8-01", "2019-8-30").map(ndv_LANDSAT_8);
print("imgCol", imgCol);
Map.addLayer(imgCol.select(["B2", "B3", "B4"]).mosaic().clip(roi), { min: 0, max: 2500, bands: ["B4", "B3", "B2"] }, "imgCol", false);
//获取影像数量
var count = imgCol.size();
print(count);
var redc = imgCol.mosaic().clip(roi)
print("redc",redc)
var jisuan = redc.select("NDVI").reduceRegion(ee.Reducer.mean(),geometry0,300)
print("jisuan",jisuan)
pie 中在NDVI计算的函数中出现了问题,两者的函数构造是不同的,如果直接用PIE中的function代码直接放入GEE中是无法运行的,主要问题如下面所示和代码区别:
//PIE——NDVI函数
function imgCalculate (image1) {
var ndvi1=image1.normalizedDifference(["B5","B4"]);
return image1.addBands(ndvi1).rename("NDVI");
}
//GEE——NDVI函数
function ndv_LANDSAT_8(image) {
var ndvi = image.normalizedDifference(['B5', 'B4']);
return image.addBands(ndvi.rename('NDVI'));
}
Image (Error)
ImageCollection.mosaic: Error in map(ID=LC08_122032_20190826): Image.rename: The number of names (1) must match the number of bands (13).
最终更改后的结果:
3.AI Earth
在AI Earth中并没有Landsat 8 C01数据集,所以这里只能使用Landsat 8 C02数据集.
同样我们使用GEE也重新计算了:
import aie
aie.Authenticate()
aie.Initialize()
region = aie.Geometry.Polygon([
[
[
117.1224239290218,
40.20026024458343
],
[
117.2502681492852,
40.20026024458343
],
[
117.2502681492852,
40.13354201708273
],
[
117.1224239290218,
40.13354201708273
],
[
117.1224239290218,
40.20026024458343
]
]]
)
# 归一化植被指数
def getNDVI(image):
ndvi = image.normalizedDifference(['SR_B5', 'SR_B4']).rename(['NDVI'])
return ndvi
# 指定需要检索的区域
feature_collection = aie.FeatureCollection('China_Province') \
.filter(aie.Filter.eq('province', '北京市'))
geometry = feature_collection.geometry()
#print("feature_collection",feature_collection.getInfo())
dataset = aie.ImageCollection('LANDSAT_LC08_C02_T1_L2') \
.filterBounds(geometry) \
.filterDate('2019-08-01', '2019-08-31')\
.map(getNDVI).mosaic().clip(region)
print("dataset",dataset.getInfo())
result = dataset.select("NDVI").reduceRegion(aie.Reducer.mean(), region, 30)
print(result)
print(result.getInfo())
结果:
{'NDVI_mean': 0.0190175001}