2017-10-25 12 views
1

Google 어스 엔진을 처음 사용하고 Google 어스 엔진 파이썬 API를 사용하는 방법을 이해하려고했습니다. 이미지 컬렉션을 만들 수는 있지만 getdownloadurl() 메서드는 개별 이미지에서만 작동합니다. 따라서 컬렉션의 모든 이미지를 반복하고 다운로드하는 방법을 이해하려고합니다.Google 어스 엔진 python api에서 이미지 컬렉션의 각 이미지를 반복하고 다운로드하는 방법

여기 내 기본 코드입니다. 내가하고있는 다른 일에 대해 아주 자세히 설명했다.

import ee 
ee.Initialize() 
col = ee.ImageCollection('LANDSAT/LC08/C01/T1') 
col.filterDate('1/1/2015', '4/30/2015') 
pt = ee.Geometry.Point([-2.40986111110000012, 26.76033333330000019]) 
buff = pt.buffer(300) 
region = ee.Feature.bounds(buff) 
col.filterBounds(region) 

그래서 Landsat 컬렉션을 가져 와서 날짜와 버퍼 구조로 필터링했습니다. 그래서 저는 컬렉션에 7-8 이미지 같은 것을 가져야합니다 (모든 밴드들과 함께).

그러나 컬렉션에 대한 작업을 반복 할 수 없었습니다. 예를 들어

는 :

for i in col: 
    print(i) 

오류가 나는 개별 이미지에 액세스 할 수있는 방법, 컬렉션 반복 가능한 아닙니다 그래서 경우

TypeError: 'ImageCollection' object is not iterable을 나타냅니다? 나는 이미지가 일단

, 나는 당신이 가능하게 이미지를 가져 와서 목록에 추가하는 기능 ee.ImageCollection.iterate()를 사용할 수있는 일반적인

path = col[i].getDownloadUrl({ 
    'scale': 30, 
    'crs': 'EPSG:4326', 
    'region': region 
}) 

답변

0

을 사용할 수 있어야합니다.

import ee 

def accumluate_images(image, images): 
    images.append(image) 
    return images 

for img in col.iterate(accumulate_images, []): 
    url = img.getDownloadURL(dict(scale=30, crs='EPSG:4326', region=region)) 

불행히도 나는이 API에 액세스하지 않는 한이 코드를 테스트 할 수 없습니다,하지만 당신은 해결에 도달 도움이 될 수 있습니다.

+0

네, iterate 메소드에 대한 언급을 보았습니다. 나는 그 장면을 줄 것이다. 제안에 감사드립니다. – krishnab

+0

두 가지 이유로이 방법을 피해야합니다. 하나는 클라이언트 ('getDownloadURL()')와 서버 ('iterate()') 함수 ([참조] (https://developers.google.com/earth-engine/debugging#avoid-mixing)를 혼합하는 것을 피하는 것이 좋습니다. -client-functions-and-objects-with-server-functions-and-objects))를 사용합니다. 두 가지,'getDownloadURL()'은 색다른 데, 때때로 다운로드가 손상 될 수 있습니다. –

+0

@NicholasClinton : 감사합니다. 참조에 따르면'getDownloadURL()'은'ee.Image()'객체의 메소드이므로 _server_ 함수입니다. 'iterate()'와'list.append()'에 대한 호출로 전달되는 파이썬리스트를 의미 했습니까? – mhawke

3

ee.batch.Export을 사용하는 것이 좋습니다. 또한 클라이언트와 서버 기능을 혼합하지 않는 것이 좋습니다 (reference). 따라서 Export은 클라이언트 기능이므로 for 루프를 사용할 수 있습니다. 이러한 방식으로 목록으로 컬렉션을 변환하는 대형 컬렉션 (reference)에 대한 위험하다

import ee 
ee.Initialize() 

rectangle = ee.Geometry.Rectangle([-1, -1, 1, 1]) 
sillyCollection = ee.ImageCollection([ee.Image(1), ee.Image(2), ee.Image(3)]) 

# This is OK for small collections 
collectionList = sillyCollection.toList(sillyCollection.size()) 
collectionSize = collectionList.size().getInfo() 
for i in xrange(collectionSize): 
    ee.batch.Export.image.toDrive(
     image = ee.Image(collectionList.get(i)).clip(rectangle), 
     fileNamePrefix = 'foo' + str(i + 1), 
     dimensions = '128x128').start() 

참고 : 여기 시작하는 간단한 예제입니다. 그러나 실제로 다운로드해야하는 경우이 방법이 가장 확장 성이 좋습니다.

+0

전화하세요. 네,이 방법을 살펴 보겠습니다. 나는 전에 그것을 보지 못했다. – krishnab