अजगर कोड से gdal_translate कैसे कॉल करें?


40

क्या gdal_translateपायथन कोड से कॉल करने के लिए कुछ गदल एपीआई का उपयोग करना संभव है ? मेरा मतलब केवल फ़ाइल सिस्टम से gdal_translate.exe को निष्पादित करना नहीं है, बल्कि इसे किसी भी तरह से कोड में कॉल करना है इसलिए मुझे सटीक निर्देशिका को जानने की आवश्यकता नहीं है कि gdal_translate निष्पादन योग्य है?


4
हां, गदल-2.1 के रूप में। इस उत्तर को सही माना जाना चाहिए।
पीट

जवाबों:


27

चूंकि 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

2
सभी विकल्प जो gdal.Translate()यहां सूचीबद्ध हैं: gdal.org/python/osgeo.gdal-module.html#TranslateOptions
Marcelo Villa

23

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

यदि आप अधिक उत्पादन नियंत्रण चाहते हैं, जैसे आकार बदलना, कम करना, आदि ... इनपुट के रूप में एक वीआरटी का उपयोग करें , यह है कि यह कैसे gdal_translate आंतरिक रूप से करता है।


दुर्भाग्य से इसमें पुनरावृत्ति शामिल नहीं है, क्या यह?
रिकार्डो

1
@ बचर - नहीं। क्योंकि सवाल में रिप्रोडक्शन का जिक्र नहीं था। बेशक आप गदल अजगर एपीआई के साथ आपदाओं को खारिज कर सकते हैं। यदि आप जानना चाहते हैं कि कैसे, एक नया प्रश्न पूछें।
user2856

मैंने इसे पहले ही यहाँ किया है: gis.stackexchange.com/questions/103874/… लेकिन थिसियस को एक डुप्लिकेट के रूप में चिह्नित किया गया था :-(
रिकार्डो

2
@ बचर - जो इस प्रश्न के डुप्लिकेट के रूप में बंद था। आपका प्रश्न gdal_translate के बारे में भी पूछता है। क्या आप जानते हैं कि gdal_translate अस्वीकृति नहीं करता है? यदि आप अस्वीकृति करना चाहते हैं, तो gdalwarp या gdal python API विधि का उपयोग करें - gdal.ReprojectImage
user2856

10

हां आप पायथन के भीतर से GDAL यूटिलिटीज को कॉल कर सकते हैं। दृष्टिकोण में बहुत मामूली अंतर हैं कि क्या उपयोगिता अपने आप में एक निर्वासित है या अजगर कोड का एक टुकड़ा है। किसी भी तरह से हालांकि आपको उपप्रक्रम मॉड्यूल का उपयोग करने की आवश्यकता है :

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)

आप देखेंगे कि मैं अपने रास्तों के आसपास भाग के उद्धरण चिह्न जोड़ रहा हूं। ऐसा इसलिए है, क्योंकि विंडोज़ पर, मुझे रास्तों से परेशानी होती है, विशेष रूप से रिक्त स्थान वाले या जहाँ '\' वर्णों में से एक अन्य दुर्घटना से बचा हुआ चरित्र बनाता है। इसलिए, मैं अभी भी एस्पेक में उचित पथ को संरक्षित करता हूं जैसा कि यह था।

यदि आप एक अजगर उपयोगिताओं में से एक का उपयोग कर रहे हैं, तो बस वही करें जो आपके उप को छोड़कर सबप्रोसेस कमांड स्ट्रिंग की शुरुआत में है "C: \ python32 \ python.exe" (या आपके पास जो भी हो) और आपका दूसरा तत्व है अजगर उपयोगिता आप उपयोग करना चाहते हैं।

स्पष्ट रूप से आप हार्ड-कोडेड स्थिरांक का उपयोग करने के बजाय अपने फ़ाइल सिस्टम पर पुनरावृति कर सकते हैं, लेकिन यह केवल एक उदाहरण है।

EDIT - QGIS प्लगइन्स के लिए सामान्यीकरण QGIS
स्टार्ट अप में कई पर्यावरण चर बनाता / संशोधित करता है। इसलिए, आप उपरोक्त उदाहरण में हार्ड-कोडेड पथों के बजाय इनका उपयोग करके GDAL पुस्तकालयों / उपयोगिताओं के लिए सामान्यीकृत पथ चर बना सकते हैं।


तो मैं यह नहीं कर सकता? gdal_translate आयात करें और फिर .main () कॉल करें?
केटी ई।

नहीं - वह काम नहीं करेगा। gdal_translate अजगर पैकेज नहीं है, इसलिए अजगर को इसके बारे में कुछ भी पता नहीं होगा। आपको "ImportError No Module नाम gdal_translate" कहते हुए एक त्रुटि मिलेगी। इसके बजाय कॉल करने के लिए सबप्रोसेस मॉड्यूल का उपयोग करें।
मप्पाग्नोसिस

gdal_retile.py का उपयोग करने के साथ ठीक एक-एक प्रश्न -filefile files.txt ") लेकिन मुझे त्रुटि मिलती है: अपरिचित आदेश विकल्प: - कोई भी विचार क्यों?
केटी ई।

ऑफहैंड मैं इस मुद्दे को नहीं देख सकता सिवाय मेरे अनुमान के कि यह '--optfile' स्विच पसंद नहीं है। बाद वाला दस्तावेज नहीं है।
MappaGnosis

@ मप्पाग्नोसिस क्या पायथन गाल्ड लाइब्रेरी के भीतर gdal_translate का विकल्प है?
मल्टीगुडवर्स

7

मैं os.system का उपयोग करते हुए विभिन्न गाल्ड कमांड के साथ ऐसा करता हूं, जिसका उपयोग आप कमांड लाइन से कॉल फ़ंक्शन के लिए कर सकते हैं:

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

इसे यहाँ व्याख्यान 7 में भी वर्णित किया गया है: http://www.gis.usu.edu/~chrisg/python/2009/


GDAL कमांड RFC 59.1 के माध्यम से GDAL 2.1 में अजगर कार्यों के रूप में उपलब्ध हैं । से भी subprocess.callज्यादा सुरक्षित है os.system
दिमित्री चुबरोव

1
किसी को उन पायथन कार्यों का एक अच्छा उदाहरण लिखना होगा; gdal.Warp()ठीक से ड्राइव करने के लिए एक PG:डेटा स्रोत पाने के लिए मैंने कुछ घंटों के लिए कुश्ती cutlineDSNameकी cutlineSQL। (मुझे पता है, ठीक है? कुछ घंटे वास्तव में कुछ काम कर रहे हैं ? आतंक! </ मजाक>>)। यह अंततः काम कर रहा है, और यह os.system()या की तुलना में काफी तेजी से होने लगता है subprocess.call()। यह ~ 2 मिलियन कटलाइन कर रहा है, इसलिए मुझे नहीं पता होगा कि क्या यह वास्तव में कुछ समय पहले तक तेज है ... लेकिन यह बिल्कुल सही काम कर रहा है।
जी.टी.

3

यहां एक त्वरित कोड है जो किसी भी मल्टी-बैंड TIF से अलग-अलग फ़ाइलों में बैंड को बचाने के लिए पायथन में GDAL ट्रांसलेशन का उपयोग कर रहा है।

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

यह आगे की प्रक्रिया के लिए उपयोगी हो सकता है (जैसे रैस्टरियो का उपयोग करना, यहाँ की तरह )।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.