01 説明
1.1 任務和要求
任務:利用GEE分別輸出soc(有機碳含量)和nitrogen(全碳含量)在0-5cm、5-15cm、15-30cm的單波段影像。具體要求包括:
全球範圍,地理座標系WGS84,輸出分辨率0.05°,應用縮放(基於比例因子scaler_factor)還原單位,無效值處理;
1.2 參考
比例因子scaler_factor參考官網(https://gee-community-catalog.org/projects/isric/),具體如下:
參考官方代碼示例:
https://git.wur.nl/isric/soilgrids/soilgrids.notebooks/-/blob/master/markdown/access_on_gee.md
https://code.earthengine.google.com/08f74bc377b253523cd4cffe4268f66d
ps:本文所下載的SoilGrids 250產品與GEE公開數據集檢索的SoilGrids產品(ee.ImageCollection("ISRIC/SoilGrids250m/v2_0"), 見下圖)不同,GEE收錄的是舊版本(但也是ISRIC生產的但不是最新的,是靜態不更新的),而本文所下載的SoilGrids產品是ISRIC託管在GEE上的數據集是由ISRIC自己直接維護和更新的,是最新的。
02 代碼説明
完整代碼如下:
/*
轉換因子scaler_factor見: https://gee-community-catalog.org/projects/isric/#citation
soc、nitrogen的轉換因子分別為10、100,轉換後單位分別為dg/kg, cg/kg
*/
// 準備
var out_res = 0.05;
var soc_bands_name = ['soc_0-5cm_mean', 'soc_5-15cm_mean', 'soc_15-30cm_mean'];
var nitrogen_bands_name = ['nitrogen_0-5cm_mean', 'nitrogen_0-5cm_mean', 'nitrogen_0-5cm_mean'];
var geo_transform = [out_res, 0, -180, 0, -out_res, 90];
var no_data_value = -9999; // 無效值設置
// 獲取soc和nitrogen
var soc = ee.Image("projects/soilgrids-isric/soc_mean"); // 有機碳含量
var nitrogen = ee.Image("projects/soilgrids-isric/nitrogen_mean"); // 全碳含量
print(soc)
print(nitrogen)
// 選取0-30cm的波段
soc = soc.select(soc_bands_name);
nitrogen = nitrogen.select(nitrogen_bands_name)
// 無效值處理(等於0的掩膜掉)
soc = soc.updateMask(soc.neq(0));
nitrogen = soc.updateMask(nitrogen.neq(0));
// 縮放
soc = soc.divide(10); // 縮放後單位為dg/kg
nitrogen = nitrogen.divide(100); // 縮放後單位為cg/kg
// 定義地理範圍
var global_region = ee.Geometry.Rectangle([-180, -90, 180, 90], 'EPSG:4326', false);
// 定義導出函數
function export_band(img_band, band_name) {
var file_name = 'isric_' + band_name;
Export.image.toDrive({
image: img_band,
description: file_name,
folder: 'Global_ISRIC',
fileNamePrefix: file_name,
region: global_region,
crs: 'EPSG:4326',
crsTransform: geo_transform,
maxPixels: 1e13,
formatOptions: {'noData': no_data_value}
});
}
// 分別導出soc各個波段
soc_bands_name.forEach(function(band_name){
var cur_soc = soc.select(band_name);
export_band(cur_soc, band_name);
})
// 分別導出nitrogen各個波段
nitrogen_bands_name.forEach(function(band_name){
var cur_nitrogen = nitrogen.select(band_name);
export_band(cur_nitrogen, band_name);
})
這裏有一些細節進行説明:
- 由於要求裏需要輸出地理座標系WGS84且輸出分辨率為0.05°。如果按照一般的輸出使用
sclae參數,則只能輸出為以WGS84橢球體為基準的投影座標系,單位為m.這是指定scale參數之後gee會依據scale參數自動計算crsTransform參數(仿射係數:[x_res,0,left_right_corner_x,0, -y_res,left_right_corner_x],x_res表示x軸上的分辨率例如經度分辨率,y_res表示y軸上的分辨率例如緯度分辨率,left_right_corner涉及到了投影原點的定義,這裏是指柵格矩陣左上角像元(第一行第一列的像元)的左上角位置,這裏不詳細討論)。(具體可查看:https://developers.google.com/earth-engine/guides/exporting_images?hl=zh-cn&authuser=1);
只需要明白一點,如果使用地理座標系輸出且分辨率單位為°/度,就不要指定scale而是定義好仿射係數crsTransform,此外還需要指定輸出範圍region參數(否則GEE無法知曉輸出的範圍因為scale未指定部分地理參數都沒有進行計算);
- 對於掩膜後的數據集或者本身存在無效值的數據集,直接輸出為tiff文件後
ArcGIS軟件能正確識別nan但是渲染時存在異常顯示為黑色背景等問題,需要在輸出時指定formatOptions參數將掩膜的無效值定義為例如-9999,這樣GIS軟件可以正確識別其為無效值nan並且渲染其為透明色;(亦或者使用柵格計算器SetNull(IsNull("temp.tif"), "temp.tif"),即將識別到的無效值設置為ArcGIS中的無效值定義); - 對於輸出分辨率過高,一張tiff文件可能存在的像元數超過一億,那麼就會超出默認的限制
maxPixels而輸出報錯,這裏將默認限制提高; -
crsTransform、scale和dimensions是互斥的,即指定了其中某一個參數,則其他兩個參數就不應指定;本文由博客一文多發平台 OpenWrite 發佈!