Google Earth Engine(gee)中的Image

目录

Image.get()

Image.clip()

Image.select()

Image.addBands()

Image中的projection(),reproject()

Image.unitScale()、Image.cast()

Image.set()、Image.setMulti()

Image.remap()

Image的比较筛选:

Image的数学运算:Image.add() 等等

Image的表达式计算:Image.expression()

Image的地形操作:山体阴影、坡向、坡度

Image中的填洼

Image.clamp()

Image.where()

Image.reduceRegion()

Image.Reduce()

Image中的mask() 、not()

Image.unmask()

Image.byte()


土地利用数据集:ESA/GLOBCOVER_L4_200901_200912_V2_3

里面有这两个波段landcover和qa

Image.get()


 

Image.clip()

注意:clip是作用在Image上的,不能作用在ImageCollection上。

如果想获取感兴趣区域的影像集,可以对ImageCollection进行map遍历,在map函数中对image进行clip即可

var sichuan = ee.FeatureCollection("users/lcljv1066965/test/sichuan"),
    dem = ee.Image("USGS/SRTMGL1_003");

print("dem",dem)
print("sichuan",sichuan)

var sichuan_dem = dem.clip(sichuan)

Map.setCenter(106.8, 29.3,5)
Map.addLayer(sichuan_dem,{min:0,max:2000})

Image.select()

提取出想要的波段

var img_cover = ee.Image("ESA/GLOBCOVER_L4_200901_200912_V2_3");
 
print(img_cover)
print(img_cover.select()) 
print(img_cover.select('landcover')) 

Image.addBands()

添加波段

var img_cover = ee.Image("ESA/GLOBCOVER_L4_200901_200912_V2_3");
 
print(img_cover)
var band1=img_cover.select('landcover')
var band2=img_cover.select('qa')

print(band1.addBands(band2))

Image中的projection(),reproject()

var l8 = ee.ImageCollection("LANDSAT/LC08/C01/T1_RT");

var img = ee.Image(l8.filterBounds(ee.Geometry.Point(106.4958, 29.5856)).first())
print(img)
print(img.select('B1').projection())//这里直接img.projection()会报错

var img_reproject = img.reproject('EPSG:3857',null,100)//重投影为3857,重采样为100m
print(img_reproject)
print(img_reproject.projection())//这里直接img.projection()不会报错

Map.setCenter(106.58365, 29.56972,15)
Map.addLayer(img,{"bands":["B5","B4","B3"],"min":10586,"max":18154},'30m')
Map.addLayer(img_reproject,{"bands":["B5","B4","B3"],"min":10586,"max":18154}, '100m')

Image.unitScale()、Image.cast()

  • Image.unitScale():栅格的归一值化--将给定区间内的数值范围转换为0-1的区间内。此算法总是生成浮点像素。
  • Image.cast():强制转换数据类型

var l8 = ee.ImageCollection("LANDSAT/LC08/C01/T1_RT");

var img=l8.first().select(['B3','B4','B5'])
var img_unitScale=img.unitScale(0,32628)//使输入值的范围[低,高]变为[0,1]。此算法总是生成浮点像素。
var img_cast = img.cast({'B3':'long','B4':'double','B5':'float'},['B3','B4','B5'])
//img.cast() 将图像的部分或全部带区强制转换为指定类型
print(img,img_unitScale,img_cast)

Image.set()、Image.setMulti()

var modis = ee.ImageCollection("MODIS/006/MOD09A1");

var img=modis.first()

print(img)
print(img.set('createDate',2020).setMulti({'author':'lijiang', 'age':'22'}))

Image.remap()

var img_cover = ee.Image("ESA/GLOBCOVER_L4_200901_200912_V2_3");

var Old_Id = ee.List([11,14,20,30,40,50,60,70,90,100,110,120,130,140,150,160,170,180,190,200,210,220,230])

var New_Id = ee.List([0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 6, 7, 8])

var Land_Cover = img_cover.select('landcover');
var Land_Remap = Land_Cover.remap(Old_Id,New_Id,8,'landcover')
print(Land_Cover,Land_Remap)

Map.setCenter(102.919, 30.199,6)
Map.addLayer(Land_Cover)
Map.addLayer(Land_Remap,{"palette":["f1ff27","35ce48","07fff3","f017ff","e78845","250bff","ffffff","ffffff"]},
              'remaped')

Image的比较筛选:

var night_Light = ee.ImageCollection("NOAA/DMSP-OLS/NIGHTTIME_LIGHTS"),
    sichuan = ee.FeatureCollection("users/lcljv1066965/test/sichuan");

var img_night_Light =night_Light.select('stable_lights').first().clip(sichuan);

var urban = img_night_Light.gte(2)//筛选夜晚灯光亮度值>=2

Map.centerObject(sichuan);

Map.addLayer(urban, {"opacity":0.33,"bands":["stable_lights"],"palette":["171801","fbff0f"]}, 'Nighttime Light');

Image的数学运算:Image.add() 等等

var l8 = ee.ImageCollection("LANDSAT/LC08/C01/T1_RT");

var img = l8.filterBounds(ee.Geometry.Point(106.5749, 29.5588)).first()

var B5 = ee.Image(img.select('B5'))
var B4 = ee.Image(img.select('B4'))

var NDVI = B5.subtract(B4).divide(B5.add(B4))//NDVI计算可用函数计算 也可map表达式

Map.centerObject(NDVI)
Map.addLayer(NDVI,{"min":-1,"max":1,"palette":["0f01e2","ff9d93","fff707","11ff2e","04ce14"]})

Image的表达式计算:Image.expression()

var l8 = ee.ImageCollection("LANDSAT/LC08/C01/T1_RT");

var img = l8.filterBounds(ee.Geometry.Point(106.5749, 29.5588)).first()

var evi = img.expression(
    '2.5 * ((NIR - RED) / (NIR + 6 * RED - 7.5 * BLUE + 1))', { 
    'NIR': img.select('B5'),
    'RED': img.select('B4'),
    'BLUE': img.select('B2')
});

Map.centerObject(evi)
Map.addLayer(evi,{"min":-1,"max":1,"palette":["0f01e2","ff9d93","fff707","11ff2e","04ce14"]})

在复杂一点的ee.Image.expression()中,中括号不要用[],而要用(),如:

Image的地形操作:山体阴影、坡向、坡度

var dem = ee.Image("USGS/SRTMGL1_003"),
    sichuan = ee.FeatureCollection("users/lcljv1066965/test/sichuan")

print("dem",dem)
var img_terrain=ee.Terrain.products(dem).clip(sichuan)
print("img_terrain",img_terrain)

Map.centerObject(sichuan)
Map.addLayer(dem,{min:0,max:2000,palette:'000099,dddd00'},'Elevation')
Map.addLayer(img_terrain,{bands:['slope'],min:0,max:90,palette:'000000,ff0000'},'Slope')
Map.addLayer(img_terrain,{bands:['aspect'],palette:'00ff00,0000ff,00ff00'},'Aspect')
Map.addLayer(img_terrain,{bands:['hillshade'],min:0,max:255},'Hillshade')

Image中的填洼

Image.clamp()

Image.where()

上面的clamp函数是二分,这个where函数就可以多条件了

var sichuan = ee.FeatureCollection("users/lcljv1066965/test/sichuan"),
    dem = ee.Image("USGS/SRTMGL1_003");
var sichuan_dem = dem.clip(sichuan)

var sichuan_dem_where=sichuan_dem.where(sichuan_dem.lte(500),0)
                    .where(sichuan_dem.gt(500).and(sichuan_dem.lte(1000)),1)
                    .where(sichuan_dem.gt(1000),2)

Map.centerObject(sichuan,6)
Map.addLayer(sichuan_dem,{min:0,max:2000},"sichuan_dem")
Map.addLayer(sichuan_dem_where,{min:0,max:2},"sichuan_dem_where")

Image.reduceRegion()

var img_dem = ee.Image("USGS/SRTMGL1_003");

var polygon = ee.Geometry.Polygon( [[[106.20650888671878, 29.570337903152346],
                                    [106.54159189453128, 29.56556010779314],
                                    [106.54159189453128, 29.725493070064537],
                                    [106.21612192382815, 29.71952998792036]]]);

print("min",img_dem.reduceRegion(ee.Reducer.min(),polygon))
print("median",img_dem.reduceRegion(ee.Reducer.median(),polygon))
print("max",img_dem.reduceRegion(ee.Reducer.max(),polygon))
print("mean",img_dem.reduceRegion(ee.Reducer.mean(),polygon))

Map.centerObject(polygon)
Map.addLayer(img_dem.clip(polygon),{min:0,max:2000},'DEM')

Image.Reduce()

var img = ee.Image("LANDSAT/LC08/C01/T1/LC08_127040_20190407");

Map.centerObject(img);

Map.addLayer(img,{},"img")
Map.addLayer(img.reduce(ee.Reducer.min()), {max: 5000}, 'Reducer.min()');
Map.addLayer(img.reduce(ee.Reducer.median()), {max: 10000}, 'Reducer.median() 中位数');//中位数  
Map.addLayer(img.reduce(ee.Reducer.mean()), {max: 12000}, 'Reducer.mean() 平均值');//平均值
Map.addLayer(img.reduce(ee.Reducer.max()), {max: 30000}, 'Reducer.max()');

Image中的mask() 、not()

我们可以通过掩膜来提取感兴趣的区域

