GEE开发

持续更新

基础

初始步骤

Once Earth Engine is authenticated, you can run the following script to initialize Earth Engine for a new Python session. In general, you will need to initialize Earth Engine for each new Python session, i.e., whenever you open a Jupyter notebook or Python script and want to use Earth Engine. Fortunately, geemap can automatically initialize Earth Engine for you when creating an interactive map, which will be covered in the next chapter. In other words, you rarely need to run ee.Initialize() explicitly.

开始使用的必须步骤,运行以下代码

import ee
ee.Authenticate()
ee.Initialize()

# 当运行以下代码时能正常生成地图则环境配置基本成功
import geemap
# 本地运行配置代理端口
# geemap.set_proxy(port='7890')
Map=geemap.Map()
Map

band math or map algebra

convert an aspect image to radians, then call sin() on it.

// Load the SRTM image.
var srtm = ee.Image('CGIAR/SRTM90_V4');

// Get the aspect (in degrees).
var aspect = ee.Terrain.aspect(srtm);

// Convert to radians, compute the sin of the aspect.将 aspect 除以 180,乘以 π,最后取 sin
var sinImage = aspect.divide(180).multiply(Math.PI).sin();

// Display the result.
Map.addLayer(sinImage, {min: -1, max: 1}, 'sin');

可以手动画 polygon 作为导入变量参与计算。reduceRegion() 方法

// Compute the mean elevation in the polygon.
var meanDict = srtm.reduceRegion({
  reducer: ee.Reducer.mean(),
  geometry: polygon,
  scale: 90
});

// Get the mean from the dictionary and print it.
var mean = meanDict.get('elevation');
print('Mean elevation', mean);

参数:reduceRegion() 是一种可用于 Image 对象的方法(learn more about reducing regions here)。其次,方法参数在作为单个参数传递的 JavaScript 对象中提供。 (具体来说,对象的键是方法参数的名称。值是方法的参数)。第三,reducer 参数指定要计算的统计类型,geometry 参数指定计算统计的区域。比例参数是要使用的以米为单位的像素大小。为避免歧义,您在进行缩减时应始终指定比例,因为 Earth Engine 可能无法根据输入自动确定适当的比例(scale)。(Learn more about scale in Earth Engine)

返回值:reduceRegion() 的返回值是一个字典,其中键是波段名称,值是波段的像素统计信息。字典上的 get() 方法返回与作为参数提供的键对应的值。在本例中,srtm 图像有一个波段“海拔(elevation)”,因此示例代码从字典中获取该统计数据并打印出来。

参与计算的区域像元数量超过 maxPixels 时会报错,可以通过在给定参数对象中添加 bestEffort: true 字段或者把 maxPixels 字段值设定为更大的值。

mosaic

遥感影像镶嵌,当将一个 image collection 添加到 Map 时会隐式调用 mosaic。

when you add a collection to the map, Earth Engine implicitly calls mosaic() on it

分辨率(scale)

未主动设置分辨率时,自动为图像原始分辨率,可通过以下查看

var scale = srtm.projection().nominalScale();
print('SRTM scale in meters', scale);

取比原图像分辨率更小的值会自动重采样(happily),更大则尝试从聚合源中获取数据(从图像金字塔数据的更高级别)。Learn more about how Earth Engine handles scale in this doc.

reducer

将 collection 添加到地图时,会默认采用最近的值(selecting the most recent pixel - the one from the latest image in the stack)。使用中值reducer时,可以去除云(具有高值)和阴影(具有低值)

// Get the median over time, in each band, in each pixel.
var median = l8.filterDate('2016-01-01', '2016-12-31').median();

// Make a handy variable of visualization parameters.
var visParams = {bands: ['B4', 'B3', 'B2'], max: 0.3};

// Display the median composite.
Map.addLayer(median, visParams, 'median');

masking

// Load or import the Hansen et al. forest change dataset.
var hansenImage = ee.Image('UMD/hansen/global_forest_change_2015');

// Select the land/water mask.
var datamask = hansenImage.select('datamask');

// Create a binary mask.
var mask = datamask.eq(1);

// Update the composite mask with the water mask.
var maskedComposite = median.updateMask(mask);
Map.addLayer(maskedComposite, visParams, 'masked');

global_forest_change_2015数据中,水体数据值为2,土地为1,no data为0,

select()选择指定 band

eq(1)

Usage Returns
Image.eq(image2) Image

注意

print函数不能一次打印超过 5000 件东西

JavaScript API vs. Python API

Earth Engine JavaScript Code Editor
● Rich documentation and tutorials
● Easy to get started
● Built-in interactive mapping functionality
● Built-in authentication
● Earth Engine Apps
● Can’t install additional package

Earth Engine Python API
● Limited documentation and tutorials
● Easier language syntax
● Easy to share code between scripts
● Batch processing (e.g., exporting images)
● More IDEs with debugging capability
● Numerous Python packages
● Many plotting and visualization options
● Integration with open-source GIS
● Accessing data stored locally
● Deep learning

js API

好像并不支持es6,那么也没有块作用域,只有函数作用域

// Instantiate an image with the Image constructor.
// 实例化一个Image对象
var image = ee.Image('CGIAR/SRTM90_V4');

// Zoom to a location.
// longitude经度 latitude纬度 放大级别
Map.setCenter(-112.8598, 36.2841, 9); // Center on the Grand Canyon.

// Display the image on the map.
Map.addLayer(image);

内置对象

Feature

A Feature in Earth Engine is defined as a GeoJSON Feature. Specifically, a Feature is an object with a geometry property storing a Geometry object (or null) and a properties property storing a dictionary of other properties.

