在Earth Engine python脚本中获取结果

时间:2017-12-04 12:11:17

标签: python google-earth-engine

我试图通过地球引擎python API在功能集合中的每个多边形中获得NDVI均值。 我认为我成功获得了结果(功能集合中的功能集合),但后来我不知道如何从中获取数据。 我想要的数据是来自功能的ID和每个功能中的ndvi均值。

import datetime
import ee
ee.Initialize()

#Feature collection
fc = ee.FeatureCollection("ft:1s57dkY_Sg_E_COTe3sy1tIR_U-5Gw-BQNwHh4Xel");
fc_filtered = fc.filter(ee.Filter.equals('NUM_DECS', 1))
#Image collection
Sentinel_collection1 = (ee.ImageCollection('COPERNICUS/S2')).filterBounds(fc_filtered)
Sentinel_collection2 = Sentinel_collection1.filterDate(datetime.datetime(2017, 1, 1),datetime.datetime(2017, 8, 1))


# NDVI function to use with ee map
def NDVIcalc (image):
  red = image.select('B4')
  nir = image.select('B8')
  ndvi = nir.subtract(red).divide(nir.add(red)).rename('NDVI')

  #NDVI mean calculation with reduceRegions
  MeansFeatures = ndvi.reduceRegions(reducer= ee.Reducer.mean(),collection= fc_filtered,scale= 10)

  return (MeansFeatures)

#Result that I don't know to get the information: Features ID and NDVI mean
result = Sentinel_collection2.map(NDVIcalc)

1 个答案:

答案 0 :(得分:2)

如果结果很小,则使用result.getInfo()将它们拉入python。这将为您提供一个python字典,其中包含FeatureCollection列表(更多字典)。但是,如果结果很大或多边形覆盖大区域,则您必须改为导出集合。

那就是说,你可能会先做一些其他的事情:

1)您可能想要展平()集合,因此它不是嵌套集合。它会更容易处理。

2)您可能希望为每个结果添加日期,以便知道结果的来源。您可以使用NDVIcalc函数内的结果上的映射

return MeansFeatures.map(lambda f : f.set('date', image.date().format())

3)如果您真正想要的是每个多边形(最常见)的NDVI随时间变化的时间序列,那么首先重构您的代码以便在多边形上进行映射会更容易:

Sentinel_collection = (ee.ImageCollection('COPERNICUS/S2')
    .filterBounds(fc_filtered)
    .filterDate(ee.Date('2017-01-01'),ee.Date('2017-08-01')))

def GetSeries(feature):
  def NDVIcalc(img):
    red = img.select('B4')
    nir = img.select('B8')
    ndvi = nir.subtract(red).divide(nir.add(red)).rename(['NDVI'])
    return (feature
            .set(ndvi.reduceRegion(ee.Reducer.mean(), feature.geometry(), 10))
            .set('date', img.date().format("YYYYMMdd")))

  series = Sentinel_collection.map(NDVIcalc)
  // Get the time-series of values as two lists.
  list = series.reduceColumns(ee.Reducer.toList(2), ['date', 'NDVI']).get('list')
  return feature.set(ee.Dictionary(ee.List(list).flatten()))

result = fc_filtered.map(GetSeries)
print(result.getInfo())

4)最后,如果您要尝试导出结果,您可能会遇到一个问题,即从第一个功能所具有的任何列中选择导出表的列,所以提供一个"标题"具有所有列(时间)的功能,您可以将(&)与结果合并为第一个功能:

# Get all possible dates.
dates = ee.List(Sentinel_collection.map(function(img) {
      return ee.Feature(null, {'date': img.date().format("YYYYMMdd") })
}).aggregate_array('date'))

# Make a default value for every date.
header = ee.Feature(null, ee.Dictionary(dates, ee.List.repeat(-1, dates.size())))
output = header.merge(result)
ee.batch.Export.table.toDrive(...)