博客 / 詳情

返回

GEE:批量處理和下載SoilGrids 250m v2.0

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自己直接維護和更新的,是最新的。

GEE公開數據集上的SoilGrids250m 2.0

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);
})

這裏有一些細節進行説明:

  1. 由於要求裏需要輸出地理座標系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未指定部分地理參數都沒有進行計算);

  1. 對於掩膜後的數據集或者本身存在無效值的數據集,直接輸出為tiff文件後ArcGIS軟件能正確識別nan但是渲染時存在異常顯示為黑色背景等問題,需要在輸出時指定formatOptions參數將掩膜的無效值定義為例如-9999,這樣GIS軟件可以正確識別其為無效值nan並且渲染其為透明色;(亦或者使用柵格計算器SetNull(IsNull("temp.tif"), "temp.tif"),即將識別到的無效值設置為ArcGIS中的無效值定義);
  2. 對於輸出分辨率過高,一張tiff文件可能存在的像元數超過一億,那麼就會超出默認的限制maxPixels而輸出報錯,這裏將默認限制提高;
  3. crsTransformscaledimensions是互斥的,即指定了其中某一個參數,則其他兩個參數就不應指定;

    本文由博客一文多發平台 OpenWrite 發佈!
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.