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

Comments

  • 예, gdal-2.1부터. 이 답변 은 올바른 것으로 받아 들여 져야합니다.

답변

GDAL 2.1 (추가 정보 여기 )부터 GDAL 및 OGR 유틸리티를 라이브러리 기능으로 사용할 수 있습니다. 예 :

from osgeo import gdal ds = gdal.Open("input.tif") ds = gdal.Translate("output.tif", ds, projWin = [-75.3, 5.5, -73.5, 3.7]) ds = None 

댓글

  • gdal.Translate() 테이크가 여기에 나열됩니다. gdal.org/python/osgeo.gdal-module.html#TranslateOptions
  • I '이를 사용하려고 시도했으며 ' 오류가 발생하지 않았지만 출력 파일이 ' t가 생성되었습니다. 이유는 무엇입니까?
  • 출력 파일도없고 오류도 없습니다. 출력 경로 및 projWin 매개 변수가 정확합니다.

답변

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가 내부적으로 수행하는 방식입니다.

댓글

  • 안타깝게도 ' 거절이 포함되지 않습니다. 그렇지 않나요?
  • @butcher-아니요. 질문은 재 투영을 언급하지 않았기 때문입니다. 물론 gdal python API를 사용하여 래스터를 재 투영 할 수 있습니다. 방법을 알고 싶다면 새 질문을하십시오.
  • 이미 여기에서 해보았습니다. gis.stackexchange.com/questions/103874/ … 하지만 thius는 중복으로 표시되었습니다 🙁
  • @butcher-이 질문의 중복으로 종료되었습니다. 귀하의 질문은 gdal_translate에 대해서도 묻습니다. . gdal_translate가 재 투영되지 않는다는 것을 알고 계십니까? 재 투영하려면 gdalwarp 또는 gdal python API 메소드 ( gdal.ReprojectImage

Answer

예, Python 내에서 GDAL 유틸리티를 호출 할 수 있습니다. 유틸리티가 있는지 여부에 따라 접근 방식에 매우 사소한 차이가 있습니다. 그 자체로 exe 또는 Python 코드의 일부입니다. 어느 쪽이든 subprocess 모듈을 사용해야하지만 :

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에서는 tr 경로, 특히 공백이 있거나 “\”문자 중 하나가 다른 우발적 인 이스케이프 문자를 만드는 경로가있는 경우. 그래서 저는 aspec에있는 적절한 경로를 그대로 유지합니다.

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

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

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

댓글

  • 그러면 '이 작업을 수행 할 수 없습니까? gdal_translate를 가져온 다음 .main ()을 호출 하시겠습니까?
  • 아니요-작동하지 않습니다. ' gdal_translate는 Python 패키지가 아니므로 Python은 '에 대해 아무것도 알지 못했습니다. " ImportError No Module named gdal_translate "라는 오류가 표시됩니다. 대신 subprocess 모듈을 사용하여 호출하십시오.
  • gdal_retile.py를 사용하는 것과 유사한 질문을 하나 확인했습니다. 다음을 시도했습니다. import gdal_retile gdal_retile.main (" -v -r bilinear -levels 4 -ps 2048 2048 -co \ " tiled = YES \ " -targetDir cablepyramid- optfile files.txt ") 오류가 발생합니다. Unrecognized command option :-이유를 아십니까?
  • 공식으로 할 수 있습니다. ' 내 생각에 '-optfile ' 스위치와 같지 않을 수 있다는 점을 제외하고는 문제가 표시되지 않습니다. 후자는 문서화되어 있지 않습니다.
  • @MappaGnosis Python gdal 라이브러리 내에 gdal_translate의 대안이 있습니까?

Answer

함수를 호출하는 데 사용할 수있는 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.callos.system보다 안전합니다.
  • 누군가 이러한 Python 함수의 좋은 예를 작성해야합니다. 저는 PG:를 제대로 얻기 위해 몇 시간 동안 gdal.Warp()와 씨름했습니다. 데이터 소스를 cutlineDSName로 지정하여 cutlineSQL를 구동합니다. (알아요, 맞죠? 몇 시간 실제로 뭔가를 해내 고 있습니까 ? 공포! < / kidding >). 결국 효과가 있습니다. os.system() 또는 subprocess.call()보다 훨씬 빠른 것 같습니다. '가 200 만 개 이상의 컷 라인을 수행하므로 ' 이겼는지 알 수 없습니다. ' s 실제로 오늘 밤까지 더 빨라졌지만 ' 정확하게 작동합니다.

Answer

다음은 Python에서 GDAL 번역을 사용하여 복합 다중 대역 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 사용).

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다