Python kodundan gdal_translate nasıl çağırılır?


40

gdal_translatePython kodundan çağırmak için bir gdal API kullanmak mümkün müdür ? Sadece gdal_translate.exe dosyasını dosya sisteminden çalıştırmak demek istemiyorum, ancak kodunu bir şekilde kod olarak adlandırın, böylece gdal_translate yürütülebilir dosyasının bulunduğu dizini bilmem gerekmez mi?


4
Evet, 2.1. Bu cevap doğru olarak kabul edilmelidir.
Pete,

Yanıtlar:



23

GDAL API Eğitimine bakınız .

#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

Yeniden boyutlandırma, alt kümeleme, vb. Gibi daha fazla çıktı kontrolü istiyorsanız, girdi olarak VRT kullanın , gdal_translate bunu dahili olarak yapar.


ne yazık ki bu yeniden yapılanma içermiyor, değil mi?
Riccardo

1
@butcher - hayır. Çünkü soru reddetmeden bahsetmedi. Tabii ki rasterleri gdal python API ile yeniden programlayabilirsiniz. Nasıl olduğunu bilmek istiyorsanız, yeni bir soru sorun.
user2856

Ben zaten burada yaptım: gis.stackexchange.com/questions/103874/… fakat thius kopya olarak işaretlendi :-(
Riccardo

2
@butcher - bu sorunun bir kopyası olarak kapatıldı. Sorunuz da gdal_translate hakkında sorular sorar. Gdal_translate öğesinin yeniden işlemediğinin farkında mısın? Eğer reddetmek istiyorsanız, gdalwarp veya gdal python API yöntemini kullanın - gdal.ReprojectImage
user2856

10

Evet, GDAL Yardımcı Programlarını Python içinden arayabilirsiniz. Yardımcı programın kendi başına bir exe veya bir python kodu parçası olmasına bağlı olarak yaklaşımda çok küçük farklılıklar vardır. Her iki durumda da alt işlem modülünü kullanmanız gerekse de :

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)

Yollarımın üzerine kaçış tırnak işaretleri eklediğimi fark edeceksiniz. Bunun nedeni, Windows’ta, özellikle boşluk içeren veya '\' karakterlerinden birinin yanlışlıkla kaçan bir karakter çıkardığı yollar ile ilgili sorun yaşıyorum. Bu yüzden, sadece aspec'teki doğru yolu korudum.

Python yardımcı programlarından birini kullanıyorsanız, alt işlem komut dizesinin başlangıcındaki exe'niz dışında şimdi aynı şeyleri yapın "C: \ python32 \ python.exe" (veya hangi sürümüne sahipseniz) ve ikinci öğeniz kullanmak istediğiniz python yardımcı programını kullanın.

Açıkçası sabit kodlanmış sabitleri kullanmak yerine dosya sisteminizi yineleyebilirsiniz, ancak bu sadece bir örnek.

EDIT - QGIS eklentileri için genelleme QGIS
, başlangıçta bir dizi çevre değişkeni oluşturur / değiştirir. Böylece, yukarıdaki örnekte kodlanmış yollar yerine bunları (bkz. Ayarlar-> Seçenekler-> Sistem) kullanarak GDAL kitaplıklarına / yardımcı programlarına genelleştirilmiş yol değişkenleri oluşturabilirsiniz.


Yani bunu yapamam? import gdal_translate ve sonra .main () işlevini çağırın.
Katie E.

Hayır - bu işe yaramaz. gdal_translate bir Python paketi değildir, dolayısıyla python bu konuda hiçbir şey bilmeyecektir. "ImportError No Modülü gdal_translate" derken bir hata mesajı alacaksınız. Bunun yerine çağırmak için alt işlem modülünü kullanın.
MappaGnosis

ok gdal_retile.py kullanarak benzer soruları .. Aşağıdakileri yapmaya çalıştım: import gdal_retile gdal_retile.main ("- v -r bilinear -levels 4 -ps 2048 2048 -co \" tiled = YES \ "-targetDir cablepyramid - -optfile files.txt ") ama hatayı alıyorum: Tanınmayan komut seçeneği: - Herhangi bir fikrin neden?
Katie E.

Sonuçta, tahminimce '--optfile' anahtarını beğenmeyebileceği dışında sorunu göremiyorum. İkincisi belgelenmemiş.
MappaGnosis

@MappaGnosis Python gdal kütüphanesinde bir gdal_translate alternatifi var mı?
multigoodverse

7

Bunu komut satırından itibaren fonksiyon çağırmak için kullanabileceğiniz os.system kullanarak çeşitli komutlarla yapıyorum:

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

Ayrıca burada 7. derste açıklanmıştır: http://www.gis.usu.edu/~chrisg/python/2009/


GDAL komutları, GDAL 2.1'den RFC 59.1'e kadar python işlevleri olarak kullanılabilir . Ayrıca subprocess.calldaha güvenlidir os.system.
Dmitri Chubarov

1
Birinin bu Python fonksiyonlarına güzel bir örnek yazması gerekiyor; Araba sürmek için gereken veri kaynağını gdal.Warp()doğru bir şekilde almak için birkaç saat PG:uğraştım . (Biliyorum, doğru mu? Birkaç saat içinde bir şey işe yarıyor mu? Korku! </kidding>). Sonunda çalışmasını sağladım ve ya da , ya da den daha belirgin bir şekilde görünüyor . ~ 2 milyon cutline yapıyor, bu yüzden bu geceye kadar gerçekten daha hızlı olup olmadığını bilemem ... ama tam olarak çalışıyor. cutlineDSNamecutlineSQL os.system()subprocess.call()
GT.

3

Python'da GDAL Translate'i kullanarak kompozit çok bantlı TIF'ten bireysel dosyalara bant kaydetmek isteyen herkes için hızlı bir kod.

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

Bu daha sonraki işlemler için faydalı olabilir (örneğin, burada olduğu gibi Rasterio kullanarak ).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.