影像数据的操作方法比较多,学到今天,至少我们已经学会了如何定义一个影像,以及如何利用Image封装的函数方法进行操作。接下来,我们继续看Image的影像操作方法。
A.定义波段的数据格式
在编程语言中,我们需要根据数据的特点和应用场景选择恰当的数据格式,是浮点类还是整型?是双精度还是文本型?接下来,举个例子:
//栅格的波段数据格式转换
var collection = ee.ImageCollection("LANDSAT/LC08/C02/T1_TOA");
var Image = ee.Image(collection.filterBounds(ee.Geometry.Point([116.36,29.13])).first().slice(1,4).unitScale(0,32468));
var castImage = Image.cast({"B2":"double","B3":"long","B4":"float"},["B2","B3","B4"]);
print("Image:",Image,"castImage",castImage);
此处小编想把L8的T1_TOA部分的波段数据格式改成自己想要的数据格式,一般的数据格式默认是浮点型(float),小编选三个连续的波段,怎么选?这里要用到前面分享过的波段切片方法(slice),同时进行像素值范围的变换(后面专门解释),得到包含目标波段的影像。
为了完成目标,使用cast(bandType,bandList)可以达到想要的效果,该方法共有两个主参数,前面用字典类型告知GEE,你要把哪几个波段转化为哪个数据格式,后者用列表形式对波段进行排序,如此便能够得到按照一定顺序排列的经过调整的波段格式。结果如下:
B.改变栅格的数据属性
//栅格的属性改写
var collection1 = ee.ImageCollection("LANDSAT/LC08/C02/T1_TOA");
var Image1 = ee.Image(collection.filterBounds(ee.Geometry.Point([116.36,29.13])).first().set("note","this image is a training image").setMulti({"date":"2024-03-01","location":"Poyang Lake"}));
print("Image1",Image1);
栅格数据的属性改写涉及单个属性时,采用set(name,content),即可将属性名称是name的content进行改写,如果要进行多个属性的改写,采用setMulti方法,在参数中利用{....}符号将多组属性名称和内容一一写入。小编在上述代码中演示了向Image中队note,date,location三个属性名称对应的内容进行改写,得到的结果如下:
C.栅格重绘方法
今天第三个要分享的操作方法是remap方法,该方法有些类似于ArcGIS里面的Reclass,即重分类工具,它能够将原来的值范围重新映射为一个新的范围,可以用于土地覆被的改变。举个例子:
//栅格的值Remap,相当于ArcGIS中的重分类
var oldID = 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 newID = ee.List([0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,4,4,4,5,5,6,7,8]);
var LandCover = ee.Image("ESA/GLOBCOVER_L4_200901_200912_V2_3").select("landcover");
var remap = LandCover.remap(oldID,newID,8,"landcover");
Map.addLayer(LandCover,{},"LandCover");
var palettes = require('users/gena/packages:palettes');
Map.addLayer(remap,{palette:palettes.colorbrewer.Set3[9]},"remap");
上面的例子实现了ESA的土地覆盖数据的重新分类,将原来影像数据的id号对应的覆盖类型进行重新归类,用0-8代表9类地表覆盖类型,remap(from,to,defaultvalue,name),共有四个参数,第一个参数是原影像土地覆盖类型对应的值,第二个参数是要映射的新的值,都用列表进行存储,第三个参数如果在’第一个参数’中没有匹配到值可以使用默认值来替代。如果没有指定默认值,未匹配到的值将被屏蔽掉。第四个参数是波段名称,最终得到的结果如下:
D.栅格的区间赋值
区间赋值指的是将某一个区间的值赋值为一个数,常常用来实现栅格重分类的目的。
//栅格的区间赋值
var DEM = ee.Image("USGS/SRTMGL1_003");
var landcover = ee.Image("ESA/GLOBCOVER_L4_200901_200912_V2_3").select("landcover");
var highLand = landcover.where(DEM.lt(4500),0);
Map.setCenter(84.96,28.53);
Map.addLayer(DEM.lt(4500));
Map.addLayer(highLand);
栅格区间赋值一般用到where函数,此处首先调用了两个数据,接着利用where方法将DEM小于4500的地方夫赋值为0,换言之,本代码筛选出数字高程小于4500的区域,并将这些区域的地表覆盖值设为0。区间赋值前后结果对比如下:(上图展示的筛选出来的DEM小于4500的区域,白色部分,海拔标注为1,非4500m的赋值为0,下图是区间赋值结果,青藏高原部分保留了原有的landcover,而黑色部分landcover已经赋值为0)
E.栅格的区间截取
区间截取就是将整个区域的值限定在一个范围内,大于最大值的通常以最大值处理,小于最小值的以一律赋值最小值,举例如下:
//栅格的区间截取
var DEM = ee.Image("USGS/SRTMGL1_003");
var DEM_Clamp = DEM.clamp(1000,3000);
Map.addLayer(DEM_Clamp);
区间截取采用的命令是clamp方法,这里选取的是1000和3000作为阈值,大于3000的都会被赋值为3000,小于1000的,都以1000处理,得到的结果如下:
F.栅格的插值
栅格的插值指的是根据已知点的值推测未知点的值的一种方法,接下来我们举个例子:
//栅格的插值
var province = ee.FeatureCollection("users/hesuixinya511/Province");
function provincecenter(feature){return ee.Geometry(feature.centroid())}
var Center = province.map(provincecenter);
var distance = Center.distance(160000);
var interpolate = distance.interpolate([0,40000,80000,120000,160000],[0,25,50,75,100],"extrapolate");
Map.centerObject(Center,4);
Map.addLayer(distance,{min:0,max:160000},"origin");
Map.addLayer(interpolate,{min:0,max:100},"interpolate");
Map.addLayer(Center,{color:"FF0000"},"centers");
此处小编首先调用自主上传的矢量数据集合,接着定义函数求取每一个省份的中心点,生成Center这个新的矢量集合,接着利用distance定义了一个从举中心点160000m的距离,利用interpolate方法进行插值方法,给定距离0m,40000m,80000m.....对应的数值0,25,50......,使用的extrapolate即外推的方法,根据距离的范围和对应的数值范围,生成一个新的插值结果。并且进行可视化的显示,得到最终结果。
G.栅格的比较筛选
栅格比较筛选,通过等于(eq)、不等于(neq)、大于(gt)、小于(lt)、大于等于(gte)、小于等于(lte)方法实现栅格的比较筛选,得到用户想要栅格。举例如下:
//栅格的比较筛选
var province1 = ee.FeatureCollection("users/hesuixinya511/Province");
var Light = ee.Image("NOAA/DMSP-OLS/NIGHTTIME_LIGHTS/F182013").select("stable_lights").clip(province1);
var Urban_Lights = Light.gte(20);
Map.setCenter(121.44,31.19);
Map.addLayer(Urban_Lights,{"opacity":0.33,"bands":["stable_lights"],"palette":["404040","FFFF00"]},"Urban_Lights");
此处小编调用夜间灯光数据,想筛选稳定光源像素值大于等于20的地区作为结果,并最终进行显示,调用NOAA的数据后,进行波段筛选,利用gte得到最终结果。
H.栅格的逻辑运算
栅格的逻辑运算用于多类型的栅格数据筛选,用于解决既满足...,又满足....,或满足.....,或满足......等问题,举个例子:
//栅格的逻辑运算
var province2 = ee.FeatureCollection("users/hesuixinya511/Province");
var Light = ee.Image("NOAA/DMSP-OLS/NIGHTTIME_LIGHTS/F182013").select("stable_lights").clip(province2);
var Urban_Lights1 = Light.gte(20);
var DEM2 = ee.Image("USGS/SRTMGL1_003").lt(200).clip(province2);
var UrbanDEM = Urban_Lights1.and(DEM2);
print(DEM2);
Map.setCenter(108.14,34.79,4);
Map.addLayer(Light);
Map.addLayer(DEM2);
Map.addLayer(UrbanDEM);
前面的代码和上一段类似,都是队灯光强度大于20的地方进行筛选,接着小编调用DEM数据,以200作为阈值,筛选出中国区域数字高程在200m以下的地区,而后,利用and函数,即和运算,计算同时满足灯光强度大于等于20和地形高度小于200的区域。最后进行图像可视化,结果如下:
由图可以看出,稳定灯光强度大于等于20,海拔较低的地区大部分处于我国的东部地区,侧面印证了东部地区的经济和城市化的扩张。
好了,今天的影像数据的处理方法分享到这里,如果对你有帮助,不要忘记给小编点赞哦!!你的支持是我持续更新的动力,谢谢喽!
更多内容,欢迎关注小编的公众号“梧桐凉月”,GEE学习之路不易,大家一直加油!