74 changes: 0 additions & 74 deletions python/plugins/sextante/algs/SextanteVectorWriter.py

This file was deleted.

5 changes: 2 additions & 3 deletions python/plugins/sextante/core/Sextante.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
* *
***************************************************************************
"""

__author__ = 'Victor Olaya'
__date__ = 'August 2012'
__copyright__ = '(C) 2012, Victor Olaya'
Expand All @@ -43,9 +42,9 @@
from sextante.algs.SextanteAlgorithmProvider import SextanteAlgorithmProvider
from sextante.parameters.ParameterSelection import ParameterSelection
from sextante.ftools.FToolsAlgorithmProvider import FToolsAlgorithmProvider
from sextante.gdal.GdalAlgorithmProvider import GdalAlgorithmProvider
from sextante.grass.GrassAlgorithmProvider import GrassAlgorithmProvider
from sextante.lidar.LidarToolsAlgorithmProvider import LidarToolsAlgorithmProvider
from sextante.gdal.GdalOgrAlgorithmProvider import GdalOgrAlgorithmProvider
from sextante.mmqgisx.MMQGISXAlgorithmProvider import MMQGISXAlgorithmProvider
from sextante.otb.OTBAlgorithmProvider import OTBAlgorithmProvider
from sextante.pymorph.PymorphAlgorithmProvider import PymorphAlgorithmProvider
Expand Down Expand Up @@ -120,7 +119,7 @@ def initialize():
Sextante.addProvider(MMQGISXAlgorithmProvider())
Sextante.addProvider(FToolsAlgorithmProvider())
Sextante.addProvider(ModelerOnlyAlgorithmProvider())
Sextante.addProvider(GdalAlgorithmProvider())
Sextante.addProvider(GdalOgrAlgorithmProvider())
Sextante.addProvider(PymorphAlgorithmProvider())
Sextante.addProvider(LidarToolsAlgorithmProvider())
Sextante.addProvider(OTBAlgorithmProvider())
Expand Down
4 changes: 4 additions & 0 deletions python/plugins/sextante/core/SextanteVectorWriter.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,10 @@ def __init__(self, fileName, encoding, fields, geometryType, crs, options=None):
self.isMemory = False
self.memLayer = None
self.writer = None

if encoding is None:
settings = QSettings()
encoding = settings.value("/SextanteQGIS/encoding", "System").toString()

if self.fileName.startswith(self.MEMORY_LAYER_PREFIX):
self.isMemory = True
Expand Down
1 change: 1 addition & 0 deletions python/plugins/sextante/gdal/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ FILE(GLOB PY_FILES *.py)
FILE(GLOB ICON_FILES icons/*.png)

ADD_SUBDIRECTORY(scripts)
ADD_SUBDIRECTORY(pyogr)

PLUGIN_INSTALL(sextante ./gdal ${PY_FILES})
PLUGIN_INSTALL(sextante ./gdal/icons ${ICON_FILES})
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@
* *
***************************************************************************
"""
from sextante.gdal.gdaladdo import gdaladdo
from sextante.gdal.ogr2ogr import Ogr2Ogr
from sextante.gdal.ogrinfo import OgrInfo
from sextante.gdal.ogrsql import OgrSql

__author__ = 'Victor Olaya'
__date__ = 'August 2012'
Expand All @@ -40,7 +44,7 @@
from sextante.gdal.merge import merge
from sextante.gdal.polygonize import polygonize

class GdalAlgorithmProvider(AlgorithmProvider):
class GdalOgrAlgorithmProvider(AlgorithmProvider):