var sichuan = ee.FeatureCollection("users/lcljv1066965/test/sichuan");
var img = ee.Image('CGIAR/SRTM90_V4').clip(sichuan);
 
var img_gte1000=ee.Image(img.gte(1000))
var img_lte1000=ee.Image(img.lte(1000))
 
Map.centerObject(sichuan, 6);
 
Map.addLayer(img, {min: 0, max: 3000}, 'img');
Map.addLayer(img_gte1000, {min: 0, max: 1,palette:['blue', 'red']}, 'img_gte1000');

再进一步分析 

至于最后的not(),其实就相当于取反的意思

由以下可以看到,img_lte1000.not()实际上就等于img_gt1000

var sichuan = ee.FeatureCollection("users/lcljv1066965/test/sichuan");
var img = ee.Image('CGIAR/SRTM90_V4').clip(sichuan);

var img_gte1000=ee.Image(img.gte(1000))
var img_lte1000=ee.Image(img.lte(1000))

Map.centerObject(sichuan, 6);

Map.addLayer(img, {min: 0, max: 3000}, 'img');
Map.addLayer(img.mask(img_gte1000), {min: 0, max: 3000,palette:['006600', '002200', 'fff700', 'ab7634', 'c4d0ff', 'ffffff']}, 'img.mask(img_gte1000)');
Map.addLayer(img.mask(img_lte1000), {min: 0, max: 3000}, 'img.mask(img_lte1000)');
Map.addLayer(img.mask(img_lte1000.not()), {min: 0, max: 3000}, 'img.mask(img_lte1000.not())');

此外,如果不给mask()传参,如下,

var sichuan = ee.FeatureCollection("users/lcljv1066965/test/sichuan");
var img = ee.Image('CGIAR/SRTM90_V4').clip(sichuan);
 
Map.centerObject(sichuan, 6);

Map.addLayer(img.mask(), {min: 0, max: 3000}, 'img.mask()');
Map.addLayer(img, {min: 0, max: 3000}, 'img');

Image.unmask()

unmask的作用在于它可以将掩膜掉的区域影像值替换为任意值,而未掩膜的区域保持原值

var sichuan = ee.FeatureCollection("users/lcljv1066965/test/sichuan");
var img = ee.Image('CGIAR/SRTM90_V4').clip(sichuan);

Map.centerObject(sichuan, 6);

var palette=['006600', '002200', 'fff700', 'ab7634', 'c4d0ff', 'ffffff']

Map.addLayer(img, {min: 0, max: 3000}, 'img');
Map.addLayer(img.unmask(700), {min: 0, max: 3000,palette:palette}, 'img.unmask(700)');

Image.byte()

强制转换为无符号8位整型(unsigned int8)

var img = ee.Image('CGIAR/SRTM90_V4');

print("img",img)
print("img.byte()",img.byte())

  • 5
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
以下是使用Google Earth Engine获取逐日NDVI的代码示例: ```javascript // 设置ROI var roi = ee.Geometry.Rectangle([xmin, ymin, xmax, ymax]); // 设置起始和结束日期 var startDate = ee.Date('2019-01-01'); var endDate = ee.Date('2019-12-31'); // 加载MODIS数据 var modis = ee.ImageCollection('MODIS/006/MOD13A1') .filterBounds(roi) .filterDate(startDate, endDate) .select('NDVI'); // 定义函数计算每个图像的年份和日数 var addDate = function(image) { var doy = image.date().getRelative('day', 'year'); return image.addBands(doy).addBands(image.date().get('year')); }; // 对图像集应用函数 var modisWithDate = modis.map(addDate); // 定义函数计算每个年份和日数的平均NDVI值 var reduceDaily = function(imageCollection, year, doy) { var filtered = imageCollection.filter(ee.Filter.calendarRange(year, year, 'year')) .filter(ee.Filter.calendarRange(doy, doy, 'day_of_year')); return filtered.mean().set('year', year).set('doy', doy); }; // 创建一个二维数组,其第一维表示年份,第二维表示一年的日数 var years = ee.List.sequence(startDate.get('year'), endDate.get('year')); var days = ee.List.sequence(1, 365); // 对所有年份和日数应用reduceDaily函数 var dailyNDVI = ee.ImageCollection.fromImages(years.map(function(y){ return days.map(function(d){ return reduceDaily(modisWithDate, y, d); }); }).flatten()); // 打印输出结果 print(dailyNDVI); ``` 在上述代码,首先定义了一个感兴趣区域(ROI),然后加载了2000年至今的MODIS NDVI数据,并对其进行了筛选。接着定义了两个函数,一个函数用于向每个图像添加年份和日数作为带宽,另一个函数用于计算每个年份和日数的平均NDVI值。最后,将所有年份和日数应用到reduceDaily函数,生成逐日的NDVI值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值