Voiko jotakin gdal-sovellusliittymää käyttää kutsumaan gdal_translate Python-koodista? En tarkoita yksinkertaisesti gdal_translate.exe: n suorittamista tiedostojärjestelmästä, vaan kutsun sitä jotenkin koodiksi, joten minun ei tarvitse tietää tarkkaa hakemistoa, jossa suoritettava gdal_translate-tiedosto on?

Kommentit

Vastaa

Koska GDAL 2.1 (lisätietoja täällä ), GDAL- ja OGR-apuohjelmia voidaan käyttää kirjastotoimintoina. Esimerkiksi:

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 

Kommentit

  • Kaikki vaihtoehdot, jotka gdal.Translate() takeet on lueteltu tässä: gdal.org/python/osgeo.gdal-module.html#TranslateOptions
  • I ' yritit käyttää tätä ja älä ' saa virheitä, mutta tulostetiedosto ei ole ' t luotu. Onko sinulla ideoita miksi?
  • ei myöskään saada tiedostoa eikä virheitä. Lähtöpolut ja projWin-parametrit ovat oikein.

Vastaa

Katso GDAL sovellusliittymän opetusohjelma .

#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 

Jos haluat lisää ulostulon hallintaa, kuten koon muuttamista, aliasetuksia jne … div id = ”7effed135c”>

VRT syötteenä, näin gdal_translate tekee sen sisäisesti.

Kommentit

  • valitettavasti tämä ei sisällä ' t hylkäämistä, eikö niin?
  • @butcher – ei. Koska kysymyksessä ei mainittu uudelleenhylkäämistä. Tietenkin voit suunnitella rastereita uudelleen gdal python -sovellusliittymällä. Jos haluat tietää kuinka, kysy uusi kysymys.
  • Olen tehnyt sen jo täällä: gis.stackexchange.com/questions/103874/… , mutta thius merkittiin kaksoiskappaleeksi 🙁
  • @butcher – se suljettiin tämän kysymyksen kopiona. Kysymyksesi koskee myös tietoa gdal_translate . Oletko tietoinen siitä, että gdal_translate ei tee uudelleenprojektia? Jos haluat projektoida uudelleen, käytä gdalwarpia tai gdal python -sovellusliittymämenetelmää – gdal.ReprojectImage

Vastaa

Kyllä, voit soittaa GDAL-apuohjelmiin Pythonissa. Lähestymistavassa on hyvin pieniä eroja riippuen siitä, onko apuohjelma exe itsessään tai myös pala python-koodia. Kummassakin tapauksessa sinun on kuitenkin käytettävä aliprosessia -moduulia:

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) 

Huomaat, että lisän pakenut lainausmerkit polkuni ympärille. Tämä johtuu siitä, että minulla on ollut Windows kaksinkertainen polkujen kanssa, etenkin niiden kanssa, joissa on välilyöntejä tai joissa yksi ”\” – merkistä tekee toisen vahingossa pakenevan merkin. Joten säilytän oikean polun aspecissa ikään kuin se oli.

Jos käytät yhtä python-apuohjelmista, tee sama asia paitsi exe aliprosessin komentokomennon alussa on nyt ” C: \ python32 \ python.exe ”(tai mikä tahansa versio sinulla on) ja toinen elementtisi on python-apuohjelma, jota haluat käyttää.

Voit tietysti myös toistaa tiedostojärjestelmän yli kovan koodatut vakiot, mutta tämä on vain esimerkki.

EDIT – QGIS-laajennusten yleistäminen
QGIS luo / muokkaa useita ympäristömuuttujia käynnistyksen yhteydessä. Joten voit rakentaa yleisiä polkumuuttujia GDAL-kirjastoihin / apuohjelmiin käyttämällä näitä (katso Asetukset-> Asetukset-> Järjestelmä) yllä olevan esimerkin kovakoodattujen polkujen sijaan.

Kommentit

  • Joten en voi ' tehdä tätä? tuo gdal_translate ja soita sitten .main ()?
  • Ei – joka ei toiminut ' t. gdal_translate ei ole Python-paketti, joten python ei ' tiedä siitä mitään. Saat virheen sanomalla " ImportError Ei moduulia nimeltä gdal_translate ". Käytä sitä aliprosessimoduulilla.
  • ok yksi samanlainen kysymys käyttämällä gdal_retile.py. Yritin tehdä seuraavaa: tuoda gdal_retile gdal_retile.main (" -v -r bilineaariset tasot 4 -ps 2048 2048 -co \ " tiled = YES \ " -targetDir kaapelipyramidi – optfile files.txt "), mutta saan virheen: Tunnistamaton komentovaihtoehto: – Onko mitään käsitystä miksi?
  • Offhand voin ' näe ongelmaa lukuun ottamatta sitä, että se ei ehkä pidä kytkimestä ' –optfile '. Jälkimmäistä ei ole dokumentoitu.
  • @MappaGnosis Onko Pythonin gdal-kirjastossa vaihtoehto gdal_translate?

Vastaa

Teen tämän useilla gdal-komennoilla os.system-järjestelmällä, jonka avulla voit kutsua toimintoja vain kuten komentoriviltä:

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

Se kuvataan myös luennossa 7 täällä: http://www.gis.usu.edu/~chrisg/python/2009/

Kommentit

  • GDAL-komennot ovat käytettävissä python-funktioina GDAL 2.1: ssä – RFC 59.1 . Myös subprocess.call on turvallisempi kuin os.system.
  • Jonkun on kirjoitettava hyvä esimerkki näistä Python-funktioista. Painin gdal.Warp(): lla pari tuntia saadakseni PG: tietolähde nimellä cutlineDSName ajaa cutlineSQL. (Tiedän, eikö? Pari tuntia todella työskentelet jotain ? Kauhu! < / kidding >). Sait sen lopulta toimimaan, ja se näyttää olevan huomattavasti nopeampi kuin os.system() tai subprocess.call(). ' tekee ~ 2 miljoonaa viivaa, joten voitin ' en tiedä ' s oikeastaan nopeammin jonkin aikaa tänä iltana … mutta se ' toimii täysin oikein.

Vastaa

Tässä on pikakoodi kaikille, jotka haluavat tallentaa kaistoja yhdistetystä monikaistaisesta TIF: stä yksittäisiin tiedostoihin käyttämällä Pythonin GDAL Translate -sovellusta.

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 

Tästä voi olla hyötyä jatkokäsittelyssä (esim. Rasterio, kuten täällä ).

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *