| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,47 @@ | ||
| from sextante.core.GeoAlgorithm import GeoAlgorithm | ||
| from sextante.core.QGisLayers import QGisLayers | ||
| from qgis.core import * | ||
| from PyQt4.QtCore import * | ||
| from PyQt4.QtGui import * | ||
| import string | ||
| import re | ||
| import ogr | ||
|
|
||
| class OgrAlgorithm(GeoAlgorithm): | ||
|
|
||
| DB = "DB" | ||
|
|
||
| def ogrConnectionString(self, uri): | ||
| ogrstr = None | ||
|
|
||
| layer = QGisLayers.getObjectFromUri(uri, False) | ||
| if layer == None: | ||
| return uri; | ||
| provider = layer.dataProvider().name() | ||
| qDebug("inputLayer provider '%s'" % provider) | ||
| #qDebug("inputLayer layer '%s'" % layer.providerKey()) | ||
| qDebug("inputLayer.source '%s'" % layer.source()) | ||
| if provider == 'spatialite': | ||
| #dbname='/geodata/osm_ch.sqlite' table="places" (Geometry) sql= | ||
| regex = re.compile("dbname='(.+)'") | ||
| r = regex.search(str(layer.source())) | ||
| ogrstr = r.groups()[0] | ||
| elif provider == 'postgres': | ||
| #dbname='ktryjh_iuuqef' host=spacialdb.com port=9999 user='ktryjh_iuuqef' password='xyqwer' sslmode=disable key='gid' estimatedmetadata=true srid=4326 type=MULTIPOLYGON table="t4" (geom) sql= | ||
| s = re.sub(''' sslmode=.+''', '', str(layer.source())) | ||
| ogrstr = 'PG:%s' % s | ||
| else: | ||
| ogrstr = str(layer.source()) | ||
| return ogrstr | ||
|
|
||
| def drivers(self): | ||
| list = [] | ||
| for iDriver in range(ogr.GetDriverCount()): | ||
| list.append("%s" % ogr.GetDriver(iDriver).GetName()) | ||
| return list | ||
|
|
||
| def failure(self, pszDataSource): | ||
| out = ( "FAILURE:\n" | ||
| "Unable to open datasource `%s' with the following drivers.\n" % pszDataSource ) | ||
| out = out + string.join(map(lambda d: "->"+d, self.drivers()), '\n') | ||
| return out |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,59 @@ | ||
| # -*- coding: utf-8 -*- | ||
|
|
||
| """ | ||
| *************************************************************************** | ||
| translate.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. * | ||
| * * | ||
| *************************************************************************** | ||
| """ | ||
| from sextante.parameters.ParameterString import ParameterString | ||
|
|
||
| __author__ = 'Victor Olaya' | ||
| __date__ = 'August 2012' | ||
| __copyright__ = '(C) 2012, Victor Olaya' | ||
| # This will get replaced with a git SHA1 when you do a git archive | ||
| __revision__ = '$Format:%H$' | ||
|
|
||
| from PyQt4 import QtGui | ||
| from sextante.core.GeoAlgorithm import GeoAlgorithm | ||
| from sextante.parameters.ParameterRaster import ParameterRaster | ||
| from sextante.outputs.OutputRaster import OutputRaster | ||
| import os | ||
| from sextante.gdal.GdalUtils import GdalUtils | ||
|
|
||
| class gdaladdo(GeoAlgorithm): | ||
|
|
||
| INPUT = "INPUT" | ||
| LEVELS = "LEVELS" | ||
| OUTPUT = "OUTPUT" | ||
|
|
||
|
|
||
| def getIcon(self): | ||
| filepath = os.path.dirname(__file__) + "/icons/raster-overview.png" | ||
| return QtGui.QIcon(filepath) | ||
|
|
||
| def defineCharacteristics(self): | ||
| self.name = "Build pyramids (overviews)" | ||
| self.group = "[GDAL] Miscellaneous" | ||
| self.addParameter(ParameterRaster(gdaladdo.INPUT, "Input layer", False)) | ||
| self.addParameter(ParameterString(gdaladdo.LEVELS, "Overview levels", "2 4 8 16")) | ||
| self.addOutput(OutputRaster(gdaladdo.OUTPUT, "Output layer", True)) | ||
|
|
||
| def processAlgorithm(self, progress): | ||
| commands = ["gdaladdo"] | ||
| input = self.getParameterValue(gdaladdo.INPUT) | ||
| self.setOutputValue(gdaladdo.OUTPUT, input) | ||
| commands.append(input) | ||
| commands.append(self.getParameterValue(gdaladdo.LEVELS)) | ||
|
|
||
| GdalUtils.runGdal(commands, progress) |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,163 @@ | ||
|
|
||
| from sextante.outputs.OutputVector import OutputVector | ||
| from sextante.parameters.ParameterVector import ParameterVector | ||
| from sextante.parameters.ParameterString import ParameterString | ||
| from sextante.core.SextanteLog import SextanteLog | ||
| from sextante.core.QGisLayers import QGisLayers | ||
| from sextante.gdal.OgrAlgorithm import OgrAlgorithm | ||
| from sextante.gdal.pyogr.ogr2ogr import * | ||
| from qgis.core import * | ||
| from PyQt4.QtCore import * | ||
| from PyQt4.QtGui import * | ||
| import string | ||
| from string import Template | ||
| import re | ||
| import os | ||
| import tempfile | ||
| import ogr | ||
| import gdal | ||
| import osr | ||
|
|
||
|
|
||
| GeomOperation = Enum(["NONE", "SEGMENTIZE", "SIMPLIFY_PRESERVE_TOPOLOGY"]) | ||
|
|
||
|
|
||
| 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 = "ogr2ogr" | ||
| self.group = "[OGR] Transformation" | ||
|
|
||
| #we add the input vector layer. It can have any kind of geometry | ||
| #It is a mandatory (not optional) one, hence the False argument | ||
| self.addParameter(ParameterVector(self.INPUT_LAYER, "Input layer", ParameterVector.VECTOR_TYPE_ANY, False)) | ||
| #self.addParameter(ParameterString(self.DEST_DS, "Output DS", "/tmp/out.sqlite")) | ||
| self.addParameter(ParameterString(self.DEST_FORMAT, "Destination Format", "ESRI Shapefile")) #SQLite | ||
| self.addParameter(ParameterString(self.DEST_DSCO, "Creation Options", "")) #SPATIALITE=YES | ||
|
|
||
| self.addOutput(OutputVector(self.OUTPUT_LAYER, "Output layer")) | ||
|
|
||
| def processAlgorithm(self, progress): | ||
| '''Here is where the processing itself takes place''' | ||
|
|
||
| input = self.getParameterValue(self.INPUT_LAYER) | ||
| ogrLayer = self.ogrConnectionString(input) | ||
| output = self.getOutputValue(self.OUTPUT_LAYER) | ||
|
|
||
| #dst_ds = self.getParameterValue(self.DEST_DS) | ||
| dst_ds = self.ogrConnectionString(output) | ||
| dst_format = self.getParameterValue(self.DEST_FORMAT) | ||
| ogr_dsco = [self.getParameterValue(self.DEST_DSCO)] #TODO: split | ||
| #dst_ds = "PG:dbname='glarus_np' options='-c client_encoding=LATIN9'" | ||
| #dst_format ="PostgreSQL" | ||
|
|
||
| qDebug("Opening data source '%s'" % ogrLayer) | ||
| poDS = ogr.Open( ogrLayer, False ) | ||
| if poDS is None: | ||
| SextanteLog.addToLog(SextanteLog.LOG_ERROR, self.failure(ogrLayer)) | ||
| return | ||
|
|
||
| srs = osr.SpatialReference() | ||
| srs.ImportFromEPSG( 21781 ) #FIXME | ||
| qDebug("Creating output '%s'" % dst_ds) | ||
| if dst_format == "SQLite" and os.path.isfile(dst_ds): | ||
| os.remove(dst_ds) | ||
| qDebug("Using driver '%s'" % dst_format) | ||
| driver = ogr.GetDriverByName(dst_format) | ||
| poDstDS = driver.CreateDataSource(dst_ds, options = ogr_dsco) | ||
| if poDstDS is None: | ||
| SextanteLog.addToLog(SextanteLog.LOG_ERROR, "Error creating %s" % dst_ds) | ||
| return | ||
| self.ogrtransform(poDS, poDstDS, bOverwrite = True) | ||
| #ogr2ogr(pszFormat = dst_format, pszDataSource = poDS, pszDestDataSource = poDstDS, bOverwrite = True) | ||
|
|
||
| def transformed_template(self, template, substitutions): | ||
| vrt_templ = Template(open(template).read()) | ||
| vrt_xml = vrt_templ.substitute(substitutions) | ||
| vrt = tempfile.mktemp( '.vrt', 'ogr_', '/vsimem') | ||
| # Create in-memory file | ||
| gdal.FileFromMemBuffer(vrt, vrt_xml) | ||
| return vrt | ||
|
|
||
| def transformed_datasource(self, template, substitutions): | ||
| vrt = transformed_template(template, substitutions) | ||
| ds = ogr.Open(vrt) | ||
| return ds | ||
|
|
||
| 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: | ||
| SextanteLog.addToLog(SextanteLog.LOG_ERROR, "FAILURE: Couldn't fetch advertised layer %d!" % iLayer) | ||
| return False | ||
|
|
||
| papoLayers[iLayer] = poLayer | ||
| iLayer = iLayer + 1 | ||
|
|
||
| # Process specified data source layers | ||
| else: | ||
| nLayerCount = len(papszLayers) | ||
| papoLayers = [None for i in range(nLayerCount)] | ||
| iLayer = 0 | ||
|
|
||
| for layername in papszLayers: | ||
| poLayer = poSrcDS.GetLayerByName(layername) | ||
|
|
||
| if poLayer is None: | ||
| SextanteLog.addToLog(SextanteLog.LOG_ERROR, "FAILURE: Couldn't fetch advertised layer %s!" % layername) | ||
| return False | ||
|
|
||
| papoLayers[iLayer] = poLayer | ||
| iLayer = iLayer + 1 | ||
|
|
||
| for poSrcLayer in papoLayers: | ||
| qDebug(poSrcLayer.GetLayerDefn().GetName()) | ||
| #TODO: poDstDS.GetLayerByName for VRT layer fails if name is not lower case | ||
|
|
||
| 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 | ||
|
|
||
|
|
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,132 @@ | ||
| from sextante.outputs.OutputHTML import OutputHTML | ||
| from sextante.parameters.ParameterVector import ParameterVector | ||
| from qgis.core import * | ||
| from PyQt4.QtCore import * | ||
| from PyQt4.QtGui import * | ||
| import string | ||
| import re | ||
| import ogr | ||
| from sextante.gdal.OgrAlgorithm import OgrAlgorithm | ||
|
|
||
| class OgrInfo(OgrAlgorithm): | ||
|
|
||
| #constants used to refer to parameters and outputs. | ||
| #They will be used when calling the algorithm from another algorithm, | ||
| #or when calling SEXTANTE from the QGIS console. | ||
| OUTPUT = "OUTPUT" | ||
| INPUT_LAYER = "INPUT_LAYER" | ||
|
|
||
| def defineCharacteristics(self): | ||
| self.name = "ogrinfo" | ||
| self.group = "[OGR] Miscellaneous" | ||
|
|
||
| self.addParameter(ParameterVector(self.INPUT_LAYER, "Input layer", ParameterVector.VECTOR_TYPE_ANY, False)) | ||
|
|
||
| self.addOutput(OutputHTML(self.OUTPUT, "Layer information")) | ||
|
|
||
|
|
||
| def processAlgorithm(self, progress): | ||
|
|
||
| input = self.getParameterValue(self.INPUT_LAYER) | ||
| ogrLayer = self.ogrConnectionString(input) | ||
|
|
||
| output = self.getOutputValue(self.OUTPUT) | ||
|
|
||
| self.ogrinfo( ogrLayer ) | ||
|
|
||
| f = open(output, "w") | ||
| f.write("<pre>" + self.info + "</pre>") | ||
| f.close() | ||
|
|
||
| def out(self, text): | ||
| self.info = self.info + text + '\n' | ||
|
|
||
| def ogrinfo(self, pszDataSource): | ||
| bVerbose = True | ||
| bSummaryOnly = True | ||
| self.info = '' | ||
|
|
||
| qDebug("Opening data source '%s'" % pszDataSource) | ||
| poDS = ogr.Open( pszDataSource, False ) | ||
|
|
||
| if poDS is None: | ||
| self.info = self.failure(pszDataSource) | ||
| return | ||
|
|
||
| poDriver = poDS.GetDriver() | ||
|
|
||
| if bVerbose: | ||
| self.out( "INFO: Open of `%s'\n" | ||
| " using driver `%s' successful." % (pszDataSource, poDriver.GetName()) ) | ||
|
|
||
| poDS_Name = poDS.GetName() | ||
| if str(type(pszDataSource)) == "<type 'unicode'>" and str(type(poDS_Name)) == "<type 'str'>": | ||
| poDS_Name = unicode(poDS_Name, "utf8") | ||
| if bVerbose and pszDataSource != poDS_Name: | ||
| self.out( "INFO: Internal data source name `%s'\n" | ||
| " different from user name `%s'." % (poDS_Name, pszDataSource )) | ||
| #/* -------------------------------------------------------------------- */ | ||
| #/* Process each data source layer. */ | ||
| #/* -------------------------------------------------------------------- */ | ||
| for iLayer in range(poDS.GetLayerCount()): | ||
| poLayer = poDS.GetLayer(iLayer) | ||
|
|
||
| if poLayer is None: | ||
| self.out( "FAILURE: Couldn't fetch advertised layer %d!" % iLayer ) | ||
| return 1 | ||
|
|
||
| self.ReportOnLayer( poLayer ) | ||
|
|
||
| def ReportOnLayer( self, poLayer, pszWHERE=None, poSpatialFilter=None ): | ||
| bVerbose = True | ||
|
|
||
| poDefn = poLayer.GetLayerDefn() | ||
|
|
||
| #/* -------------------------------------------------------------------- */ | ||
| #/* Set filters if provided. */ | ||
| #/* -------------------------------------------------------------------- */ | ||
| if pszWHERE is not None: | ||
| if poLayer.SetAttributeFilter( pszWHERE ) != 0: | ||
| self.out("FAILURE: SetAttributeFilter(%s) failed." % pszWHERE) | ||
| return | ||
|
|
||
| if poSpatialFilter is not None: | ||
| poLayer.SetSpatialFilter( poSpatialFilter ) | ||
|
|
||
| #/* -------------------------------------------------------------------- */ | ||
| #/* Report various overall information. */ | ||
| #/* -------------------------------------------------------------------- */ | ||
| self.out( "" ) | ||
|
|
||
| self.out( "Layer name: %s" % poDefn.GetName() ) | ||
|
|
||
| if bVerbose: | ||
| self.out( "Geometry: %s" % ogr.GeometryTypeToName( poDefn.GetGeomType() ) ) | ||
|
|
||
| self.out( "Feature Count: %d" % poLayer.GetFeatureCount() ) | ||
|
|
||
| oExt = poLayer.GetExtent(True, can_return_null = True) | ||
| if oExt is not None: | ||
| self.out("Extent: (%f, %f) - (%f, %f)" % (oExt[0], oExt[1], oExt[2], oExt[3])) | ||
|
|
||
| if poLayer.GetSpatialRef() is None: | ||
| pszWKT = "(unknown)" | ||
| else: | ||
| pszWKT = poLayer.GetSpatialRef().ExportToPrettyWkt() | ||
|
|
||
| self.out( "Layer SRS WKT:\n%s" % pszWKT ) | ||
|
|
||
| if len(poLayer.GetFIDColumn()) > 0: | ||
| self.out( "FID Column = %s" % poLayer.GetFIDColumn() ) | ||
|
|
||
| if len(poLayer.GetGeometryColumn()) > 0: | ||
| self.out( "Geometry Column = %s" % poLayer.GetGeometryColumn() ) | ||
|
|
||
| for iAttr in range(poDefn.GetFieldCount()): | ||
| poField = poDefn.GetFieldDefn( iAttr ) | ||
|
|
||
| self.out( "%s: %s (%d.%d)" % ( \ | ||
| poField.GetNameRef(), \ | ||
| poField.GetFieldTypeName( poField.GetType() ), \ | ||
| poField.GetWidth(), \ | ||
| poField.GetPrecision() )) |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,93 @@ | ||
| from sextante.outputs.OutputHTML import OutputHTML | ||
| from sextante.parameters.ParameterVector import ParameterVector | ||
| from sextante.parameters.ParameterString import ParameterString | ||
| from sextante.core.SextanteLog import SextanteLog | ||
|
|
||
| from qgis.core import * | ||
| from PyQt4.QtCore import * | ||
| from PyQt4.QtGui import * | ||
| import string | ||
| import re | ||
| import ogr | ||
| from sextante.gdal.OgrAlgorithm import OgrAlgorithm | ||
|
|
||
| class OgrSql(OgrAlgorithm): | ||
|
|
||
| #constants used to refer to parameters and outputs. | ||
| #They will be used when calling the algorithm from another algorithm, | ||
| #or when calling SEXTANTE from the QGIS console. | ||
| OUTPUT = "OUTPUT" | ||
| INPUT_LAYER = "INPUT_LAYER" | ||
| SQL = "SQL" | ||
|
|
||
| def defineCharacteristics(self): | ||
| self.name = "Execute SQL" | ||
| self.group = "[OGR] Miscellaneous" | ||
|
|
||
| #we add the input vector layer. It can have any kind of geometry | ||
| #It is a mandatory (not optional) one, hence the False argument | ||
| self.addParameter(ParameterVector(self.INPUT_LAYER, "Input layer", ParameterVector.VECTOR_TYPE_ANY, False)) | ||
| self.addParameter(ParameterString(self.SQL, "SQL", "")) | ||
|
|
||
| self.addOutput(OutputHTML(self.OUTPUT, "SQL result")) | ||
|
|
||
|
|
||
| def processAlgorithm(self, progress): | ||
| input = self.getParameterValue(self.INPUT_LAYER) | ||
| sql = self.getParameterValue(self.SQL) | ||
| ogrLayer = self.ogrConnectionString(input) | ||
|
|
||
| output = self.getOutputValue(self.OUTPUT) | ||
|
|
||
| qDebug("Opening data source '%s'" % ogrLayer) | ||
| poDS = ogr.Open( ogrLayer, False ) | ||
| if poDS is None: | ||
| SextanteLog.addToLog(SextanteLog.LOG_ERROR, self.failure(ogrLayer)) | ||
| return | ||
|
|
||
| result = self.select_values(poDS, sql) | ||
|
|
||
| f = open(output, "w") | ||
| f.write("<table>") | ||
| for row in result: | ||
| f.write("<tr>") | ||
| for col in row: | ||
| f.write("<td>"+col+"</td>") | ||
| f.write("</tr>") | ||
| f.write("</table>") | ||
| f.close() | ||
|
|
||
| def execute_sql(self, ds, sql_statement): | ||
| poResultSet = ds.ExecuteSQL( sql_statement, None, None ) | ||
| if poResultSet is not None: | ||
| ds.ReleaseResultSet( poResultSet ) | ||
|
|
||
| def select_values(self, ds, sql_statement): | ||
| """Returns an array of the columns and values of select statement: | ||
| select_values(ds, "SELECT id FROM companies") => [['id'],[1],[2],[3]] | ||
| """ | ||
| poResultSet = ds.ExecuteSQL( sql_statement, None, None ) | ||
| #TODO: redirect error messages | ||
| fields = [] | ||
| rows = [] | ||
| if poResultSet is not None: | ||
| poDefn = poResultSet.GetLayerDefn() | ||
| for iField in range(poDefn.GetFieldCount()): | ||
| poFDefn = poDefn.GetFieldDefn(iField) | ||
| fields.append(poFDefn.GetNameRef()) | ||
| #poGeometry = poFeature.GetGeometryRef() | ||
| #if poGeometry is not None: | ||
| # line = (" %s = [GEOMETRY]" % poGeometry.GetGeometryName() ) | ||
|
|
||
| poFeature = poResultSet.GetNextFeature() | ||
| while poFeature is not None: | ||
| values = [] | ||
| for iField in range(poDefn.GetFieldCount()): | ||
| if poFeature.IsFieldSet( iField ): | ||
| values.append(poFeature.GetFieldAsString( iField )) | ||
| else: | ||
| values.append("(null)") | ||
| rows.append(values) | ||
| poFeature = poResultSet.GetNextFeature() | ||
| ds.ReleaseResultSet( poResultSet ) | ||
| return [fields] + rows |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,3 @@ | ||
| FILE(GLOB PY_FILES *.py) | ||
|
|
||
| PLUGIN_INSTALL(sextante ./gdal/pyogr ${PY_FILES}) |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,44 @@ | ||
| import ogr | ||
|
|
||
| class OgrDs: | ||
|
|
||
| def __init__(self, format, ds): | ||
| self.open(format, ds) | ||
|
|
||
| def open(self, format, ds): | ||
| driver = ogr.GetDriverByName(format) | ||
| self.ds = driver.CreateDataSource(ds) | ||
| return self.ds | ||
|
|
||
| def close(self): | ||
| if self.ds is not None: | ||
| self.ds.Destroy() | ||
|
|
||
| def execute_sql(self, sql_statement): | ||
| poResultSet = self.ds.ExecuteSQL( sql_statement, None, None ) | ||
| if poResultSet is not None: | ||
| self.ds.ReleaseResultSet( poResultSet ) | ||
|
|
||
| def select_values(self, sql_statement): | ||
| """Returns an array of the values of the first column in a select: | ||
| select_values(ds, "SELECT id FROM companies LIMIT 3") => [1,2,3] | ||
| """ | ||
| values = [] | ||
| poResultSet = self.ds.ExecuteSQL( sql_statement, None, None ) | ||
| if poResultSet is not None: | ||
| poDefn = poResultSet.GetLayerDefn() | ||
| poFeature = poResultSet.GetNextFeature() | ||
| while poFeature is not None: | ||
| for iField in range(poDefn.GetFieldCount()): | ||
| values.append( poFeature.GetFieldAsString( iField ) ) | ||
| poFeature = poResultSet.GetNextFeature() | ||
| self.ds.ReleaseResultSet( poResultSet ) | ||
| return values | ||
|
|
||
| def table_exists(self, table): | ||
| exists = True | ||
| try: | ||
| self.ds.ExecuteSQL( "SELECT 1 FROM %s" % table, None, None ) | ||
| except: | ||
| exists = False | ||
| return exists |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,153 @@ | ||
| # Based on ogr2vrt.py implementation by Frank Warmerdam included in GDAL/OGR | ||
| import string | ||
| import re | ||
| import cgi | ||
| import sys | ||
| import ogr | ||
| import gdal | ||
| from string import Template | ||
| import os | ||
| import tempfile | ||
|
|
||
| def GeomType2Name( type ): | ||
| if type == ogr.wkbUnknown: | ||
| return 'wkbUnknown' | ||
| elif type == ogr.wkbPoint: | ||
| return 'wkbPoint' | ||
| elif type == ogr.wkbLineString: | ||
| return 'wkbLineString' | ||
| elif type == ogr.wkbPolygon: | ||
| return 'wkbPolygon' | ||
| elif type == ogr.wkbMultiPoint: | ||
| return 'wkbMultiPoint' | ||
| elif type == ogr.wkbMultiLineString: | ||
| return 'wkbMultiLineString' | ||
| elif type == ogr.wkbMultiPolygon: | ||
| return 'wkbMultiPolygon' | ||
| elif type == ogr.wkbGeometryCollection: | ||
| return 'wkbGeometryCollection' | ||
| elif type == ogr.wkbNone: | ||
| return 'wkbNone' | ||
| elif type == ogr.wkbLinearRing: | ||
| return 'wkbLinearRing' | ||
| else: | ||
| return 'wkbUnknown' | ||
|
|
||
| ############################################################################# | ||
| def Esc(x): | ||
| return gdal.EscapeString( x, gdal.CPLES_XML ) | ||
|
|
||
| def transformed_template(template, substitutions): | ||
| vrt_templ = Template(open(template).read()) | ||
| vrt_xml = vrt_templ.substitute(substitutions) | ||
| vrt = tempfile.mktemp( '.vrt', 'ogr_', '/vsimem') | ||
| # Create in-memory file | ||
| gdal.FileFromMemBuffer(vrt, vrt_xml) | ||
| return vrt | ||
|
|
||
| def free_template(vrt): | ||
| # Free memory associated with the in-memory file | ||
| gdal.Unlink(vrt) | ||
|
|
||
| def transformed_datasource(template, substitutions): | ||
| vrt = transformed_template(template, substitutions) | ||
| ds = ogr.Open(vrt) | ||
| return ds | ||
|
|
||
| def close_datasource(ds): | ||
| if ds is not None: | ||
| ds.Destroy() | ||
|
|
||
| def ogr2vrt(infile, | ||
| outfile = None, | ||
| layer_list = [], | ||
| relative = "0", | ||
| schema=0): | ||
|
|
||
| ############################################################################# | ||
| # Open the datasource to read. | ||
|
|
||
| src_ds = ogr.Open( infile, update = 0 ) | ||
|
|
||
| if src_ds is None: | ||
| return None | ||
|
|
||
| if schema: | ||
| infile = '@dummy@' | ||
|
|
||
| if len(layer_list) == 0: | ||
| for layer in src_ds: | ||
| layer_list.append( layer.GetLayerDefn().GetName() ) | ||
|
|
||
| ############################################################################# | ||
| # Start the VRT file. | ||
|
|
||
| vrt = '<OGRVRTDataSource>\n' | ||
|
|
||
| ############################################################################# | ||
| # Process each source layer. | ||
|
|
||
| for name in layer_list: | ||
| layer = src_ds.GetLayerByName(name) | ||
| layerdef = layer.GetLayerDefn() | ||
|
|
||
| vrt += ' <OGRVRTLayer name="%s">\n' % Esc(name) | ||
| vrt += ' <SrcDataSource relativeToVRT="%s" shared="%d">%s</SrcDataSource>\n' \ | ||
| % (relative,not schema,Esc(infile)) | ||
| if schema: | ||
| vrt += ' <SrcLayer>@dummy@</SrcLayer>\n' | ||
| else: | ||
| vrt += ' <SrcLayer>%s</SrcLayer>\n' % Esc(name) | ||
| vrt += ' <GeometryType>%s</GeometryType>\n' \ | ||
| % GeomType2Name(layerdef.GetGeomType()) | ||
| srs = layer.GetSpatialRef() | ||
| if srs is not None: | ||
| vrt += ' <LayerSRS>%s</LayerSRS>\n' \ | ||
| % (Esc(srs.ExportToWkt())) | ||
|
|
||
| # Process all the fields. | ||
| for fld_index in range(layerdef.GetFieldCount()): | ||
| src_fd = layerdef.GetFieldDefn( fld_index ) | ||
| if src_fd.GetType() == ogr.OFTInteger: | ||
| type = 'Integer' | ||
| elif src_fd.GetType() == ogr.OFTString: | ||
| type = 'String' | ||
| elif src_fd.GetType() == ogr.OFTReal: | ||
| type = 'Real' | ||
| elif src_fd.GetType() == ogr.OFTStringList: | ||
| type = 'StringList' | ||
| elif src_fd.GetType() == ogr.OFTIntegerList: | ||
| type = 'IntegerList' | ||
| elif src_fd.GetType() == ogr.OFTRealList: | ||
| type = 'RealList' | ||
| elif src_fd.GetType() == ogr.OFTBinary: | ||
| type = 'Binary' | ||
| elif src_fd.GetType() == ogr.OFTDate: | ||
| type = 'Date' | ||
| elif src_fd.GetType() == ogr.OFTTime: | ||
| type = 'Time' | ||
| elif src_fd.GetType() == ogr.OFTDateTime: | ||
| type = 'DateTime' | ||
| else: | ||
| type = 'String' | ||
|
|
||
| vrt += ' <Field name="%s" type="%s"' \ | ||
| % (Esc(src_fd.GetName()), type) | ||
| if not schema: | ||
| vrt += ' src="%s"' % Esc(src_fd.GetName()) | ||
| if src_fd.GetWidth() > 0: | ||
| vrt += ' width="%d"' % src_fd.GetWidth() | ||
| if src_fd.GetPrecision() > 0: | ||
| vrt += ' precision="%d"' % src_fd.GetPrecision() | ||
| vrt += '/>\n' | ||
|
|
||
| vrt += ' </OGRVRTLayer>\n' | ||
|
|
||
| vrt += '</OGRVRTDataSource>\n' | ||
|
|
||
| if outfile is not None: | ||
| f = open(outfile, "w") | ||
| f.write(vrt) | ||
| f.close() | ||
|
|
||
| return vrt |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,3 +1,5 @@ | ||
| FILE(GLOB PY_FILES *.py) | ||
| FILE(GLOB MODEL_FILES models/*.modeñ) | ||
|
|
||
| PLUGIN_INSTALL(sextante ./modeler ${PY_FILES}) | ||
| PLUGIN_INSTALL(sextante ./modeler/models ${MODEL_FILES}) |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,11 @@ | ||
| EdisonMeanShiftSegmentation | ||
| otbcli_Segmentation | ||
| Edison Mean Shift segmentation (labeled raster output) | ||
| Segmentation | ||
| ParameterRaster|-filter edison -in|Input Image|False | ||
| ParameterNumber|-filter.edison.spatialr|Spatial radius|None|None|5 | ||
| ParameterNumber|-filter.edison.ranger|Range radius|None|None|15.0 | ||
| ParameterNumber|-filter.edison.minsize|Min region size|0|None|100 | ||
| ParameterNumber|-filter.edison.scale|Scale Factor|0|None|1.0 | ||
| OutputRaster|-mode raster -mode.raster.out|Output labeled image | ||
|
|
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,21 @@ | ||
| EdisonMeanShiftSegmentationVector | ||
| otbcli_Segmentation | ||
| Edison Mean Shift segmentation (large-scale, vector output) | ||
| Segmentation | ||
| ParameterRaster|-filter edison -in|Input Image|False | ||
| ParameterNumber|-filter.edison.spatialr|Spatial radius|None|None|5 | ||
| ParameterNumber|-filter.edison.ranger|Range radius|None|None|15.0 | ||
| ParameterNumber|-filter.edison.minsize|Min region size|0|None|100 | ||
| ParameterNumber|-filter.edison.scale|Scale Factor|0|None|1.0 | ||
| OutputVector|-mode vector -mode.vector.out|Output vector file | ||
| ParameterVector|-mode.vector.inmask|Mask Image|-1|True | ||
| ParameterBoolean|-mode.vector.neighbor|8-neighbor connectivity|False | ||
| ParameterBoolean|-mode.vector.stitch|Stitch polygons|True | ||
| ParameterNumber|-mode.vector.minsize|Minimum object size|1|None|1 | ||
| ParameterNumber|-mode.vector.simplify|Simplify polygons|None|None|0.0 | ||
| ParameterString|-mode.vector.layername|Layer name |layer | ||
| ParemeterString|-mode.vector.fieldname|Geometry index field name|DN | ||
| ParameterNumber|-mode.vector.tilesize|Tile size|0|None|1024 | ||
| ParameterNumber|-mode.vector.startlabel|Starting geometry index|1|None|1 | ||
| ParameterSelection|-mode.vector.outmode|Writing mode (update file/overwrite file/overwrite layer/update layer)|ulco;ovw;ulovw;ulu|0 | ||
| ParameterString|-mode.vector.ogroptions|OGR options for layer creation| |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,13 +1,12 @@ | ||
| MeanShiftSegmentation | ||
| otbcli_Segmentation | ||
| Mean Shift segmentation (labeled raster output) | ||
| Segmentation | ||
| ParameterRaster|-filter meanshift -in|Input Image|False | ||
| ParameterNumber|-filter.meanshift.spatialr|Spatial radius|None|None|5 | ||
| ParameterNumber|-filter.meanshift.thres|Mode convergence threshold|None|None|0.1 | ||
| ParameterNumber|-filter.meanshift.ranger|Range radius|None|None|15.0 | ||
| ParameterNumber|-filter.meanshift.minsize|Min region size|0|None|100 | ||
| ParameterNumber|-filter.meanshift.maxiter|Maximum number of iterations|0|None|100 | ||
| OutputRaster|-mode raster -mode.raster.out|Output labeled image | ||
|
|
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,22 @@ | ||
| MeanShiftSegmentationVector | ||
| otbcli_Segmentation | ||
| Mean Shift segmentation (large-scale, vector output) | ||
| Segmentation | ||
| ParameterRaster|-filter meanshift -in|Input Image|False | ||
| ParameterNumber|-filter.meanshift.spatialr|Spatial radius|None|None|5 | ||
| ParameterNumber|-filter.meanshift.thres|Mode convergence threshold|None|None|0.1 | ||
| ParameterNumber|-filter.meanshift.ranger|Range radius|None|None|15.0 | ||
| ParameterNumber|-filter.meanshift.minsize|Min region size|0|None|100 | ||
| ParameterNumber|-filter.meanshift.maxiter|Maximum number of iterations|0|None|100 | ||
| OutputVector|-mode vector -mode.vector.out|Output vector file | ||
| ParameterVector|-mode.vector.inmask|Mask Image|-1|True | ||
| ParameterBoolean|-mode.vector.neighbor|8-neighbor connectivity|False | ||
| ParameterBoolean|-mode.vector.stitch|Stitch polygons|True | ||
| ParameterNumber|-mode.vector.minsize|Minimum object size|1|None|1 | ||
| ParameterNumber|-mode.vector.simplify|Simplify polygons|None|None|0.0 | ||
| ParameterString|-mode.vector.layername|Layer name |layer | ||
| ParemeterString|-mode.vector.fieldname|Geometry index field name|DN | ||
| ParameterNumber|-mode.vector.tilesize|Tile size|0|None|1024 | ||
| ParameterNumber|-mode.vector.startlabel|Starting geometry index|1|None|1 | ||
| ParameterSelection|-mode.vector.outmode|Writing mode (update file/overwrite file/overwrite layer/update layer)|ulco;ovw;ulovw;ulu|0 | ||
| ParameterString|-mode.vector.ogroptions|OGR options for layer creation| |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,8 @@ | ||
| SimpleConnectedComponentsSegmentation | ||
| otbcli_Segmentation | ||
| Simple Connected Components segmentation (labeled raster output) | ||
| Segmentation | ||
| ParameterRaster|-filter cc -in|Input Image|False | ||
| ParameterString|-filter.cc.expr|Condition| | ||
| OutputRaster|-mode raster -mode.raster.out|Output labeled image | ||
|
|
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,18 @@ | ||
| SimpleConnectedComponentsSegmentationVector | ||
| otbcli_Segmentation | ||
| Simple Connected Components segmentation (large-scale, vector output) | ||
| Segmentation | ||
| ParameterRaster|-filter cc -in|Input Image|False | ||
| ParameterString|-filter.cc.expr|Condition| | ||
| OutputVector|-mode vector -mode.vector.out|Output vector file | ||
| ParameterVector|-mode.vector.inmask|Mask Image|-1|True | ||
| ParameterBoolean|-mode.vector.neighbor|8-neighbor connectivity|False | ||
| ParameterBoolean|-mode.vector.stitch|Stitch polygons|True | ||
| ParameterNumber|-mode.vector.minsize|Minimum object size|1|None|1 | ||
| ParameterNumber|-mode.vector.simplify|Simplify polygons|None|None|0.0 | ||
| ParameterString|-mode.vector.layername|Layer name |layer | ||
| ParemeterString|-mode.vector.fieldname|Geometry index field name|DN | ||
| ParameterNumber|-mode.vector.tilesize|Tile size|0|None|1024 | ||
| ParameterNumber|-mode.vector.startlabel|Starting geometry index|1|None|1 | ||
| ParameterSelection|-mode.vector.outmode|Writing mode (update file/overwrite file/overwrite layer/update layer)|ulco;ovw;ulovw;ulu|0 | ||
| ParameterString|-mode.vector.ogroptions|OGR options for layer creation| |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,9 @@ | ||
| WatershedSegmentation | ||
| otbcli_Segmentation | ||
| Watershed segmentation (labeled raster output) | ||
| Segmentation | ||
| ParameterRaster|-filter watershed -in|Input Image|False | ||
| ParameterNumber|-filter.watershed.threshold|Depth Threshold|0|None|0.01 | ||
| ParameterNumber|-filter.watershed.level|Flood level|0|None|0.1 | ||
| OutputRaster|-mode raster -mode.raster.out|Output labeled image | ||
|
|
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,19 @@ | ||
| WatershedSegmentationVector | ||
| otbcli_Segmentation | ||
| Watershed segmentation (large-scale, vector output) | ||
| Segmentation | ||
| ParameterRaster|-filter watershed -in|Input Image|False | ||
| ParameterNumber|-filter.watershed.threshold|Depth Threshold|0|None|0.01 | ||
| ParameterNumber|-filter.watershed.level|Flood level|0|None|0.1 | ||
| OutputVector|-mode vector -mode.vector.out|Output vector file | ||
| ParameterVector|-mode.vector.inmask|Mask Image|-1|True | ||
| ParameterBoolean|-mode.vector.neighbor|8-neighbor connectivity|False | ||
| ParameterBoolean|-mode.vector.stitch|Stitch polygons|True | ||
| ParameterNumber|-mode.vector.minsize|Minimum object size|1|None|1 | ||
| ParameterNumber|-mode.vector.simplify|Simplify polygons|None|None|0.0 | ||
| ParameterString|-mode.vector.layername|Layer name |layer | ||
| ParemeterString|-mode.vector.fieldname|Geometry index field name|DN | ||
| ParameterNumber|-mode.vector.tilesize|Tile size|0|None|1024 | ||
| ParameterNumber|-mode.vector.startlabel|Starting geometry index|1|None|1 | ||
| ParameterSelection|-mode.vector.outmode|Writing mode (update file/overwrite file/overwrite layer/update layer)|ulco;ovw;ulovw;ulu|0 | ||
| ParameterString|-mode.vector.ogroptions|OGR options for layer creation| |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,3 +1,5 @@ | ||
| FILE(GLOB PY_FILES *.py) | ||
|
|
||
| ADD_SUBDIRECTORY(scripts) | ||
|
|
||
| PLUGIN_INSTALL(sextante script ${PY_FILES}) |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,36 @@ | ||
| from qgis.core import * | ||
| from PyQt4.QtCore import * | ||
| from PyQt4.QtGui import * | ||
| from sextante.core.QGisLayers import QGisLayers | ||
| from sextante.core.SextanteVectorWriter import SextanteVectorWriter | ||
|
|
||
| #Here we define the input and outputs | ||
| #==================================== | ||
| ##[Example scripts]=group | ||
| ##input=vector | ||
| ##output=output vector | ||
|
|
||
| #And here is the body of the algorithm | ||
| #======================================= | ||
|
|
||
| #input layers values are always a string with its location. | ||
| #That string can be converted into a QGIS object (a QgsVectorLayer in this case)) | ||
| #using the Sextante.getObjectFromUri() method | ||
| vectorLayer = QGisLayers.getObjectFromUri(input) | ||
|
|
||
| #And now we can process | ||
|
|
||
| #First we create the output layer. | ||
| #To do so, we create a SextanteVectorWriter, that we can later use to add features. | ||
| provider = vectorLayer.dataProvider() | ||
| writer = SextanteVectorWriter(output, None, provider.fields(), provider.geometryType(), provider.crs() ) | ||
|
|
||
| #Now we take the selected features and add them to the output layer | ||
| selection = vectorLayer.selectedFeatures() | ||
| for feat in selection: | ||
| writer.addFeature(feat) | ||
| del writer | ||
|
|
||
| #There is nothing more to do here. We do not have to open the layer that we have created. | ||
| #SEXTANTE will take care of that, or will handle it if this algorithm is executed within | ||
| #a complex model |