Victor Olaya 4eab185528 [processing] all gdal algs now have the same icon
Did some code cleaning in gdal package
2014-06-02 22:45:43 +02:00

248 lines
6.9 KiB
Python

# -*- coding: utf-8 -*-
"""
***************************************************************************
ogr2ogr.py
---------------------
Date : November 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. *
* *
***************************************************************************
"""
__author__ = 'Victor Olaya'
__date__ = 'November 2012'
__copyright__ = '(C) 2012, Victor Olaya'
# This will get replaced with a git SHA1 when you do a git archive
__revision__ = '$Format:%H$'
try:
from osgeo import gdal, ogr, osr
gdalAvailable = True
except:
gdalAvailable = False
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from qgis.core import *
from processing.core.GeoAlgorithmExecutionException import \
GeoAlgorithmExecutionException
from processing.parameters.ParameterVector import ParameterVector
from processing.parameters.ParameterString import ParameterString
from processing.parameters.ParameterSelection import ParameterSelection
from processing.outputs.OutputVector import OutputVector
from OgrAlgorithm import OgrAlgorithm
from pyogr.ogr2ogr import *
GeomOperation = Enum(['NONE', 'SEGMENTIZE', 'SIMPLIFY_PRESERVE_TOPOLOGY'])
FORMATS = [
'ESRI Shapefile',
'GeoJSON',
'GeoRSS',
'SQLite',
'GMT',
'MapInfo File',
'INTERLIS 1',
'INTERLIS 2',
'GML',
'Geoconcept',
'DXF',
'DGN',
'CSV',
'BNA',
'S57',
'KML',
'GPX',
'PGDump',
'GPSTrackMaker',
'ODS',
'XLSX',
'PDF',
]
EXTS = [
'.shp',
'.geojson',
'.xml',
'.sqlite',
'.gmt',
'.tab',
'.ili',
'.ili',
'.gml',
'.txt',
'.dxf',
'.dgn',
'.csv',
'.bna',
'.000',
'.kml',
'.gpx',
'.pgdump',
'.gtm',
'.ods',
'.xlsx',
'.pdf',
]
class Ogr2Ogr(OgrAlgorithm):
OUTPUT_LAYER = 'OUTPUT_LAYER'
INPUT_LAYER = 'INPUT_LAYER'
DEST_DS = 'DEST_DS'
DEST_FORMAT = 'DEST_FORMAT'
DEST_DSCO = 'DEST_DSCO'
def defineCharacteristics(self):
self.name = 'Convert format'
self.group = '[OGR] Conversion'
self.addParameter(ParameterVector(self.INPUT_LAYER, 'Input layer',
[ParameterVector.VECTOR_TYPE_ANY], False))
self.addParameter(ParameterSelection(self.DEST_FORMAT,
'Destination Format', FORMATS))
self.addParameter(ParameterString(self.DEST_DSCO, 'Creation Options',
''))
self.addOutput(OutputVector(self.OUTPUT_LAYER, 'Output layer'))
def commandLineName(self):
return "gdalogr:ogr2ogr"
def processAlgorithm(self, progress):
if not gdalAvailable:
raise GeoAlgorithmExecutionException(
'GDAL bindings not installed.')
input = self.getParameterValue(self.INPUT_LAYER)
ogrLayer = self.ogrConnectionString(input)
output = self.getOutputFromName(self.OUTPUT_LAYER)
outfile = output.value
formatIdx = self.getParameterValue(self.DEST_FORMAT)
ext = EXTS[formatIdx]
if not outfile.endswith(ext):
outfile = outfile + ext
output.value = outfile
dst_ds = self.ogrConnectionString(outfile)
dst_format = FORMATS[formatIdx]
ogr_dsco = [self.getParameterValue(self.DEST_DSCO)]
poDS = ogr.Open(ogrLayer, False)
if poDS is None:
raise GeoAlgorithmExecutionException(self.failure(ogrLayer))
if dst_format == 'SQLite' and os.path.isfile(dst_ds):
os.remove(dst_ds)
driver = ogr.GetDriverByName(str(dst_format))
poDstDS = driver.CreateDataSource(dst_ds, options=ogr_dsco)
if poDstDS is None:
raise GeoAlgorithmExecutionException('Error creating %s' % dst_ds)
return
self.ogrtransform(poDS, poDstDS, bOverwrite=True)
def ogrtransform(
self,
poSrcDS,
poDstDS,
papszLayers=[],
papszLCO=[],
bTransform=False,
bAppend=False,
bUpdate=False,
bOverwrite=False,
poOutputSRS=None,
poSourceSRS=None,
pszNewLayerName=None,
pszWHERE=None,
papszSelFields=None,
eGType=-2,
eGeomOp=GeomOperation.NONE,
dfGeomOpParam=0,
papszFieldTypesToString=[],
pfnProgress=None,
pProgressData=None,
nCountLayerFeatures=0,
poClipSrc=None,
poClipDst=None,
bExplodeCollections=False,
pszZField=None,
):
# Process each data source layer
if len(papszLayers) == 0:
nLayerCount = poSrcDS.GetLayerCount()
papoLayers = [None for i in range(nLayerCount)]
iLayer = 0
for iLayer in range(nLayerCount):
poLayer = poSrcDS.GetLayer(iLayer)
if poLayer is None:
raise GeoAlgorithmExecutionException(
"FAILURE: Couldn't fetch advertised layer %d!"
% iLayer)
papoLayers[iLayer] = poLayer
iLayer = iLayer + 1
else:
# Process specified data source layers
nLayerCount = len(papszLayers)
papoLayers = [None for i in range(nLayerCount)]
iLayer = 0
for layername in papszLayers:
poLayer = poSrcDS.GetLayerByName(layername)
if poLayer is None:
raise GeoAlgorithmExecutionException(
"FAILURE: Couldn't fetch advertised layer %s!"
% layername)
papoLayers[iLayer] = poLayer
iLayer = iLayer + 1
for poSrcLayer in papoLayers:
ok = TranslateLayer(
poSrcDS,
poSrcLayer,
poDstDS,
papszLCO,
pszNewLayerName,
bTransform,
poOutputSRS,
poSourceSRS,
papszSelFields,
bAppend,
eGType,
bOverwrite,
eGeomOp,
dfGeomOpParam,
papszFieldTypesToString,
nCountLayerFeatures,
poClipSrc,
poClipDst,
bExplodeCollections,
pszZField,
pszWHERE,
pfnProgress,
pProgressData,
)
return True