[FEATURE][processing] New 'drop geometries' algorithm

Simply removes any geometries from an input layer and returns
the features with attributes only
This commit is contained in:
Nyall Dawson 2016-11-24 09:40:52 +10:00
parent 38a0ea0844
commit 1e661e37b9
6 changed files with 93 additions and 3 deletions

View File

@ -144,12 +144,14 @@ qgis:dissolve: >
qgis:distancematrix: >
This algorithms creates a table containing a distance matrix, with distances between all the points in a points layer.
qgis:distancetonearesthub: >
Given a layer with source point and another one representing destination points, this algorithm computes the distance between each source point and the closest detination one.
The resulting layer can contain only source points with an additional field indicating the distance to the nearest point and the name of the destination point, or lines linking each source point with its nearest destination point.
qgis:dropgeometries: >
This algorithm removes any geometries from an input layer and returns a layer containing only the feature attributes.
qgis:eliminatesliverpolygons: >
This algorithm combines selected polygons of the input layer with certain adjacent polygons by erasing their common boundary. Eliminate can either use an existing selection or a logical query based on one of the layer's fields to make the selection itself. The adjacent polygon can be either the one with the largest or smallest area or the one sharing the largest common boundary with the polygon to be eliminated. Eliminate is normally used to get rid of sliver polygons, i.e. tiny polygons that are a result of polygon intersection processes where boundaries of the inputs are similar but not identical.

View File

@ -0,0 +1,68 @@
# -*- coding: utf-8 -*-
"""
***************************************************************************
DropGeometry.py
--------------
Date : November 2016
Copyright : (C) 2016 by Nyall Dawson
Email : nyall dot dawson 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__ = 'Nyall Dawson'
__date__ = 'November 2016'
__copyright__ = '(C) 2016, Nyall Dawson'
# This will get replaced with a git SHA1 when you do a git archive323
__revision__ = '$Format:%H$'
from qgis.core import QgsFeatureRequest, QgsWkbTypes, QgsCoordinateReferenceSystem
from processing.core.GeoAlgorithm import GeoAlgorithm
from processing.core.parameters import ParameterVector
from processing.core.outputs import OutputVector
from processing.tools import dataobjects, vector
class DropGeometry(GeoAlgorithm):
INPUT_LAYER = 'INPUT_LAYER'
OUTPUT_TABLE = 'OUTPUT_TABLE'
def defineCharacteristics(self):
self.name, self.i18n_name = self.trAlgorithm('Drop geometries')
self.group, self.i18n_group = self.trAlgorithm('Vector general tools')
self.tags = self.tr('remove,drop,delete,geometry,objects')
self.addParameter(ParameterVector(self.INPUT_LAYER,
self.tr('Input layer'), [dataobjects.TYPE_VECTOR_POINT,
dataobjects.TYPE_VECTOR_LINE,
dataobjects.TYPE_VECTOR_POLYGON]))
self.addOutput(OutputVector(self.OUTPUT_TABLE, self.tr('Dropped geometry')))
def processAlgorithm(self, progress):
layer = dataobjects.getObjectFromUri(
self.getParameterValue(self.INPUT_LAYER))
writer = self.getOutputFromName(
self.OUTPUT_TABLE).getVectorWriter(
layer.fields(),
QgsWkbTypes.NoGeometry,
QgsCoordinateReferenceSystem())
request = QgsFeatureRequest().setFlags(QgsFeatureRequest.NoGeometry)
features = vector.features(layer, request)
total = 100.0 / len(features)
for current, input_feature in enumerate(features):
writer.addFeature(input_feature)
progress.setPercentage(int(current * total))
del writer

View File

@ -179,6 +179,7 @@ from .GeometryByExpression import GeometryByExpression
from .SnapGeometries import SnapGeometriesToLayer
from .PoleOfInaccessibility import PoleOfInaccessibility
from .CreateAttributeIndex import CreateAttributeIndex
from .DropGeometry import DropGeometry
pluginPath = os.path.normpath(os.path.join(
os.path.split(os.path.dirname(__file__))[0], os.pardir))
@ -227,7 +228,7 @@ class QGISAlgorithmProvider(AlgorithmProvider):
PostGISExecuteSQL(), ImportIntoPostGIS(),
SetVectorStyle(), SetRasterStyle(),
SelectByExpression(), HypsometricCurves(),
SplitWithLines(), SplitLinesWithLines(), CreateConstantRaster(),
SplitWithLines(), SplitLinesWithLines(), CreateConstantRaster(),
FieldsMapper(), SelectByAttributeSum(), Datasources2Vrt(),
CheckValidity(), OrientedMinimumBoundingBox(), Smooth(),
ReverseLineDirection(), SpatialIndex(), DefineProjection(),
@ -242,7 +243,7 @@ class QGISAlgorithmProvider(AlgorithmProvider):
TinInterpolationZValue(), TinInterpolationAttribute(),
RemoveNullGeometry(), ExtractByExpression(), ExtendLines(),
ExtractSpecificNodes(), GeometryByExpression(), SnapGeometriesToLayer(),
PoleOfInaccessibility(), CreateAttributeIndex()
PoleOfInaccessibility(), CreateAttributeIndex(), DropGeometry()
]
if hasMatplotlib:

View File

@ -39,6 +39,7 @@ class RemoveNullGeometry(GeoAlgorithm):
def defineCharacteristics(self):
self.name, self.i18n_name = self.trAlgorithm('Remove null geometries')
self.group, self.i18n_group = self.trAlgorithm('Vector selection tools')
self.tags = self.tr('remove,drop,delete,empty,geometry')
self.addParameter(ParameterVector(self.INPUT_LAYER,
self.tr('Input layer'), [dataobjects.TYPE_VECTOR_ANY]))

View File

@ -0,0 +1,7 @@
fid,name,intval,floatval
polys.0,aaaaa,33,44.123456
polys.1,Aaaaa,-33,0
polys.2,bbaaa,,0.123
polys.3,ASDF,0,
polys.4,,120,-100291.43213
polys.5,elim,2,3.33
1 fid name intval floatval
2 polys.0 aaaaa 33 44.123456
3 polys.1 Aaaaa -33 0
4 polys.2 bbaaa 0.123
5 polys.3 ASDF 0
6 polys.4 120 -100291.43213
7 polys.5 elim 2 3.33

View File

@ -1637,3 +1637,14 @@ tests:
OUTPUT:
name: expected/split_lines_with_lines_same.gml
type: vector
- algorithm: qgis:dropgeometries
name: Drop geometries
params:
INPUT_LAYER:
name: polys.gml
type: vector
results:
OUTPUT_TABLE:
name: expected/dropped_geometry.csv
type: vector