188 lines
6.6 KiB
Python
Raw Normal View History

2012-10-04 19:33:47 +02:00
# -*- coding: utf-8 -*-
"""
***************************************************************************
GdalUtils.py
---------------------
Date : August 2012
Copyright : (C) 2012 by Victor Olaya
Email : volayaf at gmail dot com
***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************
"""
2016-09-21 18:24:26 +02:00
from builtins import str
from builtins import range
from builtins import object
2012-10-04 19:33:47 +02:00
__author__ = 'Victor Olaya'
__date__ = 'August 2012'
__copyright__ = '(C) 2012, Victor Olaya'
2012-10-04 19:33:47 +02:00
# This will get replaced with a git SHA1 when you do a git archive
2012-10-04 19:33:47 +02:00
__revision__ = '$Format:%H$'
import os
2012-09-15 18:25:25 +03:00
import subprocess
import platform
from osgeo import gdal
2016-04-22 10:38:48 +02:00
from qgis.PyQt.QtCore import QSettings
from qgis.core import QgsApplication, QgsVectorFileWriter
2013-08-12 20:44:27 +02:00
from processing.core.ProcessingLog import ProcessingLog
from processing.core.SilentProgress import SilentProgress
try:
from osgeo import gdal
gdalAvailable = True
except:
gdalAvailable = False
2012-09-15 18:25:25 +03:00
2016-09-21 18:24:26 +02:00
class GdalUtils(object):
2012-09-15 18:25:25 +03:00
supportedRasters = None
@staticmethod
def runGdal(commands, progress=None):
if progress is None:
2016-04-11 20:32:32 +02:00
progress = SilentProgress()
2016-04-08 14:05:32 +02:00
envval = os.getenv('PATH')
# We need to give some extra hints to get things picked up on OS X
2016-04-08 14:05:32 +02:00
isDarwin = False
try:
isDarwin = platform.system() == 'Darwin'
except IOError: # https://travis-ci.org/m-kuhn/QGIS#L1493-L1526
pass
if isDarwin and os.path.isfile(os.path.join(QgsApplication.prefixPath(), "bin", "gdalinfo")):
# Looks like there's a bundled gdal. Let's use it.
os.environ['PATH'] = "{}{}{}".format(os.path.join(QgsApplication.prefixPath(), "bin"), os.pathsep, envval)
os.environ['DYLD_LIBRARY_PATH'] = os.path.join(QgsApplication.prefixPath(), "lib")
else:
# Other platforms should use default gdal finder codepath
settings = QSettings()
2016-04-08 14:05:32 +02:00
path = settings.value('/GdalTools/gdalPath', '')
if not path.lower() in envval.lower().split(os.pathsep):
2016-04-08 14:05:32 +02:00
envval += '{}{}'.format(os.pathsep, path)
os.putenv('PATH', envval)
2016-09-21 18:24:26 +02:00
fused_command = ' '.join([str(c) for c in commands])
progress.setInfo('GDAL command:')
progress.setCommand(fused_command)
progress.setInfo('GDAL command output:')
success = False
retry_count = 0
while success == False:
loglines = []
loglines.append('GDAL execution console output')
try:
proc = subprocess.Popen(
fused_command,
shell=True,
stdout=subprocess.PIPE,
stdin=open(os.devnull),
stderr=subprocess.STDOUT,
universal_newlines=True,
).stdout
for line in proc:
progress.setConsoleInfo(line)
loglines.append(line)
success = True
except IOError as e:
if retry_count < 5:
retry_count += 1
else:
raise IOError(e.message + u'\nTried 5 times without success. Last iteration stopped after reading {} line(s).\nLast line(s):\n{}'.format(len(loglines), u'\n'.join(loglines[-10:])))
2013-08-12 20:44:27 +02:00
ProcessingLog.addToLog(ProcessingLog.LOG_INFO, loglines)
2012-09-15 18:25:25 +03:00
GdalUtils.consoleOutput = loglines
@staticmethod
def getConsoleOutput():
return GdalUtils.consoleOutput
@staticmethod
def getSupportedRasters():
if not gdalAvailable:
return {}
if GdalUtils.supportedRasters is not None:
2012-09-15 18:25:25 +03:00
return GdalUtils.supportedRasters
if gdal.GetDriverCount() == 0:
gdal.AllRegister()
GdalUtils.supportedRasters = {}
GdalUtils.supportedRasters['GTiff'] = ['tif']
2012-09-15 18:25:25 +03:00
for i in range(gdal.GetDriverCount()):
driver = gdal.GetDriver(i)
if driver is None:
2012-09-15 18:25:25 +03:00
continue
shortName = driver.ShortName
2012-09-15 18:25:25 +03:00
metadata = driver.GetMetadata()
#===================================================================
# if gdal.DCAP_CREATE not in metadata \
# or metadata[gdal.DCAP_CREATE] != 'YES':
# continue
#===================================================================
if gdal.DMD_EXTENSION in metadata:
extensions = metadata[gdal.DMD_EXTENSION].split('/')
2012-09-15 18:25:25 +03:00
if extensions:
GdalUtils.supportedRasters[shortName] = extensions
return GdalUtils.supportedRasters
@staticmethod
def getSupportedRasterExtensions():
allexts = ['tif']
2016-09-21 18:24:26 +02:00
for exts in list(GdalUtils.getSupportedRasters().values()):
2012-09-15 18:25:25 +03:00
for ext in exts:
if ext not in allexts and ext != '':
2012-09-15 18:25:25 +03:00
allexts.append(ext)
return allexts
@staticmethod
def getVectorDriverFromFileName(filename):
ext = os.path.splitext(filename)[1]
if ext == '':
return 'ESRI Shapefile'
formats = QgsVectorFileWriter.supportedFiltersAndFormats()
2016-09-27 19:51:06 +02:00
for k, v in list(formats.items()):
if ext in k:
return v
return 'ESRI Shapefile'
2012-09-15 18:25:25 +03:00
@staticmethod
def getFormatShortNameFromFilename(filename):
ext = filename[filename.rfind('.') + 1:]
2012-09-15 18:25:25 +03:00
supported = GdalUtils.getSupportedRasters()
2016-09-21 18:24:26 +02:00
for name in list(supported.keys()):
2012-09-15 18:25:25 +03:00
exts = supported[name]
if ext in exts:
return name
return 'GTiff'
@staticmethod
def escapeAndJoin(strList):
joined = ''
for s in strList:
if s[0] != '-' and ' ' in s:
escaped = '"' + s.replace('\\', '\\\\').replace('"', '\\"') \
+ '"'
else:
escaped = s
joined += escaped + ' '
return joined.strip()
@staticmethod
def version():
return int(gdal.VersionInfo('VERSION_NUM'))