两个属性:geometry 储存一个Geometry 对象,properties 储存一个字典-对应其它属性

Geometry

& GeometryCollection对象

没看到对GeometryCollection对象的操作,只有单个Geometry

Image对象

Image对象一般含有多个波段(band),每个波段都有其名称、像素值、空间分辨率和投影信息。例如:SRTM 图像有一个波段“海拔(elevation)”。

Image Collections

一系列image的集合。An image collection refers to a set of Earth Engine images

var l8 = ee.ImageCollection('LANDSAT/LC08/C01/T1_TOA');
filter
// 过滤得到与point相交(intersect)的图像
var spatialFiltered = l8.filterBounds(point);
print('spatialFiltered', spatialFiltered);

// 添加第二个过滤器以将集合限制为仅包含(acquired) 2015 年获取的图像
var temporalFiltered = spatialFiltered.filterDate('2015-01-01', '2015-12-31');
print('temporalFiltered', temporalFiltered);

filterBounds() 的参数是数字化的点,filterDate() 的参数是两个日期,表示为字符串。均为 filter() 方法的快捷方法

获取单个图像进行分析的另一种更具编程性的方法是对集合进行排序,以获得与某些元数据属性相关的最新、最旧或最佳图像。例如,通过检查打印图像集合中的图像对象,您可能已经观察到一个名为 CLOUD_COVER 的元数据属性。您可以使用该属性在您感兴趣的区域获得 2015 年最少云的图像:

// This will sort from least to most cloudy.
var sorted = temporalFiltered.sort('CLOUD_COVER');

// Get the first (least cloudy) image.
var scene = sorted.first();

通过 band 字段指定rgb对应波段

var visParams = {bands: ['B4', 'B3', 'B2'], max: 0.3};
Map.addLayer(scene, visParams, 'true-color composite');

Displaying image collections,和display image对象类似,每一块显示与当前时间最近的 image

var l8 = ee.ImageCollection('LANDSAT/LC08/C01/T1_TOA');
var landsat2016 = l8.filterDate('2016-01-01', '2016-12-31');
Map.addLayer(landsat2016, visParams, 'l8 collection');

方法

Map.addLayer()

当您使用 Map.addLayer() 将图像添加到地图时,Earth Engine 需要确定如何将图像波段中的值映射到显示器上的颜色。

如果将单波段图像添加到地图,默认情况下 Earth Engine 会以灰度显示波段,其中最小值分配给黑色,最大值分配给白色。如果您不指定最小值和最大值,Earth Engine 将使用默认值。例如,您刚刚添加到地图的图像显示为拉伸到数据全范围的灰度图像,或者说带符号的 16 位整数 [-32768, 32767]。 (默认情况下,浮点值波段被拉伸到 [0, 1],8bit值波段被拉伸到 [0, 255])。

第二个参数 visParams 允许指定要显示的最小值和最大值,是一个对象。第三个参数: the name of the layer that is displayed in the Layer manager,在图层中显示的名称

Map.addLayer(image, {min: 0, max: 3000}, 'custom visualization');

还可以在对象参数中增加调色板参数

调色板是一个逗号分隔的颜色字符串列表,这些颜色字符串在可视化参数的最大值和最小值之间线性插值(或根据波段类型的默认值,如前所述)。例如,小于或等于最小值的像素将以列表中的第一种颜色显示;大于或等于最大值的像素将以列表中的最后一种颜色显示。中间颜色被线性拉伸到中间像素值。

Map.addLayer(image, {min: 0, max: 3000, palette: ['blue', 'green', 'red']},
    'custom palette');

ee.Image.reduceRegion

Usage Returns
Image.reduceRegion(reducer, geometry, scale,crs, crsTransform, bestEffort, maxPixels, tileScale) Dictionary

ee.Terrain.aspect

从地形 DEM 计算坡向(以度为单位)

Usage Returns
ee.Terrain.aspect(input) Image
Argument Type Details
input Image An elevation image, in meters.

ee.Terrain.slope

从地形 DEM 计算坡度(以度为单位)

计算坡度ee.Terrain.slope(input)

Usage Returns
ee.Terrain.slope(input) Image
Argument Type Details
input Image An elevation image, in meters.
// Load the SRTM image.
var srtm = ee.Image('CGIAR/SRTM90_V4');

// Apply an algorithm to an image.
var slope = ee.Terrain.slope(srtm);

// Display the result.
Map.setCenter(-112.8598, 36.2841, 9); // Center on the Grand Canyon.
Map.addLayer(slope, {min: 0, max :60}, 'slope');

print

Console tab 打印 image 的元数据信息

print('SRTM image', image);

python API

colab

初始操作

pip install geemap

After geemap has been installed successfully, click the RESTART RUNTIME button appearing at the end of the installation log or click on the menu Runtime > Restart runtime. Then type the following code in a new cell:

import geemap

Map = geemap.Map()
Map

方法

geojson转入gee中,转换为FeatureCollection

in_geojson = (
    'https://github.com/giswqs/geemap/blob/master/examples/data/countries.geojson'
)
Map = geemap.Map()
fc = geemap.geojson_to_ee(in_geojson)
Map.addLayer(fc.style(**{'color': 'ff0000', 'fillColor': '00000000'}), {}, 'Countries')
Map

url

url = "https://github.com/giswqs/geemap/blob/master/examples/data/countries.zip"
geemap.download_file(url)

shp

in_shp = "countries.shp"
fc = geemap.shp_to_ee(in_shp)

csv

import geopandas as gpd

gdf = gpd.read_file(in_shp)
fc = geemap.gdf_to_ee(gdf)

vector

fc = geemap.vector_to_ee(url)