2017-12-04 7 views
0

어스 엔진 파이썬 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) 

답변

0

결과가 작 으면 result.getInfo()를 사용하여 파이썬으로 가져옵니다. 그러면 Python 사전에 FeatureCollection (더 많은 사전이 있음) 목록이 포함됩니다. 그러나 결과가 크거나 다각형이 넓은 지역을 포함하는 경우 컬렉션을 내보내는 대신 가져와야합니다.

1) 당신은() 컬렉션을 평평하게 할 수 있습니다, 그래서 중첩 된 컬렉션이 아니다 : 말했다

은 아마 당신이 먼저하고 싶은 것 몇 가지 다른 일이 있습니다. 그렇게 쉽게 처리 할 수 ​​있습니다.

2) 각 결과에 날짜를 추가하여 결과가 언제 나왔는지 알 수 있습니다. 당신은 결과에지도 그렇게, 당신이 정말로 원하는 것은 각 다각형의 시간 (가장 일반적인) 이상 NDVI의 시계열 인 경우 NDVIcalc 기능

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

3) 내부에 다음 코드를 구조 조정 할 수 있습니다 다각형을 통해지도를 먼저 쉬울 것입니다 : 당신이 결과를 내보내려고하는 거라면

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(...) 
+0

대단히 감사합니다! 드라이브로 내보내는 대신 사전에 값을 가져 오는 것이 나을 것입니다. 그러나 필자는 기능 컬렉션에 수천 가지 기능이 있기 때문에 그렇게 할 것이라고 생각합니다. 내가 지금 할 수없는 유일한 일은 헤더로 내보내기입니다. javascript에서 python으로 "번역"하는 것이 조금 손실됩니다. 이것은 코드 조각입니다 (형식이 부족할 수 있습니다) : – rhal

+0

header = ee.Feature (없음, ee.Dictionary (dates, ee.List.repeat (-1 , results = 'Tabla_stack', fileFormat = 'CSV') 작업을 인쇄합니다. (예 : date.size()))) "ok"출력 = header.merge (결과) task = ee.batch.Export.table.toDrive .start() print task.status() – rhal