公告:所有在
2025 年 4 月 15 日之前注册使用 Earth Engine 的非商业项目都必须
验证是否符合非商业性质的资格条件,才能继续使用 Earth Engine。
数组排序和缩减
使用集合让一切井井有条
根据您的偏好保存内容并对其进行分类。
数组排序对于获取自定义质量拼接图非常有用,这涉及根据其他波段中的值缩减部分图像波段。以下示例按 NDVI 排序,然后获取集合中 NDVI 值最高的部分观测值的平均值:
Code Editor (JavaScript)
// Define a function that scales and masks Landsat 8 surface reflectance images
// and adds an NDVI band.
function prepSrL8(image) {
// Develop masks for unwanted pixels (fill, cloud, cloud shadow).
var qaMask = image.select('QA_PIXEL').bitwiseAnd(parseInt('11111', 2)).eq(0);
var saturationMask = image.select('QA_RADSAT').eq(0);
// Apply the scaling factors to the appropriate bands.
var opticalBands = image.select('SR_B.').multiply(0.0000275).add(-0.2);
var thermalBands = image.select('ST_B.*').multiply(0.00341802).add(149.0);
// Calculate NDVI.
var ndvi = opticalBands.normalizedDifference(['SR_B5', 'SR_B4'])
.rename('NDVI');
// Replace original bands with scaled bands, add NDVI band, and apply masks.
return image.addBands(opticalBands, null, true)
.addBands(thermalBands, null, true)
.addBands(ndvi)
.updateMask(qaMask)
.updateMask(saturationMask);
}
// Define an arbitrary region of interest as a point.
var roi = ee.Geometry.Point(-122.26032, 37.87187);
// Load a Landsat 8 surface reflectance collection.
var collection = ee.ImageCollection('LANDSAT/LC08/C02/T1_L2')
// Filter to get only imagery at a point of interest.
.filterBounds(roi)
// Filter to get only six months of data.
.filterDate('2021-01-01', '2021-07-01')
// Prepare images by mapping the prepSrL8 function over the collection.
.map(prepSrL8)
// Select the bands of interest to avoid taking up unneeded memory.
.select('SR_B.|NDVI');
// Convert the collection to an array.
var array = collection.toArray();
// Label of the axes.
var imageAxis = 0;
var bandAxis = 1;
// Get the NDVI slice and the bands of interest.
var bandNames = collection.first().bandNames();
var bands = array.arraySlice(bandAxis, 0, bandNames.length());
var ndvi = array.arraySlice(bandAxis, -1);
// Sort by descending NDVI.
var sorted = bands.arraySort(ndvi.multiply(-1));
// Get the highest 20% NDVI observations per pixel.
var numImages = sorted.arrayLength(imageAxis).multiply(0.2).int();
var highestNdvi = sorted.arraySlice(imageAxis, 0, numImages);
// Get the mean of the highest 20% NDVI observations by reducing
// along the image axis.
var mean = highestNdvi.arrayReduce({
reducer: ee.Reducer.mean(),
axes: [imageAxis]
});
// Turn the reduced array image into a multi-band image for display.
var meanImage = mean.arrayProject([bandAxis]).arrayFlatten([bandNames]);
Map.centerObject(roi, 12);
Map.addLayer(meanImage, {bands: ['SR_B6', 'SR_B5', 'SR_B4'], min: 0, max: 0.4});
Python 设置
如需了解 Python API 以及如何使用 geemap
进行交互式开发,请参阅
Python 环境页面。
import ee
import geemap.core as geemap
Colab (Python)
# Define a function that scales and masks Landsat 8 surface reflectance images
# and adds an NDVI band.
def prep_sr_l8(image):
# Develop masks for unwanted pixels (fill, cloud, cloud shadow).
qa_mask = image.select('QA_PIXEL').bitwiseAnd(int('11111', 2)).eq(0)
saturation_mask = image.select('QA_RADSAT').eq(0)
# Apply the scaling factors to the appropriate bands.
optical_bands = image.select('SR_B.').multiply(0.0000275).add(-0.2)
thermal_bands = image.select('ST_B.*').multiply(0.00341802).add(149.0)
# Calculate NDVI.
ndvi = optical_bands.normalizedDifference(['SR_B5', 'SR_B4']).rename('NDVI')
# Replace the original bands with the scaled ones and apply the masks.
return (
image.addBands(optical_bands, None, True)
.addBands(thermal_bands, None, True)
.addBands(ndvi)
.updateMask(qa_mask)
.updateMask(saturation_mask)
)
# Define an arbitrary region of interest as a point.
roi = ee.Geometry.Point(-122.26032, 37.87187)
# Load a Landsat 8 surface reflectance collection.
collection = (
ee.ImageCollection('LANDSAT/LC08/C02/T1_L2')
# Filter to get only imagery at a point of interest.
.filterBounds(roi)
# Filter to get only six months of data.
.filterDate('2021-01-01', '2021-07-01')
# Prepare images by mapping the prep_sr_l8 function over the collection.
.map(prep_sr_l8)
# Select the bands of interest to avoid taking up unneeded memory.
.select('SR_B.|NDVI')
)
# Convert the collection to an array.
array = collection.toArray()
# Label of the axes.
image_axis = 0
band_axis = 1
# Get the NDVI slice and the bands of interest.
band_names = collection.first().bandNames()
bands = array.arraySlice(band_axis, 0, band_names.length())
ndvi = array.arraySlice(band_axis, -1)
# Sort by descending NDVI.
sorted = bands.arraySort(ndvi.multiply(-1))
# Get the highest 20% NDVI observations per pixel.
num_images = sorted.arrayLength(image_axis).multiply(0.2).int()
highest_ndvi = sorted.arraySlice(image_axis, 0, num_images)
# Get the mean of the highest 20% NDVI observations by reducing
# along the image axis.
mean = highest_ndvi.arrayReduce(reducer=ee.Reducer.mean(), axes=[image_axis])
# Turn the reduced array image into a multi-band image for display.
mean_image = mean.arrayProject([band_axis]).arrayFlatten([band_names])
m = geemap.Map()
m.center_object(roi, 12)
m.add_layer(
mean_image, {'bands': ['SR_B6', 'SR_B5', 'SR_B4'], 'min': 0, 'max': 0.4}
)
m
与线性建模示例中一样,沿波段轴使用 arraySlice()
将感兴趣的波段与排序索引 (NDVI) 分隔开来。然后,使用 arraySort()
按排序索引对感兴趣的频段进行排序。将像素按 NDVI 值从高到低排序后,沿 imageAxis
使用 arraySlice()
即可获取 NDVI 值最高的 20% 像素。最后,使用平均值 reducer 沿 imageAxis
应用 arrayReduce()
,以获取最高 NDVI 像素的平均值。最后一步是将阵列图像转换回多波段图像以进行显示。
如未另行说明,那么本页面中的内容已根据知识共享署名 4.0 许可获得了许可,并且代码示例已根据 Apache 2.0 许可获得了许可。有关详情,请参阅 Google 开发者网站政策。Java 是 Oracle 和/或其关联公司的注册商标。
最后更新时间 (UTC):2025-07-25。
[null,null,["最后更新时间 (UTC):2025-07-25。"],[[["\u003cp\u003eThis example demonstrates using array sorting to calculate the mean of the top 20% of Landsat 8 images with the highest NDVI values within a specific region and timeframe.\u003c/p\u003e\n"],["\u003cp\u003eThe process involves preparing the Landsat 8 collection by scaling, masking, and adding an NDVI band.\u003c/p\u003e\n"],["\u003cp\u003eImage pixels are sorted based on NDVI values using \u003ccode\u003earraySort()\u003c/code\u003e, allowing selection of the highest values using \u003ccode\u003earraySlice()\u003c/code\u003e.\u003c/p\u003e\n"],["\u003cp\u003eThe \u003ccode\u003earrayReduce()\u003c/code\u003e function is applied to calculate the mean of the selected pixels, resulting in a composite image representing the desired values.\u003c/p\u003e\n"],["\u003cp\u003eThe final output is a multi-band image displaying the mean values for the selected bands (SR_B6, SR_B5, SR_B4) of the highest NDVI pixels.\u003c/p\u003e\n"]]],["The process involves sorting Landsat 8 images by NDVI to create a custom mosaic. First, a function prepares images by scaling, masking, and calculating NDVI. Then, a collection of images is filtered by location and date range, transformed into an array, and sorted by descending NDVI values. The top 20% of NDVI observations are isolated. Finally, the mean of these top observations is calculated and transformed into a multi-band image for display.\n"],null,["# Array Sorting and Reducing\n\nArray sorting is useful for obtaining custom quality mosaics which involve reducing a\nsubset of image bands according to the values in a different band. The following example\nsorts by NDVI, then gets the mean of a subset of observations in the collection with the\nhighest NDVI values:\n\n### Code Editor (JavaScript)\n\n```javascript\n// Define a function that scales and masks Landsat 8 surface reflectance images\n// and adds an NDVI band.\nfunction prepSrL8(image) {\n // Develop masks for unwanted pixels (fill, cloud, cloud shadow).\n var qaMask = image.select('QA_PIXEL').bitwiseAnd(parseInt('11111', 2)).eq(0);\n var saturationMask = image.select('QA_RADSAT').eq(0);\n\n // Apply the scaling factors to the appropriate bands.\n var opticalBands = image.select('SR_B.').multiply(0.0000275).add(-0.2);\n var thermalBands = image.select('ST_B.*').multiply(0.00341802).add(149.0);\n\n // Calculate NDVI.\n var ndvi = opticalBands.normalizedDifference(['SR_B5', 'SR_B4'])\n .rename('NDVI');\n\n // Replace original bands with scaled bands, add NDVI band, and apply masks.\n return image.addBands(opticalBands, null, true)\n .addBands(thermalBands, null, true)\n .addBands(ndvi)\n .updateMask(qaMask)\n .updateMask(saturationMask);\n}\n\n// Define an arbitrary region of interest as a point.\nvar roi = ee.Geometry.Point(-122.26032, 37.87187);\n\n// Load a Landsat 8 surface reflectance collection.\nvar collection = ee.ImageCollection('LANDSAT/LC08/C02/T1_L2')\n // Filter to get only imagery at a point of interest.\n .filterBounds(roi)\n // Filter to get only six months of data.\n .filterDate('2021-01-01', '2021-07-01')\n // Prepare images by mapping the prepSrL8 function over the collection.\n .map(prepSrL8)\n // Select the bands of interest to avoid taking up unneeded memory.\n .select('SR_B.|NDVI');\n\n// Convert the collection to an array.\nvar array = collection.toArray();\n\n// Label of the axes.\nvar imageAxis = 0;\nvar bandAxis = 1;\n\n// Get the NDVI slice and the bands of interest.\nvar bandNames = collection.first().bandNames();\nvar bands = array.arraySlice(bandAxis, 0, bandNames.length());\nvar ndvi = array.arraySlice(bandAxis, -1);\n\n// Sort by descending NDVI.\nvar sorted = bands.arraySort(ndvi.multiply(-1));\n\n// Get the highest 20% NDVI observations per pixel.\nvar numImages = sorted.arrayLength(imageAxis).multiply(0.2).int();\nvar highestNdvi = sorted.arraySlice(imageAxis, 0, numImages);\n\n// Get the mean of the highest 20% NDVI observations by reducing\n// along the image axis.\nvar mean = highestNdvi.arrayReduce({\n reducer: ee.Reducer.mean(),\n axes: [imageAxis]\n});\n\n// Turn the reduced array image into a multi-band image for display.\nvar meanImage = mean.arrayProject([bandAxis]).arrayFlatten([bandNames]);\nMap.centerObject(roi, 12);\nMap.addLayer(meanImage, {bands: ['SR_B6', 'SR_B5', 'SR_B4'], min: 0, max: 0.4});\n```\nPython setup\n\nSee the [Python Environment](/earth-engine/guides/python_install) page for information on the Python API and using\n`geemap` for interactive development. \n\n```python\nimport ee\nimport geemap.core as geemap\n```\n\n### Colab (Python)\n\n```python\n# Define a function that scales and masks Landsat 8 surface reflectance images\n# and adds an NDVI band.\ndef prep_sr_l8(image):\n # Develop masks for unwanted pixels (fill, cloud, cloud shadow).\n qa_mask = image.select('QA_PIXEL').bitwiseAnd(int('11111', 2)).eq(0)\n saturation_mask = image.select('QA_RADSAT').eq(0)\n\n # Apply the scaling factors to the appropriate bands.\n optical_bands = image.select('SR_B.').multiply(0.0000275).add(-0.2)\n thermal_bands = image.select('ST_B.*').multiply(0.00341802).add(149.0)\n\n # Calculate NDVI.\n ndvi = optical_bands.normalizedDifference(['SR_B5', 'SR_B4']).rename('NDVI')\n\n # Replace the original bands with the scaled ones and apply the masks.\n return (\n image.addBands(optical_bands, None, True)\n .addBands(thermal_bands, None, True)\n .addBands(ndvi)\n .updateMask(qa_mask)\n .updateMask(saturation_mask)\n )\n\n\n# Define an arbitrary region of interest as a point.\nroi = ee.Geometry.Point(-122.26032, 37.87187)\n\n# Load a Landsat 8 surface reflectance collection.\ncollection = (\n ee.ImageCollection('LANDSAT/LC08/C02/T1_L2')\n # Filter to get only imagery at a point of interest.\n .filterBounds(roi)\n # Filter to get only six months of data.\n .filterDate('2021-01-01', '2021-07-01')\n # Prepare images by mapping the prep_sr_l8 function over the collection.\n .map(prep_sr_l8)\n # Select the bands of interest to avoid taking up unneeded memory.\n .select('SR_B.|NDVI')\n)\n\n# Convert the collection to an array.\narray = collection.toArray()\n\n# Label of the axes.\nimage_axis = 0\nband_axis = 1\n\n# Get the NDVI slice and the bands of interest.\nband_names = collection.first().bandNames()\nbands = array.arraySlice(band_axis, 0, band_names.length())\nndvi = array.arraySlice(band_axis, -1)\n\n# Sort by descending NDVI.\nsorted = bands.arraySort(ndvi.multiply(-1))\n\n# Get the highest 20% NDVI observations per pixel.\nnum_images = sorted.arrayLength(image_axis).multiply(0.2).int()\nhighest_ndvi = sorted.arraySlice(image_axis, 0, num_images)\n\n# Get the mean of the highest 20% NDVI observations by reducing\n# along the image axis.\nmean = highest_ndvi.arrayReduce(reducer=ee.Reducer.mean(), axes=[image_axis])\n\n# Turn the reduced array image into a multi-band image for display.\nmean_image = mean.arrayProject([band_axis]).arrayFlatten([band_names])\nm = geemap.Map()\nm.center_object(roi, 12)\nm.add_layer(\n mean_image, {'bands': ['SR_B6', 'SR_B5', 'SR_B4'], 'min': 0, 'max': 0.4}\n)\nm\n```\n\nAs in the linear modeling example, separate the bands of interest from the sort index (NDVI)\nusing `arraySlice()` along the band axis. Then sort the bands of interest by\nsort index using `arraySort()`. After the pixels have been sorted by\ndescending NDVI, use `arraySlice()` along the `imageAxis` to\nget 20% of the highest NDVI pixels. Lastly, apply `arrayReduce()` along the\n`imageAxis` with a mean reducer to get the mean of the highest NDVI\npixels. The final step converts the array image back to a multi-band image for display."]]