目录
在GEE中,常用的操作方法如下:
1. 过滤 ee.Filter
在GEE中,所有的几何数据如FeatureCollection、ImageCollection等中都有封装好的过滤方法,分别为:日期过滤filterDate()、空间过滤filterBounds()和属性过滤filterMetadata(),以及一个通用的过滤方法filter。
1.1 日期过滤filterDate()
基础语法:
filterDate(start, end)
按日期范围过滤集合。开始和结束可能是日期、数字(解释为自 1970-01-01T00:00:00Z 以来的毫秒数)或字符串(例如 '1996-01-01T08:00')。基于 'system:time_start' 属性。
这个方法在底层需要去查询集合中的每一个元素属性列表中的属性system:time_start,如果元素没有system:time_start这个属性,那么就没有办法使用日期过滤方法。
示例代码:
var l8 = ee.ImageCollection("LANDSAT/LC08/C01/T1_TOA");
var p1 = ee.Geometry.Point([-100.91289062499999,37.07682857623016]);
//筛选2018-1-1至2018-2-1日期内,在p1范围内的影像数据,返回影像数据集
var imgCol=l8.filterDate("2018-1-1","2018-2-1").filterBounds(p1);
var img =imgCol.first();
print("image geometry:" ,img.geometry());
Map.addLayer(img,{bands:["B4","B3","B2"],MIN:0,MAX:0.3},"IMG");
Map.addLayer(img.geometry(),{color:"red"},"img_roi")
输出结果:
1.2 空间过滤filterBounds()
基础语法:
filterBounds(geometry)
filterBounds(geometry)是用于进行空间过滤的方法,这个方法的判断依据是两个适量边界是否相交即判断两个矢量数据是否有相交。但对于影像数据及和做空间过滤有些不同,首先需要声明一个集合的特殊属性--“影像数据包含本身的集合图形属性”,是影像边界或者是影像的外界矩形,属性名称通常是system:footprint,获取单张影响包含的几何图形直接使用image.geometry()。
注意:提供大型或复杂的集合作为geometry
参数可能会导致性能下降。整理集合的几何形状并不能很好地扩展;使用实现预期结果所需的最小集合(或几何)。
示例代码:
var l8 = ee.ImageCollection("LANDSAT/LC08/C01/T1_TOA");
var p1 = ee.Geometry.Point([-100.91289062499999,37.07682857623016]);
//筛选2018-1-1至2018-2-1日期内,在p1范围内的影像数据,返回影像数据集
var imgCol = l8.filterDate("2018-1-1","2018-2-1").filterBounds(p1);
var img =imgCol.first();
print("image geometry:" ,img.geometry());
Map.addLayer(img,{bands:["B4","B3","B2"],MIN:0,MAX:0.3},"IMG");
Map.addLayer(img.geometry(),{color:"red"},"img_roi")
//构造一个几何图形属性为外接矩形的影像
var b1 = img.select("B1").add(1);
Map.addLayer(b1,{min:1,max:1.3},"ndvi");
Map.addLayer(b1.geometry(),{color:"blue"},"ndvi_roi");
上述代码通过选定指定位置的landsat影像,并输出了筛选的影像的几何图形数据信息,控制台输出及运行效果如下:
//生成新的影像集合重新使用p2做过滤
var p2=ee.Geometry.Point([-101.63798828124999,38.255175928901245]);
var firImgCol = ee.ImageCollection.fromImages([img]).filterBounds(p2);
print("firImgCol", firImgCol);
var secImgCol = ee.ImageCollection.fromImages([b1]).filterBounds(p2);
print("secImgCol", secImgCol);
Map.addLayer(p1, {color:"black"}, "p1");
Map.addLayer(p2, {color:"green"}, "p2");
上述代码用来测试如果p2在img的几何图形外,但在b1的几何图形内,输出结果可以烂到firImgCol是空的,但是secImgCol是能筛选出来的:
1.3 属性过滤filterMetadata()
基础语法:
filterMetadata(name, operater, value)
该方法在实际开发时使用较少,其中name指指定的名字,也就是数据集中每一个元素对应的属性名称,通过操作operater(如equals、less_than)和给定的值做判断,过滤出符合条件的数据。在实际开发中,经常用ee.Filter.eq()\ee.Filter.lte()等形式替代。
1.4 filter
filter是最通用的方法,常用的filter操作方法如下:
方法名称 | 方法含义 | 参数 |
ee.Filter.or | 或者操作:用来合并多个filter条件,意思是只要满足其中一个条件就可以被筛选出来。 | var_args:多个filter |
ee.Filter.and | 与操作:用来合并多个filter条件,意思是必须满足所有的条件才可以被筛选出来。 | var_args:多个filter |
ee.Filter.calendarRange | 根据指定的日期格式筛选数据。 | start:开始日期 end:结束日期 field:日期格式,如year、month、hour、minute、day_of_year、day_of_month、day_of_week..... |
ee.Filter.eq | 根据属性值是否和指定的数据相等实现过滤。 | name:属性名称 value:过滤值 |
ee.Filter.lte | 根据属性值是否小于等于指定的数据实现过滤。 | name:属性名称 value:过滤值 |
ee.Filter.inList | 根据指定的属性值是否在列表中实现过滤。 | leftField:第一个集合中属性名称; rightValue:第一个集合属性过滤值; rightField:第二个集合中属性名称; leftValue:第二个集合属性过滤值; |
示例(1):
提取2015年1-3月的path44或row为34的数据:
var Col = ee.ImageCollection('LANDSAT/LC08/C01/T1_TOA');
var sCol = Col.filterDate('2014-01-01', '2014-02-01').filter(ee.Filter.or(ee.Filter.eq("WRS_PATH",44),ee.Filter.eq("WRS_ROW",34)));
print("select image collection:", sCol);
实现效果:
示例(2):
提取指定地区每年第1天到第31天的数据,也就是每年一月的数据:
import geometry;
Map.centerObject(geometry,8);
var sCol = ee.ImageCollection('LANDSAT/LC08/C01/T1_TOA').filterBounds(geometry).filter(ee.Filter.calendarRange(1,31,"day_of_year"));
print(sCol);
输出结果:
示例(3):
指定属性system:index列表,只获取此列表内的数据:
//ee.Filter.inList
var sCol = ee.ImageCollection('LANDSAT/LC08/C01/T1_TOA').filter(ee.Filter.inList({
leftField: "system:index",
rightValue:["LC08_123032_20170115","LC08_123032_20180118"]
}));
print(sCol);
输出结果:
2. 计算 ee.Reducer
在GEE中,有许多reducer可以供用户使用,具体使用方法可查看上一章笔记中3.4.3部分的内容。
下面以reducer中的group为例,统计不同类别的像素个数:
//roi选取辽宁省大连市(用户自己上传),数据使用的是2016-2017年的modis地表分类数据集合
var countries = ee.FeatureCollection("users/HM_hhxx/LNcityShp");
var roi = countries.filter(ee.Filter.eq("enName","dalian"));
Map.centerObject(countries, 7);
Map.addLayer(countries);
print(roi)
Map.addLayer(roi,{},"roi");
var bounds = roi.geometry().bounds();
var landCover = mcd12ql.filterDate("2016-1-1","2017-1-1").select("LC_Type1").first().clip(roi);
print("landCover", landCover);
//加载土地类型影像
Map.addLayer(landCover, {min:1, max:17},"landCover");
//生成新的影像并添加土地分类波段
var image = ee.Image.constant(1).addBands(landCover);
var dict = image.reduceRegion({
reducer: ee.Reducer.count().group({
groupField: 1,
groupName: "landType"
}),
geometry: roi,
scale: 500,
maxPixels: 1e13
});
print(dict)
输出结果:
分类结果影像:
3. 联合 ee.Join
在GEE中的联合(ee.join)通过利用Filter中的特殊筛选条件,提取两个不同集合中满足条件的所有元素。GEE中提供的join方法如下图所示,常用的有ee.Join.simple(),ee.Join.saveAll()。
ee.Join.simple()示例:
简单联合,返回的是一个join对象,并可以通过调用join的其他方法进行操作,例如join.apply()。
下例中,找出集合A和集合B中指定列中相同的元素,然后取出A集合中对应的所有元素,p1=1和p2=2的元素。
var primaryCol = ee.FeatureCollection([
ee.Feature(null, {p1:0, p2:"a"}),
ee.Feature(null, {p1:1, p2:"b"}),
ee.Feature(null, {p1:2, p2:"c"})
]);
var secondaryCol = ee.FeatureCollection([
ee.Feature(null, {p3:1, p2:"d"}),
ee.Feature(null, {p3:2, p2:"e"}),
ee.Feature(null, {p3:3, p2:"f"})
]);
//构建新的filter
var filter = ee.Filter.equals({
leftField:"p1",
rightField:"p3"
});
var join = ee.Join.simple();
var result = join.apply(primaryCol, secondaryCol, filter);
print("join result", result)
输出结果:
4. 循环遍历
4.1 map循环
基础语法:
fCol=fCol.map(function(feature){
....
....
})
循环操作中需要注意的内容:
1)map操作必须有返回值,不同集合的返回值不同,如featureCollection返回值是feature,imageCollection返回值是image等。
2)map操作中不要用print()方法。
3)map操作中不能使用ui.Chart、Export导出等方法。
4)不要用getInfo()来获取列表长度作为循环条件来操作for循环。
4.2 iterate循环
iterate是GEE中为了弥补map循环的缺点新增的循环方法,map循环的缺陷是只能对集合的所有元素进行循环处理,但是没有办法操作它目前具体索引或前后其他元素数据。iterate循环定义了一个初始值,然后遍历集合的具体元素,这样就可以实现初始值和这个元素的操作,最后返回相关结果重新赋值给初始值。
基础语法:iterate(algorithm,first)
(1)参数algorithm是回调方法,即每一次循环要调用的方法,格式为
function(element_data, first_data){
....
}
element_data:集合的每一个元素;
first_data:初始化定义的first数据,返回值是计算的结果并且会重新赋值给first;
(2) 参数first定义的初始化值无需是列表类型,但它最终和想要获得的结果是同一个类型值。
5. 数据导出 Export
5.1 影像数据
1. Export.image.toAsset 影像数据导出到Asset
基础语法:
Export.image.toAsset(image, description, assetId, pyramidingPolicy, dimensions, region, scale, crs, crsTransform, maxPixels)
其中参数如下:
image | 需要导出的影像 |
description | 到处任务的描述 |
assetId | 资源名称,也就是在Asset文件夹中看到的资源名称 |
pyramidingPolicy | 波段值计算公式,为对象值。计算方式包括:mean、sample、min、max、mode。这个值通常不会设置,都采用默认值。示例:{'B4':'mean'}意思是波段名称为B4的波段采用mean的方式计算 |
dimensions | 导出Image的宽和高 |
region | 导出的区域,是一个Geomtry |
scale | 分辨率,单位米,如30m |
crs | 投影信息,通常为EPSG:4326 |
crsTransform |
定义仿射变换的参数,具体参数为[xScale,xShearing,xTranslation,yShearing,yScale,yTranslation] |
maxPixels | 导出影像的最大像素个数,默认是设置”le8“,通常可以设置为”le13“防止导出时报错 |
示例:
导出B1波段的l8影像,设置描述,导出至training01/l8ImgB1-01,分辨率为30m,区域为roi范围的影像:
Export.image.toAsset({
image: l8Img.select("B1"),
description:"Asset-l8ImgB1-01",
assetId:"training01/l8ImgB1-01",
scale:30,
region:roi
});
2. Export.image.toDrive 影像数据导出到Drive
基本语法:
Export.image.toDrive(image, description, folder, fileNamePrefix, dimensions, region, scale, crs, crsTransform, maxPixels, shardSize, fileDimensions, skipEmptyTiles, fileFormat, formatOption)
image | 需要导出的影像 |
description | 到处任务的描述 |
folder | 在Assets中的文件夹名称,也就是用户自己创建的文件夹。如果不传此参数,那么导出的文件会直接放在Assets根目录下,通常都不会传此参数 |
fileNamePrefix | 导出资源的名称,如果默认的不穿,那么会直接采用description作为导出的文件的名称 |
region | 导出的区域,是一个Geomtry |
scale | 分辨率,单位米,如30m |
crs | 投影信息,通常为EPSG:4326 |
crsTransform |
定义仿射变换的参数,具体参数为[xScale,xShearing,xTranslation,yShearing,yScale,yTranslation] |
maxPixels | 导出影像的最大像素个数,通常可以设置为”le13“防止导出时报错 |
5.2 矢量数据
1. Export.table.toAsset 矢量数据导出到Asset
Export.table.toAsset(collection, description, assetId)
collection | 需要导出的矢量数据集合 |
description | 导出任务描述 |
assetId | 在GoogleAssets中资源标识名字 |
2. Export.table.toDrive 矢量数据导出到Drive
Export.table.toDrive(collection, description, folder, fileNamePrefix, fileFormat, selectors)
collection | 需要导出的矢量数据集合 |
description | 导出任务描述 |
folder | 在GoogleDrive中的文件夹名称。如果不传此参数,那么导出的文件会直接放在Google Drive根目录下。 |
fileNamePrefix | 导出的资源名称,如果默认的不传,那么会直接采用description作为导出的文件名称 |
fileFormat | 文件的格式,支持导出GeoJson、KML、KMZ、CSV、SHP、TFRecord格式,其中CSV是默认的参数 |
selectors | 筛选下载的矢量数据中包含哪些属性,默认是包含全部属性 |
5.3 视频数据
1.Export.video.toCloudStorage
Export.video.toCloudStorage(collection, description, bucket, fileNamePrefix, framesPerSecond, dimensions, region, scale, crs, crsTransform, maxPixels, maxFrames)
collection(ImageCollection) | 要导出的图像集合。 |
description(字符串,可选): | 任务的人类可读名称。默认为“myExportVideoTask”。 |
bucket(字符串,可选): | Cloud Storage 目标存储分区。 |
fileNamePrefix(字符串,可选): | 用作输出前缀的字符串。结尾的“/”表示路径。默认为描述。 |
framesPerSecond(数字,可选) | 导出视频的帧率。必须是介于 0.1 和 100 之间的值。默认为 1。 |
dimensions(数字|字符串,可选) | 用于导出图像的尺寸。将单个正整数作为最大维度或“WIDTHxHEIGHT”,其中 WIDTH 和 HEIGHT 均为正整数。 |
region(Geometry.LinearRing|Geometry.Polygon|String,可选) | 表示要导出的区域的线性环、多边形或坐标。这些可以指定为几何对象或序列化为字符串的坐标。 |
scale(数字,可选) | 以米/像素为单位的分辨率。 |
crs(字符串,可选) | 用于导出图像的 CRS。默认为谷歌地图墨卡托投影,SR-ORG:6627。 |
crsTransform(字符串,可选) | 用于导出图像的仿射变换。需要定义“crs”。 |
maxPixels(数字,可选) | 限制导出中的像素数。默认情况下,如果导出超过 1e8 像素,您将看到错误。显式设置此值允许提高或降低此限制。 |
maxFrames(数量,可选) | 设置要导出的最大帧数。默认情况下,最多可以导出 1000 帧。通过明确设置,您可以提高或降低此限制。 |
2.Export.video.toDrive
Export.video.toDrive(collection, description, folder, fileNamePrefix, framesPerSecond, dimensions, region, scale, crs, crsTransform, maxPixels, maxFrames)
collection(ImageCollection) | 要导出的图像集合。 |
description(字符串,可选) | 任务的人类可读名称。可能包含字母、数字、-、_(无空格)。默认为“myExportVideoTask”。 |
folder(字符串,可选) | 导出将驻留的 Google Drive 文件夹。注意:(a) 如果文件夹名称存在于任何级别,则将输出写入其中,(b) 如果存在重复的文件夹名称,则将输出写入最近修改的文件夹, (c) 如果文件夹名称不存在,将在根目录创建一个新文件夹,并且 (d) 带有分隔符的文件夹名称(例如 'path/to/file')被解释为文字字符串,而不是系统路径。默认为驱动器根目录。 |
fileNamePrefix(字符串,可选) | 文件名前缀。可能包含字母、数字、-、_(无空格)。默认为描述。 |
framesPerSecond(数字,可选) | 导出视频的帧率。必须是介于 0.1 和 100 之间的值。默认为 1。 |
dimensions(数字|字符串,可选) | 用于导出图像的尺寸。采用单个正整数作为最大维度或“WIDTHxHEIGHT”,其中 WIDTH 和 HEIGHT 均为正整数。 |
region(Geometry.LinearRing|Geometry.Polygon|String,可选) | 表示要导出的区域的线性环、多边形或坐标。这些可以指定为几何对象或序列化为字符串的坐标。 |
scale(数字,可选) | 以米/像素为单位的分辨率。 |
crs(字符串,可选) | 用于导出图像的 CRS。默认为谷歌地图墨卡托投影,SR-ORG:6627。 |
crsTransform(字符串,可选) | 用于导出图像的仿射变换。需要定义“crs”。 |
maxPixels(数字,可选) | 限制导出中的像素数。默认情况下,如果导出超过 1e8 像素,您将看到错误。显式设置此值允许提高或降低此限制。 |
maxFrames(数量,可选) | 设置要导出的最大帧数。默认情况下,最多可以导出 1000 帧。通过明确设置,您可以提高或降低此限制。 |
6. 图标展示 ui.Chart
在GEE中图标主要有三种类型,array数据的图表(ui.Chart.array)、feature数据图表(ui.Chart.feature)和image数据的图表(ui.Chart.image)。
6.1 ui.Chart.array.values
ui.Chart.array.values(array, axis, xLabels)
array:要展示的数据列表;
axis:要以哪个轴为方向展示列表,默认为0;
xLabels:要展示的数据对应的自变量数据列表;
6.2 ui.Chart.feature
ui.Chart.geature.byProperty(features, xProperties, seriesProperty)
features:要做统计的矢量数据;
xPropertes:要做统计的矢量数据属性;
seriesProperty:对应统计属性的标签列表,默认使用的是system:index;
6.3 ui.Chart.image
通过影像生成图表的方式有很多,常用的有生成一个影像集合每年内每一天的变化图表、生成直方图统计图表等。