目录
1. Raster to Vector Conversion:image.reduceToVectors()
将Image的栅格格式转换为FeatureCollection的矢量格式
// Reducers: Image.reduceToVectors()
// China boundary.
var china = countries.filter(ee.Filter.eq('ADM0_NAME', 'China'))
// Input 2012 nightlights image, clipped to China border
var nl2012 = ee.Image('NOAA/DMSP-OLS/NIGHTTIME_LIGHTS/F182012')
.select('stable_lights')
.clip(china);
// Arbitrary thresholds on the 6-bit nightlights image
var zones = nl2012.gt(30).add(nl2012.gt(55)).add(nl2012.gt(62));
zones = zones.mask(zones.neq(0));
// Convert zones of the thresholded nightlights to vectors
var vectors = zones.addBands(nl2012).reduceToVectors({
geometry: china,
crs: nl2012.projection(),
scale: nl2012.projection().nominalScale(),
geometryType: 'polygon',
eightConnected: false,
labelProperty: 'zone',
reducer: ee.Reducer.mean(),
// timeout done
maxPixels: 1e10,
tileScale: 2
});
// Display the result
Map.setCenter(117.6225, 39.712, 9);
Map.addLayer(zones, {min: 1, max: 3, palette: ['0000FF', '00FF00', 'FF0000']}, 'raster');
var display = ee.Image(0).mask(ee.Image(0)).paint(vectors, '000000', 3);
Map.addLayer(display, {palette: '000000'}, 'vectors');
2. Vector to Raster Conversion:featureCollection.reduceToImage()
// Reducers: FeatureCollection.reduceToImage()
var tiger = ee.FeatureCollection("TIGER/2010/Blocks");
Map.addLayer(tiger, {}, 'tiger')
var popImage = tiger.reduceToImage({
properties: ['pop10'],
reducer: ee.Reducer.first()
});
Map.addLayer(popImage, {min: 0, max: 1000, palette: ['blue', 'green', 'red']}, 'popImage');
3. Grouped reductions
对图像的属性归为一个组,以组的形式进行显示,并且将属性按照州编码就行归类,显示每个州的总属性。
// To compute the total population and number of housing units in each state,
// this example groups the output of a reduction of a census block FeatureCollection.
// Load a collection of US census blocks.
var blocks = ee.FeatureCollection('TIGER/2010/Blocks');
// Compute sums of the specified properties, grouped by state code.
var sums = blocks
.filter(ee.Filter.and(
ee.Filter.neq('pop10', null),
ee.Filter.neq('housing10', null)))
.reduceColumns({
selectors: ['pop10', 'housing10', 'statefp10'],
reducer: ee.Reducer.sum().repeat(2).group({
groupField: 2,
groupName: 'state-code',
})
});
// Print the resultant Dictionary.
print(sums);
结果展示:
3.1 Grouped reduceRegions (aka Zonal Statistics)
通过使用 reducer.group() 按指定输入的值对 reducer 的输出进行分组,可以获得 Image 或 FeatureCollection 的每个区域中的统计信息。
要对 image.reduceRegions() 的输出进行分组,可以指定一个按整数像素值定义分组的分组带。
这种类型的计算有时称为 “区域统计” ,其中区域被指定为分组带,统计信息由Reducer确定。
// Reducers: Grouping, land cover
var mcd12q1 = ee.ImageCollection("MODIS/006/MCD12Q1"),
dmspols = ee.ImageCollection("NOAA/DMSP-OLS/NIGHTTIME_LIGHTS"),
geometry =
/* color: #d63000 */
/* displayProperties: [
{
"type": "rectangle"
}
] */
ee.Geometry.Polygon(
[[[-125.08281249999999, 48.998022477518326],
[-125.08281249999999, 24.871185409749824],
[-61.71367187499999, 24.871185409749824],
[-61.71367187499999, 48.998022477518326]]], null, false);
// MODIS land cover categories in 2020.
var landcover = mcd12q1.filterDate('2020').first()
.select('LC_Type1'); // IGBP
// Nightlights imagery inputs
var nl2001 = dmspols.filterDate('2001').first().select('stable_lights')
var nl2012 = dmspols.filterDate('2012').first().select('stable_lights')
// Compute the nightlights decadal difference, add land cover codes.
var nlDiff = nl2012.subtract(nl2001).addBands(landcover);
// Grouped mean: change of nightlights by land cover category.
print(nlDiff.reduceRegion({
reducer: ee.Reducer.mean().group({
groupField: 1,
groupName: 'code',
}),
geometry: geometry,
scale: 1000,
maxPixels: 1e8
}));
结果展示:
4. Weighted Reductions
默认情况下,应用于图像的Reducer根据掩码值对输入进行加权。这与通过clip()等操作创建的分数像素有关。通过在Reducer上调用 unweighted() 来调整这种行为。使用未加权的Reducer将强制该区域中的所有像素具有相同的权重。
var weighted = image
.reduceRegion({
reducer: ee.Reducer.mean(),
geometry: geometry,
scale: 30
}).get('nd');
var unweighted = image
.reduceRegion({
reducer: ee.Reducer.mean().unweighted(),
geometry: geometry,
scale: 30
}).get('nd');
例子:
var l8sr = ee.ImageCollection("LANDSAT/LC08/C02/T1_L2");
// Create an arbitrary region.
var geometry = ee.Geometry.Rectangle(-122.496, 37.532, -121.554, 37.538);
Map.centerObject(geometry)
Map.addLayer(geometry)
// Load a Landsat 8 input image.
var image = l8sr.filterBounds(geometry).first()
// Make an NDWI image. It will have one band named 'nd'.
var ndwi = image.normalizedDifference(['SR_B3', 'SR_B5']);
// Compute the weighted mean of the NDWI image.
var weighted = ndwi
.reduceRegion({
reducer: ee.Reducer.mean(),
geometry: geometry,
scale: 30})
.get('nd');
// Compute the UN-weighted mean of the NDWI image.
var unweighted = ndwi
.reduceRegion({
reducer: ee.Reducer.mean().unweighted(),
geometry: geometry,
scale: 30})
.get('nd');
// Observe the difference between weighted and unweighted reductions.
print('weighted:', weighted);
print('unweighted:', unweighted);
weighted:
-0.21169499738972458
unweighted:
-0.21157474937536905
IDW:
// Mock up a feature collection.
var fc = ee.FeatureCollection([
ee.Feature(ee.Geometry.Point([110.14444050980546, 28.774132610921978])),
ee.Feature(ee.Geometry.Point([112.93496785355546, 28.23347679807143])),
ee.Feature(ee.Geometry.Point([111.26504597855546, 29.235334712701505])),
ee.Feature(ee.Geometry.Point([111.44082722855546, 27.378325472980837])),
ee.Feature(ee.Geometry.Point([113.19863972855546, 27.884456252339465])),
ee.Feature(ee.Geometry.Point( [113.72598347855546, 28.484840062759634]))
]);
// Set maximum distance to consider.
var maxDist = 1e4; // Meters
// Calculate pixel distance to nearest point.
var distance = fc.distance({searchRadius: maxDist, maxError: 10});
// Convert distance to linear weight between 0 and 1.
var weight = distance.subtract(maxDist).abs().divide(maxDist);
// Display the distance and weight images.
Map.centerObject(fc, 9);
Map.addLayer(distance, {min:0, max: maxDist}, 'Meters');
Map.addLayer(fc, {min:0, max: 1}, 'Weight');
Map.addLayer(fc, {color: 'red'}, 'Points');
结果展示: