mirror of
https://github.com/qgis/QGIS.git
synced 2025-02-25 00:58:06 -05:00
146 lines
6.0 KiB
Python
146 lines
6.0 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
"""
|
|
***************************************************************************
|
|
SaveSelectedFeatures.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. *
|
|
* *
|
|
***************************************************************************
|
|
"""
|
|
|
|
__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 qgis.core import *
|
|
from PyQt4.QtCore import *
|
|
from PyQt4.QtGui import *
|
|
from processing.core.GeoAlgorithm import GeoAlgorithm
|
|
from processing.parameters.ParameterVector import ParameterVector
|
|
from processing.outputs.OutputVector import OutputVector
|
|
from processing.tools import dataobjects, vector
|
|
|
|
|
|
class SaveSelectedFeatures(GeoAlgorithm):
|
|
"""This is an example algorithm that takes a vector layer and
|
|
creates a new one just with just those features of the input
|
|
layer that are selected.
|
|
|
|
It is meant to be used as an example of how to create your own
|
|
Processing algorithms and explain methods and variables used
|
|
to do it. An algorithm like this will be available in all
|
|
Processing elements, and there is not need for additional work.
|
|
|
|
All geoprocessingalgorithms should extend the GeoAlgorithm class.
|
|
"""
|
|
|
|
# Constants used to refer to parameters and outputs. They will be
|
|
# used when calling the algorithm from another algorithm, or when
|
|
# calling from the QGIS console.
|
|
|
|
OUTPUT_LAYER = 'OUTPUT_LAYER'
|
|
INPUT_LAYER = 'INPUT_LAYER'
|
|
|
|
def defineCharacteristics(self):
|
|
"""Here we define the inputs and output of the algorithm, along
|
|
with some other properties.
|
|
|
|
This will give the algorithm its semantics, and allow to use it
|
|
in the modeler. As a rule of thumb, do not produce anything not
|
|
declared here. It will work fine in the toolbox, but it will
|
|
not work in the modeler. If that's what you intend, then set
|
|
self.showInModeler = False
|
|
"""
|
|
|
|
# The name that the user will see in the toolbox
|
|
self.name = 'Save selected features'
|
|
|
|
# The branch of the toolbox under which the algorithm will
|
|
# appear
|
|
self.group = 'Vector general tools'
|
|
|
|
# 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))
|
|
|
|
# We add a vector layer as output
|
|
self.addOutput(OutputVector(self.OUTPUT_LAYER,
|
|
'Output layer with selected features'))
|
|
|
|
def processAlgorithm(self, progress):
|
|
"""Here is where the processing itself takes place."""
|
|
|
|
# The first thing to do is retrieve the values of the
|
|
# parameters entered by the user. The getParameterValue will
|
|
# return the value with its corresponding type, strings in
|
|
# the case of inputs and outputs
|
|
inputFilename = self.getParameterValue(self.INPUT_LAYER)
|
|
|
|
# The output. It will get the value of the destinatation file
|
|
# entered by the user. If the user select "Save to temporary
|
|
# file", when we arrive here it will already have an asigned
|
|
# value, which will be a temporary file using the first
|
|
# supported file format of the corresponding algorithm
|
|
# provider.
|
|
output = self.getOutputFromName(self.OUTPUT_LAYER)
|
|
|
|
# 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
|
|
# processing.getObject() method
|
|
vectorLayer = dataobjects.getObjectFromUri(inputFilename)
|
|
|
|
# And now we can process
|
|
|
|
# First we create the output layer. To do so, we call the
|
|
# getVectorWriter method in the Output object. That will give
|
|
# us a VectorWriter, that we can later use to add features.
|
|
# The destination file has its format selected based on the
|
|
# file extension. If the selected format is not supported, the
|
|
# first available format from the provider is used, and the
|
|
# corresponding file extension appended.
|
|
|
|
# vectorLayer.crs() is the layer crs. By default all resulting
|
|
# layers are assumed to be in the same crs are the inputs, and
|
|
# will be loaded with this assumptions when executed from the
|
|
# toolbox. The self.crs variable has to be changed in case this
|
|
# is not true, or in case there are no input layer from which
|
|
# the output crs can be infered
|
|
|
|
|
|
provider = vectorLayer.dataProvider()
|
|
|
|
writer = output.getVectorWriter(provider.fields(),
|
|
provider.geometryType(), vectorLayer.crs())
|
|
|
|
# Now we take the selected features and add them to the output
|
|
# layer
|
|
features = vector.features(vectorLayer)
|
|
total = len(features)
|
|
for (i, feat) in enumerate(features):
|
|
writer.addFeature(feat)
|
|
|
|
# We use the progress object to communicate with the user
|
|
progress.setPercentage(100 * i / float(total))
|
|
del writer
|
|
|
|
# There is nothing more to do here. We do not have to open the
|
|
# layer that we have created. The Processing framework will
|
|
# take care of that, or will handle it if this algorithm is
|
|
# executed within a complex model.
|