[FEATURE][processing] Add choice of simplification method to simplify

This change allows users to choose which method to use when running
the simplify geometries algorithm, with choices of the existing
distance based (Douglas Peucker) algorithm, area based (Visvalingam)
algorithm and snap-to-grid.

Visvaligam in particular usually results in more cartographically
pleasing simplification over the standard distance based methods.
This commit is contained in:
Nyall Dawson 2016-09-01 08:22:18 +10:00
parent fbd6618d4a
commit 56b77db88c
9 changed files with 193 additions and 2 deletions

View File

@ -429,6 +429,8 @@ qgis:setstyleforvectorlayer: >
qgis:simplifygeometries: >
This algorithm simplifies the geometries in a line or polygon layer. It creates a new layer with the same features as the ones in the input layer, but with geometries containing a lower number of vertices.
The algorithm gives a choice of simplification methods, including distance based (the "Douglas-Peucker" algorithm), area based ("Visvalingam" algorithm) and snapping geometries to grid.
qgis:singlepartstomultipart:

View File

@ -29,12 +29,13 @@ import os
from qgis.PyQt.QtGui import QIcon
from qgis.core import Qgis, QgsFeature, QgsGeometry, QgsWkbTypes
from qgis.core import Qgis, QgsFeature, QgsGeometry, QgsWkbTypes, QgsMapToPixelSimplifier
from processing.core.GeoAlgorithm import GeoAlgorithm
from processing.core.ProcessingLog import ProcessingLog
from processing.core.parameters import ParameterVector
from processing.core.parameters import ParameterNumber
from processing.core.parameters import ParameterSelection
from processing.core.outputs import OutputVector
from processing.tools import dataobjects, vector
@ -46,6 +47,7 @@ class SimplifyGeometries(GeoAlgorithm):
INPUT = 'INPUT'
TOLERANCE = 'TOLERANCE'
OUTPUT = 'OUTPUT'
METHOD = 'METHOD'
def getIcon(self):
return QIcon(os.path.join(pluginPath, 'images', 'ftools', 'simplify.png'))
@ -57,6 +59,13 @@ class SimplifyGeometries(GeoAlgorithm):
self.addParameter(ParameterVector(self.INPUT,
self.tr('Input layer'),
[ParameterVector.VECTOR_TYPE_POLYGON, ParameterVector.VECTOR_TYPE_LINE]))
self.methods = [self.tr('Distance (Douglas-Peucker)'),
'Snap to grid',
'Area (Visvalingam)']
self.addParameter(ParameterSelection(
self.METHOD,
self.tr('Simplification method'),
self.methods, default=0))
self.addParameter(ParameterNumber(self.TOLERANCE,
self.tr('Tolerance'), 0.0, 10000000.0, 1.0))
@ -65,6 +74,7 @@ class SimplifyGeometries(GeoAlgorithm):
def processAlgorithm(self, progress):
layer = dataobjects.getObjectFromUri(self.getParameterValue(self.INPUT))
tolerance = self.getParameterValue(self.TOLERANCE)
method = self.getParameterValue(self.METHOD)
pointsBefore = 0
pointsAfter = 0
@ -74,12 +84,21 @@ class SimplifyGeometries(GeoAlgorithm):
features = vector.features(layer)
total = 100.0 / len(features)
if method != 0:
simplifier = QgsMapToPixelSimplifier(QgsMapToPixelSimplifier.SimplifyGeometry, tolerance, method)
for current, input_feature in enumerate(features):
out_feature = input_feature
if input_feature.geometry():
input_geometry = input_feature.geometry()
pointsBefore += input_geometry.geometry().nCoordinates()
output_geometry = input_geometry.simplify(tolerance)
if method == 0: # distance
output_geometry = input_geometry.simplify(tolerance)
else:
output_geometry = simplifier.simplify(input_geometry)
pointsAfter += output_geometry.geometry().nCoordinates()
out_feature.setGeometry(output_geometry)
writer.addFeature(out_feature)

View File

@ -0,0 +1,15 @@
<GMLFeatureClassList>
<GMLFeatureClass>
<Name>simplify_grid_lines</Name>
<ElementPath>simplify_grid_lines</ElementPath>
<GeometryType>2</GeometryType>
<SRSName>EPSG:4326</SRSName>
<DatasetSpecificInfo>
<FeatureCount>4</FeatureCount>
<ExtentXMin>-0.08703</ExtentXMin>
<ExtentXMax>10.63163</ExtentXMax>
<ExtentYMin>-0.26248</ExtentYMin>
<ExtentYMax>4.98546</ExtentYMax>
</DatasetSpecificInfo>
</GMLFeatureClass>
</GMLFeatureClassList>

View File

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8" ?>
<ogr:FeatureCollection
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=""
xmlns:ogr="http://ogr.maptools.org/"
xmlns:gml="http://www.opengis.net/gml">
<gml:boundedBy>
<gml:Box>
<gml:coord><gml:X>-0.08703339882121899</gml:X><gml:Y>-0.262475442043224</gml:Y></gml:coord>
<gml:coord><gml:X>10.63163064833006</gml:X><gml:Y>4.985461689587426</gml:Y></gml:coord>
</gml:Box>
</gml:boundedBy>
<gml:featureMember>
<ogr:simplify_grid_lines fid="1">
<ogr:geometryProperty><gml:LineString srsName="EPSG:4326"><gml:coordinates>-0.062278978388999,4.985461689587426 5.606483300589391,4.985461689587426</gml:coordinates></gml:LineString></ogr:geometryProperty>
</ogr:simplify_grid_lines>
</gml:featureMember>
<gml:featureMember>
<ogr:simplify_grid_lines fid="3">
<ogr:geometryProperty><gml:LineString srsName="EPSG:4326"><gml:coordinates>-0.087033398821219,2.782318271119842 2.314145383104125,2.757563850687622 7.388801571709235,4.713163064833005 9.789980353634579,2.757563850687622 10.631630648330059,2.757563850687622</gml:coordinates></gml:LineString></ogr:geometryProperty>
</ogr:simplify_grid_lines>
</gml:featureMember>
<gml:featureMember>
<ogr:simplify_grid_lines fid="2">
<ogr:geometryProperty><gml:LineString srsName="EPSG:4326"><gml:coordinates>0.061493123772101,-0.237721021611003 1.967583497053045,-0.262475442043224 4.34400785854617,2.262475442043221 6.448133595284873,-0.262475442043224 10.606876227897841,-0.188212180746563</gml:coordinates></gml:LineString></ogr:geometryProperty>
</ogr:simplify_grid_lines>
</gml:featureMember>
<gml:featureMember>
<ogr:simplify_grid_lines fid="4">
</ogr:simplify_grid_lines>
</gml:featureMember>
</ogr:FeatureCollection>

View File

@ -0,0 +1,15 @@
<GMLFeatureClassList>
<GMLFeatureClass>
<Name>simplify_vis_lines</Name>
<ElementPath>simplify_vis_lines</ElementPath>
<GeometryType>2</GeometryType>
<SRSName>EPSG:4326</SRSName>
<DatasetSpecificInfo>
<FeatureCount>4</FeatureCount>
<ExtentXMin>-0.08703</ExtentXMin>
<ExtentXMax>10.63163</ExtentXMax>
<ExtentYMin>-0.26248</ExtentYMin>
<ExtentYMax>4.98546</ExtentYMax>
</DatasetSpecificInfo>
</GMLFeatureClass>
</GMLFeatureClassList>

View File

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8" ?>
<ogr:FeatureCollection
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=""
xmlns:ogr="http://ogr.maptools.org/"
xmlns:gml="http://www.opengis.net/gml">
<gml:boundedBy>
<gml:Box>
<gml:coord><gml:X>-0.08703339882121899</gml:X><gml:Y>-0.262475442043224</gml:Y></gml:coord>
<gml:coord><gml:X>10.63163064833006</gml:X><gml:Y>4.985461689587426</gml:Y></gml:coord>
</gml:Box>
</gml:boundedBy>
<gml:featureMember>
<ogr:simplify_vis_lines fid="1">
<ogr:geometryProperty><gml:LineString srsName="EPSG:4326"><gml:coordinates>-0.062278978388999,4.985461689587426 5.606483300589391,4.985461689587426</gml:coordinates></gml:LineString></ogr:geometryProperty>
</ogr:simplify_vis_lines>
</gml:featureMember>
<gml:featureMember>
<ogr:simplify_vis_lines fid="3">
<ogr:geometryProperty><gml:LineString srsName="EPSG:4326"><gml:coordinates>-0.087033398821219,2.782318271119842 5.284675834970531,2.782318271119842 7.388801571709235,4.713163064833005 10.631630648330059,2.757563850687622</gml:coordinates></gml:LineString></ogr:geometryProperty>
</ogr:simplify_vis_lines>
</gml:featureMember>
<gml:featureMember>
<ogr:simplify_vis_lines fid="2">
<ogr:geometryProperty><gml:LineString srsName="EPSG:4326"><gml:coordinates>0.061493123772101,-0.237721021611003 1.967583497053045,-0.262475442043224 4.34400785854617,2.262475442043221 6.448133595284873,-0.262475442043224 10.606876227897841,-0.188212180746563</gml:coordinates></gml:LineString></ogr:geometryProperty>
</ogr:simplify_vis_lines>
</gml:featureMember>
<gml:featureMember>
<ogr:simplify_vis_lines fid="4">
</ogr:simplify_vis_lines>
</gml:featureMember>
</ogr:FeatureCollection>

View File

@ -939,3 +939,29 @@ tests:
OUTPUT:
name: expected/simplify_multilines.gml
type: vector
- algorithm: qgis:simplifygeometries
name: Simplify (visval)
params:
INPUT:
name: simplify_lines.gml
type: vector
METHOD: '2'
TOLERANCE: 1.0
results:
OUTPUT:
name: expected/simplify_vis_lines.gml
type: vector
- algorithm: qgis:simplifygeometries
name: Simplify (grid)
params:
INPUT:
name: simplify_lines.gml
type: vector
METHOD: '1'
TOLERANCE: 5.0
results:
OUTPUT:
name: expected/simplify_grid_lines.gml
type: vector

View File

@ -0,0 +1,15 @@
<GMLFeatureClassList>
<GMLFeatureClass>
<Name>simplify_lines</Name>
<ElementPath>simplify_lines</ElementPath>
<GeometryType>2</GeometryType>
<SRSName>EPSG:4326</SRSName>
<DatasetSpecificInfo>
<FeatureCount>4</FeatureCount>
<ExtentXMin>-0.08703</ExtentXMin>
<ExtentXMax>10.63163</ExtentXMax>
<ExtentYMin>-0.26248</ExtentYMin>
<ExtentYMax>4.98546</ExtentYMax>
</DatasetSpecificInfo>
</GMLFeatureClass>
</GMLFeatureClassList>

View File

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8" ?>
<ogr:FeatureCollection
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=""
xmlns:ogr="http://ogr.maptools.org/"
xmlns:gml="http://www.opengis.net/gml">
<gml:boundedBy>
<gml:Box>
<gml:coord><gml:X>-0.08703339882121885</gml:X><gml:Y>-0.2624754420432236</gml:Y></gml:coord>
<gml:coord><gml:X>10.63163064833006</gml:X><gml:Y>4.985461689587426</gml:Y></gml:coord>
</gml:Box>
</gml:boundedBy>
<gml:featureMember>
<ogr:simplify_lines fid="1">
<ogr:geometryProperty><gml:LineString srsName="EPSG:4326"><gml:coordinates>-0.062278978388999,4.985461689587426 5.606483300589391,4.985461689587426</gml:coordinates></gml:LineString></ogr:geometryProperty>
</ogr:simplify_lines>
</gml:featureMember>
<gml:featureMember>
<ogr:simplify_lines fid="3">
<ogr:geometryProperty><gml:LineString srsName="EPSG:4326"><gml:coordinates>-0.087033398821219,2.782318271119842 2.314145383104125,2.757563850687622 2.611198428290766,4.688408644400785 2.611198428290766,2.807072691552063 5.284675834970531,2.782318271119842 7.388801571709235,4.713163064833005 9.789980353634579,2.757563850687622 10.631630648330061,2.757563850687622</gml:coordinates></gml:LineString></ogr:geometryProperty>
</ogr:simplify_lines>
</gml:featureMember>
<gml:featureMember>
<ogr:simplify_lines fid="2">
<ogr:geometryProperty><gml:LineString srsName="EPSG:4326"><gml:coordinates>0.061493123772101,-0.237721021611003 1.967583497053045,-0.262475442043224 4.34400785854617,2.262475442043221 6.448133595284873,-0.262475442043224 10.606876227897841,-0.188212180746563</gml:coordinates></gml:LineString></ogr:geometryProperty>
</ogr:simplify_lines>
</gml:featureMember>
<gml:featureMember>
<ogr:simplify_lines fid="4">
</ogr:simplify_lines>
</gml:featureMember>
</ogr:FeatureCollection>