'''This provider incorporates GDAL-based algorithms into SEXTANTE.
Algorithms have been implemented using two different mechanisms,
Expand All @@ -61,10 +65,10 @@ def scriptsFolder(self):
return os.path.dirname(__file__) + "/scripts"

def getDescription(self):
return "GDAL"
return "GDAL/OGR"

def getName(self):
return "gdal"
return "gdalogr"

def getIcon(self):
return QIcon(os.path.dirname(__file__) + "/icons/gdalicon.png")
Expand All @@ -79,7 +83,9 @@ def _loadAlgorithms(self):
def createAlgsList(self):
#First we populate the list of algorihtms with those created extending
#GeoAlgorithm directly (those that execute GDAL using the console)
self.preloadedAlgs = [nearblack(), information(), warp(), translate(), rgb2pct(), pct2rgb(), merge(), polygonize()]
self.preloadedAlgs = [nearblack(), information(), warp(), translate(),
rgb2pct(), pct2rgb(), merge(), polygonize(), gdaladdo(),
OgrInfo(), Ogr2Ogr(), OgrSql()]
#And then we add those that are created as python scripts
folder = self.scriptsFolder()
for descriptionFile in os.listdir(folder):
Expand All @@ -93,3 +99,6 @@ def createAlgsList(self):

def getSupportedOutputRasterLayerExtensions(self):
return GdalUtils.getSupportedRasterExtensions()

def getSupportedOutputVectorLayerExtensions(self):
return ["shp", "sqlite"]
47 changes: 47 additions & 0 deletions python/plugins/sextante/gdal/OgrAlgorithm.py
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
59 changes: 59 additions & 0 deletions python/plugins/sextante/gdal/gdaladdo.py
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)
4 changes: 2 additions & 2 deletions python/plugins/sextante/gdal/information.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,8 @@ def getIcon(self):
return QtGui.QIcon(filepath)

def defineCharacteristics(self):
self.name = "information"
self.group = "Miscellaneous"
self.name = "Information"
self.group = "[GDAL] Miscellaneous"
self.addParameter(ParameterRaster(information.INPUT, "Input layer", False))
self.addParameter(ParameterBoolean(information.NOGCP, "Suppress GCP info", False))
self.addParameter(ParameterBoolean(information.NOMETADATA, "Suppress metadata info", False))
Expand Down
4 changes: 2 additions & 2 deletions python/plugins/sextante/gdal/merge.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,8 @@ def getIcon(self):
return QtGui.QIcon(filepath)

def defineCharacteristics(self):
self.name = "merge"
self.group = "Miscellaneous"
self.name = "Merge"
self.group = "[GDAL] Miscellaneous"
self.addParameter(ParameterMultipleInput(merge.INPUT, "Input layers", ParameterMultipleInput.TYPE_RASTER))
self.addParameter(ParameterBoolean(merge.PCT, "Grab pseudocolor table from first layer", False))
self.addParameter(ParameterBoolean(merge.SEPARATE, "Layer stack", False))
Expand Down
4 changes: 2 additions & 2 deletions python/plugins/sextante/gdal/nearblack.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,8 @@ def getIcon(self):
return QtGui.QIcon(filepath)

def defineCharacteristics(self):
self.name = "nearblack"
self.group = "Analysis"
self.name = "Nearblack"
self.group = "[GDAL] Analysis"
self.addParameter(ParameterRaster(nearblack.INPUT, "Input layer", False))
self.addParameter(ParameterNumber(nearblack.NEAR, "How far from black (white)", 0, None, 15))
self.addParameter(ParameterBoolean(nearblack.WHITE, "Search for nearly white pixels instead of nearly black", False))
Expand Down
163 changes: 163 additions & 0 deletions python/plugins/sextante/gdal/ogr2ogr.py
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


132 changes: 132 additions & 0 deletions python/plugins/sextante/gdal/ogrinfo.py
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() ))
93 changes: 93 additions & 0 deletions python/plugins/sextante/gdal/ogrsql.py
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
2 changes: 1 addition & 1 deletion python/plugins/sextante/gdal/pct2rgb.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ def getIcon(self):

def defineCharacteristics(self):
self.name = "pct2rgb"
self.group = "Conversion"
self.group = "[GDAL] Conversion"
self.addParameter(ParameterRaster(pct2rgb.INPUT, "Input layer", False))
options = []
for i in range(25):
Expand Down
4 changes: 2 additions & 2 deletions python/plugins/sextante/gdal/polygonize.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,8 @@ def getIcon(self):
return QtGui.QIcon(filepath)

def defineCharacteristics(self):
self.name = "polygonize"
self.group = "Conversion"
self.name = "Polygonize"
self.group = "[GDAL] Conversion"
self.addParameter(ParameterRaster(polygonize.INPUT, "Input layer", False))
self.addParameter(ParameterString(polygonize.FIELD, "Output field name", "DN"))
self.addOutput(OutputVector(polygonize.OUTPUT, "Output layer"))
Expand Down
3 changes: 3 additions & 0 deletions python/plugins/sextante/gdal/pyogr/CMakeLists.txt
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})
File renamed without changes.
1,580 changes: 1,580 additions & 0 deletions python/plugins/sextante/gdal/pyogr/ogr2ogr.py

Large diffs are not rendered by default.

44 changes: 44 additions & 0 deletions python/plugins/sextante/gdal/pyogr/ogrds.py
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
153 changes: 153 additions & 0 deletions python/plugins/sextante/gdal/pyogr/ogrvrt.py
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
2 changes: 1 addition & 1 deletion python/plugins/sextante/gdal/rgb2pct.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ def getIcon(self):

def defineCharacteristics(self):
self.name = "rgb2pct"
self.group = "Conversion"
self.group = "[GDAL] Conversion"
self.addParameter(ParameterRaster(rgb2pct.INPUT, "Input layer", False))
self.addParameter(ParameterNumber(rgb2pct.NCOLORS, "Number of colors", 1, None, 2))
self.addOutput(OutputRaster(rgb2pct.OUTPUT, "Output layer"))
Expand Down
2 changes: 1 addition & 1 deletion python/plugins/sextante/gdal/scripts/fillnodata.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
#******************************************************************************
##src_filename=raster
##dst_filename=output raster
##Analysis=group
##[GDAL] Analysis=group
from sextante.gdal.GdalUtils import GdalUtils

try:
Expand Down
2 changes: 1 addition & 1 deletion python/plugins/sextante/gdal/scripts/proximity.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
#******************************************************************************
# Adapted from gdal_proximity.py, Copyright (c) 2008, Frank Warmerdam
#******************************************************************************
##Analysis=group
##[GDAL] Analysis=group
##src_filename=raster
##dst_filename=output raster
##values=string
Expand Down
2 changes: 1 addition & 1 deletion python/plugins/sextante/gdal/scripts/sieve.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
#******************************************************************************
# Adapted from gdal_sieve.py, Copyright (c) 2008, Frank Warmerdam
#******************************************************************************
##Analysis=group
##[GDAL] Analysis=group
##src_filename=raster
##dst_filename=output raster
##connectedness=selection 4;8
Expand Down
4 changes: 2 additions & 2 deletions python/plugins/sextante/gdal/translate.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,8 @@ def getIcon(self):
return QtGui.QIcon(filepath)

def defineCharacteristics(self):
self.name = "translate"
self.group = "Conversion"
self.name = "Translate (convert format)"
self.group = "[GDAL] Conversion"
self.addParameter(ParameterRaster(translate.INPUT, "Input layer", False))
self.addParameter(ParameterString(translate.EXTRA, "Additional creation parameters"))
self.addOutput(OutputRaster(translate.OUTPUT, "Output layer"))
Expand Down
4 changes: 2 additions & 2 deletions python/plugins/sextante/gdal/warp.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,8 @@ def getIcon(self):
return QtGui.QIcon(filepath)

def defineCharacteristics(self):
self.name = "warp"
self.group = "Projections"
self.name = "Warp (reproject)"
self.group = "[GDAL] Projections"
self.addParameter(ParameterRaster(warp.INPUT, "Input layer", False))
self.addParameter(ParameterCrs(warp.SOURCE_SRS, "Source SRS (EPSG Code)", "4326"))
self.addParameter(ParameterCrs(warp.DEST_SRS, "Destination SRS (EPSG Code)", "4326"))
Expand Down
6 changes: 6 additions & 0 deletions python/plugins/sextante/grass/GrassAlgorithmProvider.py
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,12 @@ def getName(self):
def getIcon(self):
return QIcon(os.path.dirname(__file__) + "/../images/grass.png")

def getSupportedOutputVectorLayerExtensions(self):
return ["shp"]

def getSupportedOutputRasterLayerExtensions(self):
return ["tif"]

def createDescriptionFiles(self):
folder = "C:\\descs\\grass"
i = 0
Expand Down
27 changes: 27 additions & 0 deletions python/plugins/sextante/gui/BatchProcessingDialog.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
* *
***************************************************************************
"""
from sextante.gui.CrsSelectionPanel import CrsSelectionPanel

__author__ = 'Victor Olaya'
__date__ = 'August 2012'
Expand Down Expand Up @@ -63,6 +64,14 @@ def __init__(self, alg):
self.algEx = None
self.resize(800, 500)
self.setWindowTitle("Batch Processing - " + self.alg.name)
for param in self.alg.parameters:
if param.isAdvanced:
self.advancedButton = QtGui.QPushButton()
self.advancedButton.setText("Show advanced parameters")
self.advancedButton.setMaximumWidth(150)
self.buttonBox.addButton(self.advancedButton, QtGui.QDialogButtonBox.ActionRole)
self.advancedButton.clicked.connect(self.showAdvancedParametersClicked)
break
self.addRowButton = QtGui.QPushButton()
self.addRowButton.setText("Add row")
self.buttonBox.addButton(self.addRowButton, QtGui.QDialogButtonBox.ActionRole)
Expand All @@ -84,6 +93,8 @@ def setTableContent(self):
for param in self.alg.parameters:
self.table.setColumnWidth(i,250)
self.table.setHorizontalHeaderItem(i, QtGui.QTableWidgetItem(param.description))
if param.isAdvanced:
self.table.setColumnHidden(i, not self.showAdvanced)
i+=1
for out in self.alg.outputs:
self.table.setColumnWidth(i,250)
Expand Down Expand Up @@ -196,6 +207,8 @@ def setParameterValueFromWidget(self, param, widget, alg = None):
if alg != None:
widget.useNewAlg(alg)
return param.setValue(widget.getValue())
elif isinstance(param, ParameterCrs):
return param.setValue(widget.getValue())
else:
return param.setValue(widget.text())

Expand All @@ -217,6 +230,8 @@ def getWidgetFromParameter(self, param, row, col):
item = FixedTablePanel(param)
elif isinstance(param, ParameterExtent):
item = ExtentSelectionPanel(self, self.alg, param.default)
elif isinstance(param, ParameterCrs):
item = CrsSelectionPanel(param.default)
else:
item = QtGui.QLineEdit()
try:
Expand All @@ -240,3 +255,15 @@ def addRow(self):
for out in self.alg.outputs:
self.table.setCellWidget(self.table.rowCount()-1,i, BatchOutputSelectionPanel(out, self.alg, self.table.rowCount()-1, i, self))
i+=1

def showAdvancedParametersClicked(self):
self.showAdvanced = not self.showAdvanced
if self.showAdvanced:
self.advancedButton.setText("Hide advanced parameters")
else:
self.advancedButton.setText("Show advanced parameters")
i = 0
for param in self.alg.parameters:
if param.isAdvanced:
self.table.setColumnHidden(i, not self.showAdvanced)
i+=1
2 changes: 2 additions & 0 deletions python/plugins/sextante/modeler/CMakeLists.txt
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})
2 changes: 2 additions & 0 deletions python/plugins/sextante/modeler/ModelerAlgorithmProvider.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,8 @@ def _loadAlgorithms(self):
self.loadFromFolder(folder)

def loadFromFolder(self,folder):
if not os.path.exists(folder):
return
for descriptionFile in os.listdir(folder):
if descriptionFile.endswith("model"):
try:
Expand Down
3 changes: 2 additions & 1 deletion python/plugins/sextante/modeler/ModelerDialog.py
Original file line number Diff line number Diff line change
Expand Up @@ -347,10 +347,11 @@ def fillAlgorithmTree(self):
for groupItem in groups.values():
providerItem.addChild(groupItem)
self.algorithmTree.addTopLevelItem(providerItem)
providerItem.setExpanded(True)
providerItem.setExpanded(text!="")
for groupItem in groups.values():
if text != "":
groupItem.setExpanded(True)


self.algorithmTree.sortItems(0, Qt.AscendingOrder)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
* *
***************************************************************************
"""
from sextante.parameters.Parameter import Parameter

__author__ = 'Victor Olaya'
__date__ = 'August 2012'
Expand Down Expand Up @@ -85,6 +86,9 @@ def setupUi(self):
self.horizontalLayout3.setSpacing(2)
self.horizontalLayout3.setMargin(0)

if isinstance(self.param, Parameter):
self.nameTextBox.setText(self.param.name)

if self.paramType == ModelerParameterDefinitionDialog.PARAMETER_BOOLEAN or \
isinstance(self.param, ParameterBoolean):
self.horizontalLayout2.addWidget(QtGui.QLabel("Default value"))
Expand Down
1 change: 1 addition & 0 deletions python/plugins/sextante/modeler/ModelerParametersDialog.py
Original file line number Diff line number Diff line change
Expand Up @@ -505,6 +505,7 @@ def setPreviousValues(self):
ParameterString,ParameterBoolean, ParameterExtent)):
self.setComboBoxValue(widget, value, param)
elif isinstance(param, ParameterCrs):
value = self.model.getValueFromAlgorithmAndParameter(value)
widget.setText(unicode(value))
elif isinstance(param, ParameterFixedTable):
pass
Expand Down
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|
21 changes: 10 additions & 11 deletions python/plugins/sextante/otb/description/MeanShiftSegmentation.txt
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
MeanShiftSegmentation
otbcli_MeanShiftSegmentation
Mean Shift segmentation
otbcli_Segmentation
Mean Shift segmentation (labeled raster output)
Segmentation
ParameterRaster|-in|Input Image|False
OutputRaster|-fout|Filtered output
OutputRaster|-cout|Clustered output
OutputRaster|-lout|Label output
OutputRaster|-cbout|Cluster Boundaries output
ParameterNumber|-spatialr|Spatial radius|None|None|5
ParameterNumber|-ranger|Range radius|None|None|15.0
ParameterNumber|-minsize|Min region size|None|None|100
ParameterNumber|-scale|Scale|None|None|100000.0
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|
2 changes: 2 additions & 0 deletions python/plugins/sextante/r/RAlgorithmProvider.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,8 @@ def _loadAlgorithms(self):


def loadFromFolder(self, folder):
if not os.path.exists(folder):
return
for descriptionFile in os.listdir(folder):
if descriptionFile.endswith("rsx"):
try:
Expand Down
6 changes: 6 additions & 0 deletions python/plugins/sextante/saga/SagaAlgorithmProvider.py
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,12 @@ def getDescription(self):
def getName(self):
return "saga"

def getSupportedOutputVectorLayerExtensions(self):
return ["shp"]

def getSupportedOutputRasterLayerExtensions(self):
return ["tif"]

def getIcon(self):
return QIcon(os.path.dirname(__file__) + "/../images/saga.png")

Expand Down
4 changes: 3 additions & 1 deletion python/plugins/sextante/script/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
FILE(GLOB PY_FILES *.py)

PLUGIN_INSTALL(sextante ./script ${PY_FILES})
ADD_SUBDIRECTORY(scripts)

PLUGIN_INSTALL(sextante script ${PY_FILES})
4 changes: 3 additions & 1 deletion python/plugins/sextante/script/ScriptAlgorithm.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
* *
***************************************************************************
"""
from sextante.outputs.OutputNumber import OutputNumber
from sextante.outputs.OutputString import OutputString

__author__ = 'Victor Olaya'
__date__ = 'August 2012'
Expand Down Expand Up @@ -158,7 +160,7 @@ def processParameterLine(self,line):
elif tokens[1].lower().strip().startswith("output html"):
out = OutputHTML()
elif tokens[1].lower().strip().startswith("output file"):
out = OutputFile()
out = OutputFile()

if param != None:
self.addParameter(param)
Expand Down
4 changes: 3 additions & 1 deletion python/plugins/sextante/script/ScriptAlgorithmProvider.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,13 +64,15 @@ def getName(self):
def getDescription(self):
return "Scripts"

def _loadAlgorithms(self):
def _loadAlgorithms(self):
folder = self.scriptsFolder()
self.loadFromFolder(folder)
folder = os.path.join(os.path.dirname(__file__), "scripts")
self.loadFromFolder(folder)

def loadFromFolder(self, folder):
if not os.path.exists(folder):
return
for descriptionFile in os.listdir(folder):
if descriptionFile.endswith("py"):
try:
Expand Down
36 changes: 36 additions & 0 deletions python/plugins/sextante/script/scripts/Save_selected_features.py
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