GEE學習2-ImageCollection的可視化2-可視化實現的方法


這一部分將給出具體的ImageCollection實現方法

二、ImageCollection的可視化實現

首先我們要知道一個知識點:
可視化圖像時,數據范圍縮放是一個需要考慮的重要因素。在默認情況下,在(0,1]范圍內的浮點數值會在(0,255]之間縮放。超出此范圍的值被強制分為0和255。同理,帶符號的16位數據的范圍為−32,768至32,767,默認情況下也會被縮放為[0,255]。但是,接受默認設置通常會導致可視化時圖像特征之間幾乎沒有對比。因此,可以通過使用minmax,改善對比度並強調特定的數據范圍。官方給出了一個好的經驗法則是:將minmax設置為代表感興趣區域中數據的第2個百分點和第98個百分點的值:

var demImg = ee.Image('USGS/SRTMGL1_003');
var aoi = ee.Geometry.Polygon(  
  [[  
    [-103.84153083119054,  49.083004219142886],
    [-103.84153083119054,  25.06838270664608],
    [-85.64817145619054,  25.06838270664608],   
    [-85.64817145619054,  49.083004219142886]
  ]],
  null,  false);
//計算500m分辨率下的第2和第98個百分位高程值
//注意返回的是字典對象
var percentClip = demImg.reduceRegion({ 
  reducer: ee.Reducer.percentile([2,  98]), 
  geometry: aoi, 
  scale:  500, 
  maxPixels:  3e7  
});
//使用keys+get方法得到上一步中計算出的所有百分位值
var keys = percentClip.keys();
print('Set vis min to:', ee.Number(percentClip.get(keys.get(0))).round());  
print('Set vis max to:', ee.Number(percentClip.get(keys.get(1))).round());

(1)靜態可視化

下面的例子是將可視化功能映射到ImageCollection中的每個單波段影像,具體為將MODIS NDVI影像轉化為RGB影像:

var ndviCol = ee.ImageCollection('MODIS/006/MOD13A1') 
  .filterDate('2018-01-01',  '2019-01-01') 
  .select('NDVI');

//定義可視化參數 
var visArgs =  { 
   min:  0, 
   max:  9000, 
   palette:  [  'FFFFFF',  'CE7E45',  'DF923D',  'F1B555',  'FCD163',  '99B718',  '74A901',  '66A000',  '529400',  '3E8601',  '207401',  '056201',  '004C00',  '023B01',  '012E01',  '011D01',  '011301'  ]  
};

//將圖像轉換為RGB可視化圖像並復制的函數 
//從原始圖像到RGB圖像。
var visFun =  function(img)  {  
   return img.visualize(visArgs).copyProperties(img, img.propertyNames());  
};

var ndviColVis = ndviCol.map(visFun);

此時,影像的波段信息已經改變

同樣的操作,可用於多波段影像集合:

var s2col = ee.ImageCollection('COPERNICUS/S2_SR')
   .filterBounds(ee.Geometry.Point(-96.9037,  48.0395))
   .filterDate('2019-06-01',  '2019-10-01');
var visArgs =  {bands:  ['B11',  'B8',  'B3'], min:  300, max:  3500}; 
var visFun =  function(img)  {  return img.visualize(visArgs).copyProperties(img, img.propertyNames());  };
var s2colVis = s2col.map(visFun);  

這時我們隨機查看集合中的一個影像:

(2)動態可視化——VideoThumbURL

getVideoThumbURL()函數根據ImageCollection中的所有圖像生成動畫,其中每個圖像代表一幀。該方法得到的是一個URL,打開可在新的瀏覽器頁面中及時生成動畫。也可以調用ui.Thumbnail函數,在代碼編輯器控制台中查看動畫。

//2018年全球植被變化
var aoi = ee.Geometry.Polygon(  
   [[[-179.0,  78.0],  [-179.0,  -58.0],  [179.0,  -58.0],  [179.0,  78.0]]],  null,  false);

var ndviCol = ee.ImageCollection('MODIS/006/MOD13A1') 
  .filterDate('2018-01-01',  '2019-01-01') 
  .select('NDVI');

//定義動畫參數
var videoArgs =  { 
  dimensions:  768, 
  region: aoi, 
  framesPerSecond:  7, //每秒幀數
  crs:  'EPSG:3857', 
   min:  0, 
   max:  9000, 
   palette:  [  'FFFFFF',  'CE7E45',  'DF923D',  'F1B555',  'FCD163',  '99B718',  '74A901',  '66A000',  '529400',  '3E8601',  '207401',  '056201',  '004C00',  '023B01',  '012E01',  '011D01',  '011301']
};

//根據上面的參數生成動畫,並用ui.Thumbnail打印到控制台
print(ui.Thumbnail(tempCol, videoArgs));

//打印一個URL,在訪問該URL時產生動畫
print(tempCol.getVideoThumbURL(videoArgs));

注:dimensions參數指的是縮略圖的尺寸(以像素為單位)。如果提供單個征數,則它定義圖像的較大的橫縱尺寸的大小,並按比例縮放較小的尺寸,對於較大的圖像橫縱尺寸,默認為512像素。格式:一個整數或者字符串如'WIDTHxHEIGHT'’

(3)動態可視化——FilmstripThumbUrl

getFilmstripThumbUrl()這個函數類似於PPT的放映功能,其原理是先生成一個個靜態圖像,在按順序從上到下的放映出來

var aoi = ee.Geometry.Polygon(  
   [[[-179.0,  78.0],  [-179.0,  -58.0],  [179.0,  -58.0],  [179.0,  78.0]]],  null,  false);

var ndviCol = ee.ImageCollection('MODIS/006/MOD13A1') 
  .filterDate('2018-01-01',  '2019-01-01') 
  .select('NDVI');

//定義參數
var filmArgs =  { 
  dimensions:  768, 
  region: aoi, 
  crs:  'EPSG:3857', 
   min:  0, 
   max:  9000, 
   palette:  [  'FFFFFF',  'CE7E45',  'DF923D',  'F1B555',  'FCD163',  '99B718',  '74A901',  '66A000',  '529400',  '3E8601',  '207401',  '056201',  '004C00',  '023B01',  '012E01',  '011D01',  '011301']
};

print(ndviCol.getFilmstripThumbURL(filmArgs));

最后,我們可以對比下兩種方法的效果,兩者的差別還是很明顯的。
getVideoThumbURL()方法的結果:

getFilmstripThumbUrl()方法的結果:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM