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
- Tak, od gdal-2.1. Tę odpowiedź należy zaakceptować jako poprawną.
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 jakocutlineDSName
do kierowaniacutlineSQL
. (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()
lubsubprocess.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 ).