GEE笔记-0-GEE教程

0 教程

0.0 官方文档

【摘自:https://blog.csdn.net/weixin_43360896/article/details/108853250】

  • Google Earth Engine 官方地址
  • 官方子网站系列:
    • GEE资源介绍
    • GEE资源列表:介绍了卫星影像和各种其他数据
  • API文档介绍:多看API文档!有时候比网上找教程快多了
  • 官方培训资料:中英文资料都有,挺全的
  • 官方示例教程:硬核教程,值得多翻翻

0.1 吴秋生老师–Python

华东师范大学“生态学研究方法”研究生暑期学校——GEE及其生态学应用

  • 授课教师: 吴秋生
  • 单位: 美国田纳西大学地理系
  • 链接: https://www.youtube.com/watch?v=IGSg_ygb-e4
  • 代表: 开发geemap

GEE运算快的原理: 远程并行运算,因此适合用于做针对栅格的时间序列运算(垂向),而对于矢量数据处理能力有限(水平)

0.2 王金柱老师–JavaScript

链接: https://www.bilibili.com/video/BV1Sb411p7TQ/?vd_source=612e9dcddfb9f49b7674d92f75dd2c40

认识界面: 记得善用搜索框,可以直接搜索数据导入,可以搜索地点

  • 代码及个人文件: 位于左上方
    • Scripts:存储代码
    • Docs:列举了经常用到的功能
    • Assets:个人文件,可以自己上传数据,分配内存为250G
  • 代码编写区: 位于正中
    • Get link:点击后,在地址栏就出现了本文所有代码,可以直接复制给他人
  • 数据报告区: 位于右上方
    • Inspector:用于查看具体数据
    • Console:终端命令台,只有在我们使用print输出的时候,才会显示对象
    • Tasks:任务栏,如需代码中要输出的时候,task中就会出现输出任务,设置输出文件夹
  • 数据呈现区: 在下方
    • 点线面工具:用于添加点、线、面,也可以在Geometry Imports按钮中为添加的点线面增添属性;
    • Layers:调整显示图层;调整显示图层的透明度/波段

0.2.1 GEE的数据类型

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与ImageCollection代表的是栅格;
  • Geometry、Feature和FeatureCollection代表的是矢量;
  • Reducer是一个调用函数的接口,常见函数有image.reduceRegionimage.reduceRegions
0.2.1.1 String
功能 代码 功能 代码
显示 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')
0.2.1.2 Number
功能 代码
创建 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卫星的数据前几位是二进制,包含云层含量信息,可以通过位运算高效提取信息
0.2.1.3 List
功能 代码
创建 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"]]
0.2.1.4 Array

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]]

0.2.1.5 Geometry
功能 代码
创建 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]])//对角两个点决定的矩形
0.2.1.6 Feature
功能 代码
创建 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')//只要属性,不要空间形状
0.2.1.7 FeatureCollection

举例: 整个中国有自己的属性(名称、面积、人口),而中国内部又有各个省份,也有各自的属性,上述放在一起就是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是直方图...
0.2.1.8 Image
功能 代码
创建 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
  })
0.2.1.9 ImageCollection
功能 代码
创建 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]))

0.2.2 GEE的参数类型

0.2.2.1 Dates/DateRange

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
0.2.2.2 Filters/Joins

需求:

  • GEE有海量数据,在得到数据后想要筛选出自己需要的数据:Filters
  • 在获得数据后,想要把多种数据放在一起联系分析:Joins

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举例: 可以理解为属性表链接

//先不学了,有机会再看吧
0.2.2.3 Reducers

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()),例如得到一个像素温度随时间的变化趋势(线性拟合的斜率)

你可能感兴趣的:(GEE,javascript)