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