这一部分将给出具体的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()方法的结果: