파이썬 코드에서 gdal_translate를 호출하는 방법은 무엇입니까?


40

gdal API를 사용 gdal_translate하여 Python 코드에서 호출 할 수 있습니까? 단순히 파일 시스템에서 gdal_translate.exe를 실행하는 것이 아니라 코드에서 어떻게 든 호출하여 gdal_translate 실행 파일이있는 정확한 디렉토리를 알 필요가 없습니까?


4
예, gdal-2.1 기준. 이 답변 은 정확한 것으로 받아 들여 져야합니다.
Pete

답변:



23

GDAL API 자습서를 참조하십시오 .

#Import gdal
from osgeo import gdal

#Open existing dataset
src_ds = gdal.Open( src_filename )

#Open output format driver, see gdal_translate --formats for list
format = "GTiff"
driver = gdal.GetDriverByName( format )

#Output to new format
dst_ds = driver.CreateCopy( dst_filename, src_ds, 0 )

#Properly close the datasets to flush to disk
dst_ds = None
src_ds = None

크기 조정, 하위 설정 등과 같은 더 많은 출력 제어를 원한다면 VRT 를 입력으로 사용하십시오 . 이것이 gdal_translate가 내부적으로 수행하는 방식입니다.


불행히도 이것은 reporjection을 포함하지 않습니까?
Riccardo

1
@butcher-아니요. 질문에 재 투영이 언급되지 않았기 때문입니다. 물론 gdal python API로 래스터를 재 투영 할 수 있습니다. 방법을 알고 싶다면 새로운 질문을하십시오.
user2856

나는 이미 그것을 여기에서했다 : gis.stackexchange.com/questions/103874/… 그러나 thius는 복제물로 표시되었다 :-(
Riccardo

2
@butcher-그것은이 질문의 복제본으로 닫혔습니다. 귀하의 질문은 또한 gdal_translate에 대해 묻습니다. gdal_translate가 재 투영되지 않는다는 것을 알고 있습니까? 재 투영을하려면 gdalwarp 또는 gdal python API 메소드를 사용하십시오 -gdal.ReprojectImage
user2856

10

예, Python 내에서 GDAL 유틸리티를 호출 할 수 있습니다. 유틸리티가 자체적으로 exe인지 또는 python 코드인지에 따라 접근 방식에는 약간의 차이가 있습니다. 하위 프로세스 모듈 을 사용해야하는 경우 중 하나입니다 .

import subprocess

# constants
gdalTranslate = r'C:\Program Files\GDAL\gdal_translate.exe'
src = r"C:\somefolder\somefile.tif"
dst = r"C:\someotherfolder\myresul.tif"
cmd = "-ot float32 -outsize 25 25"  # just for example!

# see note below
def youCanQuoteMe(item):
    return "\"" + item + "\""

fullCmd = ' '.join([gdalTranslate, cmd, youCanQuoteMe(src), youCanQuoteMe(dst)])
subprocess.popen(fullCmd)

경로에 이스케이프 된 따옴표를 추가 한 것을 알 수 있습니다. Windows에서 경로, 특히 공백이 있거나 '\'문자 중 하나가 실수로 탈출 한 문자를 만드는 경로에 문제가 있었기 때문입니다. 그래서, 나는 단지 aspec의 올바른 경로를 그대로 유지합니다.

파이썬 유틸리티 중 하나를 사용하는 경우 하위 프로세스 명령 문자열의 시작 부분에있는 exe가 이제 "C : \ python32 \ python.exe"(또는 사용중인 버전)이고 두 번째 요소는 제외하고 동일한 작업을 수행하십시오. 사용하려는 파이썬 유틸리티.

분명히 하드 코딩 된 상수를 사용하지 않고 파일 시스템을 반복 할 수도 있지만 이것은 단지 예일뿐입니다.

편집-QGIS 플러그인 일반화 QGIS
는 시작시 여러 환경 변수를 작성 / 수정합니다. 따라서 위의 예에서 하드 코딩 된 경로 대신이를 사용하여 GDAL 라이브러리 / 유틸리티에 대한 일반화 된 경로 변수를 작성할 수 있습니다 (설정-> 옵션-> 시스템 참조).


그래서 나는 이것을 할 수 없습니까? gdal_translate를 가져온 다음 .main ()?
Katie E.

아니요-작동하지 않습니다. gdal_translate는 파이썬 패키지가 아니기 때문에 파이썬은 그것에 대해 아무것도 알지 못합니다. "ImportError No Module named gdal_translate"라는 오류 메시지가 나타납니다. 서브 프로세스 모듈을 사용하여 대신 호출하십시오.
MappaGnosis

좋아 gdal_retile.py를 사용하여 비슷한 질문 하나 .. 나는 다음을 시도했다 : import gdal_retile gdal_retile.main ( "-v -r bilinear -levels 4 -ps 2048 2048 -co \"tiled = YES \ "-targetDir 케이블 피라미드- -optfile files.txt ") 오류 메시지가 표시됩니다.
Katie E.

내 생각에 '--optfile'스위치가 마음에 들지 않는다는 것 외에는 문제를 볼 수 없습니다. 후자는 문서화되어 있지 않습니다.
MappaGnosis

@MappaGnosis 파이썬 gdal 라이브러리 내에 gdal_translate의 대안이 있습니까?
multigoodverse

7

os.system을 사용하여 다양한 gdal 명령 으로이 작업을 수행하며 명령 줄에서와 같이 함수를 호출하는 데 사용할 수 있습니다.

os.system("gdal_translate -of GTiff " + sourcefile + " " +  destinationfile)

또한 강의 7에 설명되어 있습니다 : http://www.gis.usu.edu/~chrisg/python/2009/


GDAL 명령은 GDAL 2.1부터 RFC 59.1 까지의 파이썬 함수로 사용할 수 있습니다 . 또한 subprocess.call보다 안전합니다 os.system.
Dmitri Chubarov

1
누군가 파이썬 함수의 좋은 예를 작성해야합니다. 나는 드라이브를 구동 gdal.Warp()하는 데 필요한 PG:데이터 소스를 얻기 위해 몇 시간 동안 씨름했다 . (알아요, 맞습니까? 실제로시간 동안 운동을 합니까? 공포! </ kidding>). 결국 작동하고있어 또는 보다 훨씬 빠릅니다 . 그것은 ~ 2 백만 컷 라인을하고 있기 때문에 오늘 밤까지 실제로 실제로 더 빠른지 모르겠지만 ... 정확하게 작동합니다. cutlineDSNamecutlineSQL os.system()subprocess.call()
GT.

3

다음은 Python에서 GDAL Translate를 사용하여 복합 다중 대역 TIF에서 개별 파일로 대역을 저장하려는 모든 사용자를위한 빠른 코드입니다.

import gdal

in_path = 'C:/GIS/Sample.tif' #input composite raster
out_path = 'C:/GIS/Output/' #output directory for individual bands as files

#Open existing raster ds
src_ds = gdal.Open(in_path)

for i in range(1,src_ds.RasterCount +1): #Save bands as individual files
    out_ds = gdal.Translate(out_path + 'band' + str(i) + '.tiff', src_ds, format='GTiff', bandList=[i])
    out_ds=None

이 (같은 Rasterio를 사용하여 예를 들어, 추가 처리를 위해 유용 할 수있다 여기에 ).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.