Czy można użyć jakiegoś API gdal do wywołania gdal_translate z kodu Pythona? Nie mam na myśli po prostu uruchomienia gdal_translate.exe z systemu plików, ale raczej wywołanie go w kodzie, więc nie muszę znać dokładnego katalogu, w którym znajduje się plik wykonywalny gdal_translate?

Komentarze

Odpowiedź

Od GDAL 2.1 (więcej informacji tutaj ), narzędzia GDAL i OGR mogą być używane jako funkcje biblioteczne. Na przykład:

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 

Komentarze

  • Wszystkie opcje, które gdal.Translate() są wymienione tutaj: gdal.org/python/osgeo.gdal-module.html#TranslateOptions
  • I ' próbowałeś tego użyć i nie ' nie otrzymałem żadnych błędów, ale plik wyjściowy nie jest ' t utworzony. Jakieś pomysły, dlaczego?
  • również brak pliku wyjściowego i żadnych błędów. Ścieżki wyjściowe i parametry projWin są poprawne.

Odpowiedź

Zobacz GDAL Samouczek 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 

Jeśli chcesz mieć większą kontrolę nad danymi wyjściowymi, taką jak zmiana rozmiaru, podzestawianie itp. … użyj VRT jako dane wejściowe, tak robi to gdal_translate wewnętrznie.

Komentarze

  • niestety nie obejmuje to ' odrzucenia, prawda?
  • @butcher – nie. Ponieważ w pytaniu nie było mowy o reprojekcji. Oczywiście możesz reprojektować rastry za pomocą interfejsu API gdal python. Jeśli chcesz wiedzieć, jak to zrobić, zadaj nowe pytanie.
  • Już to zrobiłem: gis.stackexchange.com/questions/103874/… , ale thius został oznaczony jako duplikat 🙁
  • @butcher – to zostało zamknięte jako duplikat tego pytania. Twoje pytanie dotyczy również gdal_translate . Czy zdajesz sobie sprawę, że gdal_translate nie wyświetla ponownie obrazu? Jeśli chcesz wykonać projekt ponownie, użyj gdalwarp lub metody interfejsu API gdal python – gdal.ReprojectImage

Odpowiedź

Tak, możesz zadzwonić do GDAL Utilities z poziomu Pythona. Istnieją bardzo drobne różnice w podejściu w zależności od tego, czy narzędzie jest exe sam w sobie lub też fragment kodu Pythona. Tak czy inaczej, musisz użyć modułu podprocesu :

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) 

Zauważysz, że dodaję cudzysłowy do moich ścieżek. Dzieje się tak, ponieważ w systemie Windows otrzymałem tr podwójny ze ścieżkami, szczególnie ze spacjami lub gdzie jeden ze znaków „\” tworzy inny przypadkowy znak ucieczki. Więc po prostu zachowuję właściwą ścieżkę w aspec tak, jak była.

Jeśli używasz jednego z narzędzi Pythona, po prostu zrób to samo, z wyjątkiem tego, że twój exe na początku ciągu poleceń podprocesu to teraz ” C: \ python32 \ python.exe „(lub jakąkolwiek posiadaną wersję), a twoim drugim elementem jest narzędzie Pythona, którego chcesz użyć.

Oczywiście możesz także iterować po systemie plików zamiast używać twardego zakodowane stałe, ale to tylko przykład.

EDYCJA – Uogólnianie dla wtyczek QGIS
QGIS tworzy / modyfikuje wiele zmiennych środowiskowych podczas uruchamiania. Możesz więc zbudować uogólnione zmienne ścieżek do bibliotek / narzędzi GDAL, używając ich (zobacz Ustawienia-> Opcje-> System) zamiast zakodowanych ścieżek w powyższym przykładzie.

Komentarze

  • Czy mogę ' tego zrobić? importuj gdal_translate, a następnie wywołaj .main ()?
  • Nie – to wygrało ' t. gdal_translate nie jest pakietem Pythona, więc Python nie ' nic o nim nie wie. Pojawi się komunikat o błędzie: " ImportError Brak modułu o nazwie gdal_translate ". Zamiast tego użyj modułu podprocesu, aby go wywołać.
  • ok jedno podobne pytanie z użyciem gdal_retile.py .. Próbowałem wykonać następujące czynności: import gdal_retile gdal_retile.main (" -v -r bilinear -levels 4 -ps 2048 2048 -co \ " tiled = YES \ " -targetDir piramida kablowa – optfile files.txt "), ale pojawia się błąd: Nierozpoznana opcja polecenia: – Masz jakiś pomysł, dlaczego?
  • Mogę od ręki ' nie widzę problemu, ale przypuszczam, że może nie podobać się przełącznik ' –optfile '. Ten ostatni nie jest udokumentowany.
  • @MappaGnosis Czy istnieje alternatywa dla gdal_translate w bibliotece gdal Pythona?

Odpowiedź

Robię to za pomocą różnych poleceń gdal używających os.system, których możesz użyć do wywołania funkcji po prostu jak z wiersza poleceń:

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

Jest to również opisane w wykładzie 7 tutaj: http://www.gis.usu.edu/~chrisg/python/2009/

Komentarze

  • Polecenia GDAL są dostępne jako funkcje Pythona w GDAL 2.1 do RFC 59.1 . Ponadto subprocess.call jest bezpieczniejsze niż os.system.
  • Ktoś musi napisać dobry przykład tych funkcji w Pythonie. Przez kilka godzin walczyłem z gdal.Warp(), aby poprawnie uzyskać PG: źródło danych jako cutlineDSName do kierowania cutlineSQL. (Wiem, prawda? Kilka godzin naprawdę coś rozwinęło ? Przerażenie! < / kidding >). W końcu udało się i wydaje się być znacznie szybszy niż os.system() lub subprocess.call(). ' robi ok. 2 miliony odcinków, więc wygrałem ' Nie wiem, czy ' s właściwie szybciej aż do dzisiejszego wieczoru … ale ' działa dokładnie tak, jak powinno.

Odpowiedź

Oto szybki kod dla każdego, kto chce zapisać pasma z kompozytowego wielopasmowego TIF do pojedynczych plików przy użyciu narzędzia GDAL Translate w Pythonie.

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 

Może to być przydatne do dalszego przetwarzania (np. przy użyciu Rasterio, na przykład tutaj ).

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *