【摘自:https://blog.csdn.net/weixin_43360896/article/details/108853250】
华东师范大学“生态学研究方法”研究生暑期学校——GEE及其生态学应用
GEE运算快的原理: 远程并行运算,因此适合用于做针对栅格的时间序列运算(垂向),而对于矢量数据处理能力有限(水平)
链接: https://www.bilibili.com/video/BV1Sb411p7TQ/?vd_source=612e9dcddfb9f49b7674d92f75dd2c40
认识界面: 记得善用搜索框,可以直接搜索数据导入,可以搜索地点
Geometry Imports
按钮中为添加的点线面增添属性;GEE的数据类型可以分为:
String
/Number
/Array
/List
/Dictionary
Geometry
/Feature
/FeatureCollection
/Image
/ImageCollection
官方介绍为: The remainder of the guides are intended to illustrate important concepts about data types such as
Image
, The fundamental raster data type in Earth Engine.最基础的影像ImageCollection
, a stack or time-series of images.长时间序列的影像集合Geometry
, the fundamental vector data type in Earth Engine.基本的几何(点线面),没有属性Feature
, or a Geometry
with attributes.矢量数据,即有属性的点线面FeatureCollection
, or a set of features.矢量数据集合Reducer
, an object used to compute statistics or perform aggregations.对象计算统计和聚合Join
, or how to combine datasets (Image
or Feature
collections) based on time, location, or an attribute property.Array
, for multi-dimensional analyses.我的人话:
image.reduceRegion
和image.reduceRegions
。功能 | 代码 | 功能 | 代码 |
---|---|---|---|
显示 | print(string) |
创建 | ee.String() |
拼接 | string.cat() |
替换 | string.replace() |
分割 | string.split() |
匹配 | string.match |
切片 | string.slice() |
长度 | string.length() |
var string_1 = ee.String('first_string')
var string_2 = ee.String('second_string')
var cat_string = string_1.cat(string_2) //拼接
var string_3 = string_1.replace('r','R') //把字符串1中的第一个'r'替换成'R',若想替换全部的'r',则需要('r','R','g')
功能 | 代码 |
---|---|
创建 | ee.Number() |
转换 | number.int8() /number.uint8() /number.float() /number.double() |
比较 | number.eq() /number.neq() /number.gt() /number.lt() /number.and() /number.or() 【返回1或0】 |
运算 | number.abs() /number.round() /number.pow() /number.sqrt() /number.exp() /number.log() |
位运算 | Landset卫星的数据前几位是二进制,包含云层含量信息,可以通过位运算高效提取信息 |
功能 | 代码 |
---|---|
创建 | ee.List() /ee.List.repeat() /ee.List.sequence() |
修改 | list.set() /list.replace() /list.replaceAll() /list.insert() /list.zip() /list.sort() /list.remove() |
查询 | list.get() /list.length() /list.size() |
Map | 对List中的每个元素同时进行相同操作,遍历,也可以理解为循环。GEE中非常不建议循环,相当于抛弃了并行计算,故用Map |
var listExm_1 = ee.List([1,2,3,'A','B',["hello","world"]]) //List的元素可以是数字、字符、字符串、列表
var listExm_2 = ee.List.repeat("hello",3) //List.repeat创建重复列表为:["hello","hello","hello"]
var listExm_3 = ee.List.sequence(start,end,step,number) //List.sequence创建有规律列表
var listExm_4 = listExm_1.set(4,'R')//List的第4个元素设置为'R'
var listExm_5 = listExm_1.zip(listExm_2)//Zip把两个list相应位置上的元素打包成小list,长度以短的为准[[1,"hello"],[2,"hello"],[3,"hello"]]
Array(向量/数组)和List最大的区别是他有方向性,也就是说除了数据本身,数据的排列方式本身也包含信息。
功能 | 代码 |
---|---|
创建 | ee.Array() /ee.Array.identity() |
修改 | array.mask() /array.transpose() /array.uint8() |
数学 | array.eq() /array.neq() /array.gt() /array.gte() /array.lt() /array.lte() |
var Aray_1 = ee.Array([[1],[2],[3]])//3*1的向量
var Aray_2 = ee.Array([[1,2,3]])//1*3的向量
var Aray_3 = ee.Array.identity(5)//创建一个5×5的,元素为1的,对角矩阵
var Aray_4 = ee.Array([[1,1],[2,2],[3,3],[4,4]])
var Aray_5 = ee.Array([[1,2],[3,4],[4,3],[2,1]])
var Aray_6 = Aray_4.eq(Aray_5)//判断相应位置是否相等,返回为[[1,0],[0,0],[0,1],[0,0]]
理解: 对数组进行mask处理,就是对相应位置判断是否存在,这就是ArcGIS中的掩膜的本质
如:
数组1=[[1,1],[2,2],[3,3]]
数组2=[[0],[1],[0]]
用数组2对数组1进行掩膜:数组3=数组1.mask(数组2)
数组3=[[2,2]]
功能 | 代码 |
---|---|
创建 | ee.Geometry.Point() /ee.Geometry.MultiPoint() /ee.Geometry.LineString() / 绘图工具 |
几何 | geometry.transform() /geometry.centroid() /geometry.bounds() /geometry.buffer() |
查询 | geometry.area() /geometry.length() /geometry.distance() |
转换 | geometry.toGeoJSON() ,gee对GeoJSON的支持大于对SHP的支持,SHP容易出现乱码 |
示例:
// 创建点
var Yeheshan = ee.Geometry.Point([107.9148,34.5587])//创建单点对象[刺槐样地]
var Yeheshan = ee.Geometry.MultiPoint([[107.9148,34.5587],[107.9336,34.5595]])//创建包含多个点的对象[刺槐,油松]
// 创建线
var SingleLine = ee.Geometry.LineString([[x1,y1],[x2,y2]])//创建点连成的线
var Lines = ee.Geometry.MultiLineString([[[x1,y1],[x2,y2]],[[x3,y3],[x4,y4]]])//创建多条线
var LineRing = ee.Geometry.LinearRing([[x1,y1],[x2,y2],[x3,y3],[x1,y1]])//创建闭合的线
// 创建面
var poly = ee.Geometry.Polygon([[x1,y1],[x2,y2],[x3,y3],[x4,y4]])//四个点决定的面
var poly = ee.Geometry.Rectangle([[x1,y1],[x2,y2]])//对角两个点决定的矩形
功能 | 代码 |
---|---|
创建 | ee.Feature / 绘图工具 |
编辑 | feature.transform() /feature.select() /feature.set() |
几何 | 度转米、简化、中心、求四至、缓冲区;多个求并、求交叉、求差 |
提取 | feature.geometry() /feature.get() /feature.Length() /feature.Area() |
示例:
var poly = ee.Geometry.Polygon([[x1,y1],[x2,y2],[x3,y3],[x4,y4]])
var Feature_poly = ee.Feature(poly,{name:'故宫',location:'北京'})//赋予geometry属性
var Feature_select = Feature_poly.select(['name'])//只选中了name属性,赋值给新面,新面的属性只有name:'故宫',常用于复制
var Feature_set = Feature_poly.set('name','Yeheshan')//更改属性
var Feature_set = Feature_poly.setMulti({'name':'Yeheshan','location':'Shanxi'})//更改属性
var Feature_geo = Feature_poly.geometry()//只保留空间形状,不包含属性
var Feature_name = Feature_poly.get('name')//只要属性,不要空间形状
举例: 整个中国有自己的属性(名称、面积、人口),而中国内部又有各个省份,也有各自的属性,上述放在一起就是FeatureCollection
功能 | 代码 |
---|---|
创建 | GEE自带/上传/ee.FeatureCollection() /手绘 |
编辑 | .filterMetadata() /.limit() /.filterBounds() /.filter() /.select() /.union() /.set /.remap /.sort /.makeArray() |
查询 | .geometry() /.reduceToImage() |
统计 | `.aggregate_stats |
GEE自带一些FeatureCollection数据,在搜索框输入table,可以看到提供的矢量文件。
对collection善用map命令,自己编写针对feature的函数,然后使用map将其应用至featureCollection的每个feature上!
编辑功能举例:
var China = ee.FeatureCollection("users/keatinggee/Administration/Boundary/China");
//.filterMetadata()通过属性筛选
var Shandong = China.filterMetadata('SHENG','equals',37);//对源(Meta)数据进行筛选:选择SHENG字段equal 37的区域
//.limit() 排序筛选
var top5_provinces=China.limit(5,'SHENG',false) // 数量,筛选字段(可选,默认属性表顺序),排序方式(可选,默认小到大True)
//.filterBounds()根据空间位置筛选
var Yeheshan = ee.Geometry.Point([107.9148,34.5587])
var Shanxi = China.filterBounds(Yeheshan)
//.filterDate()根据时间筛选[矢量集基本没有多时间的]
var L8 = ee.ImageCollection("LANDSAT/LC08/C01/T1_RT")
var Landsat_f = L8.filterDate('2019-03-01','2019-03-16').limit(50)//limit的作用显现,GEE打印台最多能打500个,为了简要查看筛选效果,可以选择先打前50幅
print(Landsat_f)
var China_ID = China.select(['SHENG'])//select和feature的类似,主要用于数据复制
var China_dis = China.distinct(['SHENG'])//去除重复字段
var China_uni = China.union()//把FeatureCollection的各Feature集合成一个边界,即去除省界,只剩国界-->不好用
var Shandong_set = Shandong.set('SHENG',1)//更改属性
var China_array = China.makeArray(['SHENG','Area'],'New_a')//把多个属性字段如6和1000,生成一个新的属性字段[6,1000]
查询功能举例:
var China_geo = China.geometry()//仅保留geometry信息,即只保留空间形状,不包含属性
var China_tif = China.reduceToImage(['SHENG'],ee.Reducer.first())//相当于矢量转栅格的操作,运用的属性信息是'SHENG',对于这样一个转换,使用的缩减器是first缩减器
统计功能举例:
//aggregate可以理解为对属性表的某一列进行统计:status是基本统计量,histogram是直方图...
功能 | 代码 |
---|---|
创建 | ee.Image() |
编辑 | .mask() /.clip() /.select() /.slice() /.addBands() /.reproject() /.set() /.remap() /.where() /.clamp() /.eq() |
地形 | ee.Terrain.products() /ee.Terrain.fillMinima() |
邻域 | .focal_max() /.focal_min() / |
编辑功能举例:
var China = ee.FeatureCollection("users/keatinggee/Administration/Boundary/China")
var DEM = ee.Image("CGIAR/SRTM90_V4")
//mask掩膜操作,概念上是裁剪,本质上是告诉计算机,哪部分参与运算,哪部分不参与运算,不参与计算的区域不会删除[栅格vs栅格]
var DEM_Image = DEM.mask(Image)//用Image裁剪DEM
//clip裁剪操作,会删除裁剪之外的图像[矢量vs栅格]
var DEM_China = DEM.clip(China)//用中国边界裁剪DEM
var Image_select = Image.select('band_name')//按波段名称,挑选波段
var Image_select = Image.slice(2,5)//按波段顺序,挑选波段
var DEM_repj = DEM.reproject('EPSG:3857',null,100)//将DEM重新投影为'EPSG:3857'坐标系,使用默认参数,重投影后分辨率为100 m。[GEE中坐标系代号需要查询epsg.io]
var DEM_note = DEM.set('note','add note to this DEM')//修改 or 设置 Image的属性
var DEM_notes = DEM.setMulti({'author':'zhy','institute':'igsnrr'})//修改 or 设置 Image的属性
//数学运算
//.abs()/.round/.sqrt()/.exp()/.add()/.substract()/.multiply()/.divide()/.pow()/.sin()
var B5 = ee.Image(L8.select('B5'))
var B4 = ee.Image(L8.select('B4'))
var B3 = ee.Image(L8.select('B3'))
var NDVI = B5.subtract(B4).divide(B5.add(B3))
//.expresssion()
var evi = L8.expression(
'2.5 * ((NIR - RED) / (NIR + 6 * RED - 7.5 * BLUE + 1))', {
'NIR': L8.select('B5'),
'RED': L8.select('B4'),
'BLUE': L8.select('B2')});
//重分类
//将原图中的'landcover'属性,按相应位置,批量转化为后者,上述重分类中没有出现的值命名为8
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 = ee.Image("ESA/GLOBCOVER_L4_200901_200912_V2_3").select('landcover');
var Land_Remap = Land_Cover.remap(Old_Id,New_Id,8,'landcover')
//比较判断,返回1/0栅格: .eq/.neq/.gt/.gte/.lt/.lte 和 and/or
var night_Lights = ee.Image('NOAA/DMSP-OLS/NIGHTTIME_LIGHTS/F182013').select('stable_lights')
var urban = night_Lights.gte(20)//夜间灯光值大于20的点属于城市
var Low_Area = ee.Image("USGS/SRTMGL1_003").lt(200)//低于200的属于低地
var Low_Urban = urban.and(Low_Area)//上述两个的交集,为低地城市
//条件赋值
//将Land_Cover影像中,DEM小于4000的地区赋值为0
var DEM = ee.Image("USGS/SRTMGL1_003");
var Land_Cover = ee.Image("ESA/GLOBCOVER_L4_200901_200912_V2_3").select('landcover');
var High_Land = Land_Cover.where(DEM.lt(4000),0)
//区间截取
var DEM_Clamp = DEM.clamp(450,795)//将高程大于795米的地区赋值为795,小于450米的地区赋值为450
//归一化
var L8_One = ee.Image(ee.ImageCollection("LANDSAT/LC08/C01/T1")).first());
var L8_Unitscale = L8_One.unitScale(0,32767)//将0-32767的整数,归一化为0-1的float
地形功能举例:
var DEM = ee.Image('CGIAR/SRTM90_V4');
var Terrain = ee.Terrain.products(DEM);//生成的image包含三个波段:坡度、坡向、阴影
var DEM_Fill = ee.Terrain.fillMinima(DEM,0,50);//填洼,填洼边界为0,栅格邻域大小为50
邻域操作举例: 邻域操作,即在搜索半径内的一个值符合条件,那么将该值定义为整个邻域的所有值
var OldIMAGE = ee.Image('MCD12Q1/MCD12Q1_005_2001_01_01').select('Land_Cover_Type_1');
var MaxIMAGE = OldIMAGE.focal_max(5,'circle','pixels');//以圆形(circle)的邻域,邻域大小为5个像素(pixels),该区域内所有值都替换为最大值
var MinIMAGE = OldIMAGE.focal_min(5,'circle','pixels');
var MedianIMAGE = OldIMAGE.focal_median(5,'circle','pixels');
var ModeIMAGE = OldIMAGE.focal_mode(5,'circle','pixels');
//栅格的卷积操作:DEM.convolve【没看懂】
//栅格的邻域缩减操作:DEM.reduceNeighborhood【没看懂】
区域统计举例:
var DEM = ee.Image("USGS/SRTMGL1_003");
var China = ee.FeatureCollection("users/keatinggee/Administration/Boundary/China")
var China_Mean = DEM.reduceRegion(ee.Reducer.mean(),China)//区域均值
var China_Histo = DEM.reduceRegion(ee.Reducer.histogram(),China)//区域直方图
栅格输出举例:
Export.image.toDrive({
image:DEM_Clip,
region:China
})
功能 | 代码 |
---|---|
创建 | ee.ImageCollection() /ee.ImageCollection.load() |
筛选 | .filterBounds()/filterDate()/filterMetadata() /.select() |
求值 | .mosaic() /and() /.or() /.sum() /.max() /.product() /.count() |
转换 | .first() /.toList() |
举例:
var collection = ee.ImageCollection('NOAA/DMSP-OLS/NIGHTTIME_LIGHTS')//导入
var collection = ee.ImageCollection([image_1,image_2])//利用现有image生成imageCollection
//筛选
var China = ee.FeatureCollection("users/keatinggee/Administration/Boundary/China_without_sea")
var L8 = ee.ImageCollection("LANDSAT/LC08/C01/T1_TOA")
.filterBounds(China.geometry())//通过位置筛选
.filterDate('2018-01-01','2018-12-31')//通过时间筛选
.filterMetadata('CLOUD_COVER','less_than',0.1);//通过属性筛选
var L8_select = L8.select(['B5','B4','B3'],['Near infrared','Red','Green']);//筛选出B543,重命名为近红外/红/绿波段
var L8_Limit = L8.limit(10);//GEE对于数据集最多允许5000条记录
print(L8,L8_Limit);
//合并,新的数据集有xxxx张地图,每张地图有'Coastal aerosol'和'Blue'两个波段
var Combine_1 = L8.select(['B1'],['Coastal aerosol'])
var Combine_2 = L8.select(['B2'],['Blue'])
var Combine = Combine_1.combine(Combine_2)
//拼接,包含多幅Image的ImageCollection拼接后,变成了单幅的Image
// 重叠部分由后一幅Image完全覆盖前一幅Image
var L8_1 = ee.Image('LANDSAT/LC08/C01/T1_TOA/LC08_127040_20180303').select('B5');
var L8_2 = ee.Image('LANDSAT/LC08/C01/T1_TOA/LC08_128039_20130413').select('B5');
var L8 = ee.ImageCollection([L8_1,L8_2]);
var L8_Mosaci = L8.mosaic()
//运算
//sum()/mean()/max()/min()/product(),将有n张包含m个波段的Collection,运算后变为有1张包含m个波段的Image
var L8_Sum = L8.sum()
var L8_Product = L8.product()
var L8_Max = L8.max()
var L8_Min = L8.min()
var L8_Mean = L8.mean()
// toList/toArray() 操作
// 将ImageCollection转换成一个List,该列表的每个元素都是一个Image,主要用于与Get联合,获取任意位置的Image
var L8_List = L8.toList()
var Time_No_1 = ee.Image(L8_List.get(0))
var Time_No_2 = ee.Image(L8_List.get(1))
var Time_No_3 = ee.Image(L8_List.get(2))
实验: 用点对ImageCollection进行筛选是选择的点所在的卫星图像,例如:Landsat.filterBounds(ee.Geometry.Point([107.9148,34.5587]))
Date是时间点,DateRange是时间段。
Date举例:
//创建
var date_1 = ee.Date('1970-01-02')//'YYYY-MM-DD',代表该日期的0时0分0秒
var date_2 = ee.Date(24*60*60*1000)//数字格式的时间点:距离起始时间1970-01-01的0时0分0秒的毫秒数
var date_3 = ee.Date.fromYMD(1992,05,10)//输入年月日:1992-05-10 00:00:00
var date_4 = ee.Date.parse( 'yyyy-MM-dd-HH-mm-ss','2019-03-27-16-26-12' );//自定义时间格式
//编辑
var Date_0 = ee.Date( '1970-01-01' );
var Date_1 = Date_0.advance(1, 'year' );//加一年
var Date_2 = Date_0.advance(1, 'month' );//加一月
var Date_3 = Date_0.advance(1, 'week' );//加一周
var Date_4 = Date_0.advance(1, 'day' );//加一天
var Date_5 = Date_0.advance(1, 'hour' );//加一小时
var Date_6 = Date_0.advance(1, 'minute' );//加一分
var Date_7 = Date_0.advance(1, 'second' );//加一秒
var Date_1 = ee.Date( '1992-05-10' );
var Date_2 = Date_1.update(2019,06,9);//修改为:'2019-06-09'
var Date_0 = ee.Date.fromYMD(1999,9,9);
var Date_FMT = Date_0.format('MM-dd-yyyy');//将时间格式修改为:'09-09-1999'
//提取
var Date_0 = ee.Date('2000-05-12');
var Date_Get = Date_0.get('year');//返回时间点的'year'为2000
var Date_Range = Date_0.getRange('month');//返回时间点所在范围,所在'month'范围是'2000-05-01'和'2000-06-01'
var Difference_Day = Date_1.difference(Date_2,'day');//求取两个时间单位之间差的'day'数
DateRange举例:
//创建
var Range_1 = ee.DateRange('2000-01-01')//1毫秒的长度
var Range_2 = ee.DateRange('2000-01-01','2019-03-28')
var Rang_Unbound = ee.DateRange.unbounded()//创建一个无穷时间量,包含任何时间段(-∞,+∞)
//联并
var Range_1 = ee.DateRange('1979-01-01','2008-01-01')
var Range_2 = ee.DateRange('2000-01-01','2019-03-28')
var Range_3 = Range_1.union(Range_2)//求并:DateRange: ['1979-01-01 00:00:00','2019-03-28 00:00:00']
var Range_4 = Range_1.intersection(Range_2)//求交:DateRange: ['2000-01-01 00:00:00','2008-01-01 00:00:00']
//查询,提取DataRange首尾的Data
var Range_Start = Range_1.start()
var Range_End = Range_1.end()
//判断
var Range_5 = ee.DateRange('1979-01-01','2008-01-01')
var Range_6 = ee.DateRange('2000-01-01','2019-03-28')
var Right_Wrong_1 = Range_5.intersects(Range_6)//判断是否相交:true
var Right_Wrong_2 = Range_5.contains(Range_6)//判断6是否含于5:false
需求:
Tips1: 之前提到的 filterBounds() / filterDate() 等方法,本质是 ee.Filter.Bounds / ee.Filter.Date()
Tips2: Collection筛选后,只有一幅图,但属性还是Collection,可以通过 .first() 将其转化为Image/feature
Filter举例:
//比较筛选器:eq/neq/gt/gte/lt/lte
var China = ee.FeatureCollection("users/keatinggee/Administration/Boundary/China")
var CQ_Filter = ee.Filter.eq('NAME','Chong_Qing')//实例化一个筛选器:'NAME'=='Chong_Qing'
var CQ = China.filter(CQ_Filter).first()//应用筛选器
var CQ_Area = CQ.get('Shape_Area')
var Smaller_Than_CQ_Filter = ee.Filter.lt('Shape_Area',CQ_Area)//实例化一个筛选器:'Shape_Area'<重庆面积
var Smaller_Than_CQ_Provinces = China.filter(Smaller_Than_CQ_Filter)//应用筛选器
//最大差值筛选器:求得某一变量的差值小于某一阈值的所有区域
var Within_10_CQ_Filter = ee.Filter.maxDifference(10,'Shape_Area',CQ_Area)//'Shape_Area'与重庆面积差值小于10
var Within_10_CQ_Provinces = China.filter(Within_10_CQ_Filter)
//***应用:定义一个前后一天的筛选器
//字段筛选器
var Start_Shan = ee.Filter.stringStartsWith('NAME','Shan')//实例化一个筛选器:'NAME'以'Shan'开头
var End_Nan = ee.Filter.stringEndsWith('NAME','Nan')
var Congtain_Bei = ee.Filter.stringContains('NAME','Bei')
...//应用筛选器
//使用列表筛选
var Name_List = ee.List(['Chong_Qing','Si_Chuan','Yun_Nan','Gui_Zhou'])//自定义列表
var Inlist_Filter = ee.Filter.inList('NAME',Name_List)//实例化一个筛选器:'NAME'在自定义列表中
var List_Features = China.filter(Inlist_Filter)//应用筛选器
//filter的组合
var Start_H = ee.Filter.stringStartsWith('NAME','H')//实例化一个筛选器:以'H'开头的省份
var End_n = ee.Filter.stringEndsWith('NAME','n')//实例化一个筛选器:以'n'结尾的省份
var Filter_And = ee.Filter.and(Start_H,End_n)//结合筛选器:以'H'开头,并且 以'n'结尾的省份
var Filter_Or = ee.Filter.or(Start_H,End_n)//结合筛选器:以'H'开头,或者 以'n'结尾的省份
var Filter_Not = Filter_And.not()//结合筛选器:不是以'H'开头且'n'结尾的省份
...//应用筛选器
Join举例: 可以理解为属性表链接
//先不学了,有机会再看吧
对Feature函数进行数理统计,或对Image函数进行空间分析。
Reducer的中文含义是“缩减器,减压器”。与筛选Filter相比,Reducer虽然也有“减少”的意思,但其更多的含义在于“通过分析后获得统计信息”上。比如有100个苹果,Filter处理后只剩下80个,而Reducer处理后得则可以到“平均重量”。总之,Filter着重于数量上的减少,而Reducer强调数学抽象的汇总。
ee.Reducer()命令创建的是一个 “名词” ,其发挥作用只能在于其他 “动词” 配合的前提下才能完成,本例中的动词是.reducerColumns(),可以理解为“列统计”。此外要注意.count 和 .countEvery的区别。.count是计算指定列的数据,如果数据缺失则不进行数量统计(例如某数据不存在“NAME”属性),而.countEvery则是统计所有列的数据。
var China = ee.FeatureCollection("users/keatinggee/Administration/Boundary/China")
var Reducer_Count = ee.Reducer.count()//创建Reducer:统计数量
var Reducer_CountEvery = ee.Reducer.countEvery()//创建Reducer:每一个的数量
var Reducer_First = ee.Reducer.first()//创建Reducer:寻找第一个
var FrequencyHiso_Reducer = ee.Reducer.frequencyHistogram()//创建Reducer:统计某列每个要素出现的次数(频率统计)
var Tolist_Reducer = ee.Reducer.toList()//创建Reducer:将属性表中某字段的信息生成列表
//动作:属性表-列统计(reduceColumns)
var Provinces_Number_1 = China.reduceColumns(Reducer_Count,['NAME'])//统计了属性表中,'Name'这一列的个数
var Provinces_Number_2 = China.reduceColumns(Reducer_CountEvery,[ ])//统计了整个属性表每一列的个数
var Provinces_First = China.reduceColumns(Reducer_First,['NAME'])//返回了'Name'这一列的第一个值:'YunNan'
var City_Frequency = China.reduceColumns(FrequencyHiso_Reducer,['NAME_1'])//统计了'NAME_1'的频率
var City_List = China.reduceColumns(Tolist_Reducer,['Name_City'])//生成了'Name_City'的列表
与上述类似的,还可以对属性表的某列进行如下操作:
代码 | 功能 | 代码 | 功能 | 代码 | 功能 |
---|---|---|---|---|---|
.product() |
连乘积 | .sum() |
求和 | .mean() |
求均值 |
.variance() |
求方差 | .sampleVariance() |
样本方差 | .stdDev() |
标准差 |
还可以进行线性拟合(.linearFit()
),例如得到一个像素温度随时间的变化趋势(线性拟合的斜率)