1.gee官方文档学习
首先需要明白gee中输入的投影往往由输出的投影决定,学习如下代码
// The input image has a SR-ORG:6974 (sinusoidal) projection.
var image = ee.Image('MODIS/061/MOD13A1/2014_05_09').select(0);
// Normalize the image and add it to the map.
var rescaled = image.unitScale(-2000, 10000);//使输入值的范围 [low, high] 变为 [0, 1]
var visParams = {min: 0.15, max: 0.7};
Map.addLayer(rescaled, visParams, 'Rescaled');
gee运行上述代码时,输入的MODIS影像为正弦投影,而对影像进行标准化unitScale()后在地图展示窗口显示输出。而Map展示的投影为墨卡托投影,而 “输入的投影往往由输出的投影决定”,所以unitScale()的运算也是在墨卡托投影下进行的。
但是在绝大多数用例中,没有投影不是问题,实际上是一种有价值的优化,因为它允许在任何缩放级别预览结果,而无需等待全分辨率计算完成。
2.重投影/坐标变换实验
本次试验主要以modis LAI产品(MOD15A2H.061: Terra Leaf Area Index/FPAR 8-Day Global 500m)为例,该产品是一个 500 米分辨率的 8 天复合数据集。
首先导入一个自己感兴趣的研究区,在进行时间与范围影像筛选,代码如下(研究区需自行定义)
注:MODIS LAI产品存储时将数值扩大了10倍,故需整幅影像乘以尺度因子0.1
var roi = study_area.geometry();
//定义modis lai产品数据时间
var Date_Start = ee.Date('2014-02-05');//定义起始时间
var Date_End = ee.Date('2014-02-13');//定义终止时间
var LAI_collection=modisLAI
.filterDate(Date_Start, Date_End)
.filterBounds(roi)
.select('Lai_500m')
.map(function(image){
return image.multiply(0.1);
});
print('modis LAI:', LAI_collection);
检索结果:
当我们想裁剪感兴趣区的MODIS LAI数据时,系统则报错
故需使用重投影工具(即reproject()),使用reproject("EPSG:4326")将其转换为与roi区域一致的WGS84地理坐标,.reproject()
函数用以变换指定图层的坐标系,"EPSG:4326"
参数是WGS1984地理坐标系,修改后的代码如下,则不再报错。
var Date_Start = ee.Date('2014-02-05');//定义起始时间
var Date_End = ee.Date('2014-02-13');//定义终止时间
var LAI_collection=modisLAI
.filterDate(Date_Start, Date_End)
.filterBounds(roi)
.select('Lai_500m')
.map(function(image){
return image.multiply(0.1);
});
print('modis LAI:', LAI_collection);
var LAI=LAI_collection.first().reproject("EPSG:4326");
Map.addLayer(LAI.clip(roi));
但是查看变换后的分辨率,会发现降低了很多,变为了111km左右,相当于1度。
print("New resolution is:",LAI.projection().nominalScale());
故使用reproject工具时最好指定相应的尺度,如下所示两种方法
方法一:
var LAI=LAI_collection.first().reproject({crs:"EPSG:4326",scale:500});
print("New resolution is:",LAI.projection().nominalScale());
方法二:
var roiprojection=roi.projection();
var LAI=LAI_collection.first().reproject(roiprojection.atScale(500));
print("New resolution is:",LAI.projection().nominalScale());
变换后的分辨率就不会改变了