Skip to content

Commit a4186df

Browse files
committedDec 11, 2012
Added DensifyGeometriesInterval.py by @Underdark, and fixed existent DensifyGeometries.py
1 parent 7197a31 commit a4186df

File tree

2 files changed

+159
-6
lines changed

2 files changed

+159
-6
lines changed
 

‎python/plugins/sextante/ftools/DensifyGeometries.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,13 @@
2323
# This will get replaced with a git SHA1 when you do a git archive
2424
__revision__ = '$Format:%H$'
2525

26-
import os.path
2726

28-
from PyQt4 import QtGui
2927
from PyQt4.QtCore import *
3028

3129
from qgis.core import *
3230

3331
from sextante.core.GeoAlgorithm import GeoAlgorithm
3432
from sextante.core.QGisLayers import QGisLayers
35-
from sextante.core.SextanteLog import SextanteLog
3633

3734
from sextante.parameters.ParameterVector import ParameterVector
3835
from sextante.parameters.ParameterNumber import ParameterNumber
@@ -63,8 +60,7 @@ def defineCharacteristics(self):
6360
def processAlgorithm(self, progress):
6461
layer = QGisLayers.getObjectFromUri(self.getParameterValue(self.INPUT))
6562
useSelection = self.getParameterValue(self.USE_SELECTION)
66-
vertices =self.getParameterValue(self.VERTICES)
67-
output = self.getOutputValue(self.OUTPUT)
63+
vertices =self.getParameterValue(self.VERTICES)
6864

6965
isPolygon = layer.geometryType() == QGis.Polygon
7066

@@ -76,7 +72,8 @@ def processAlgorithm(self, progress):
7672

7773
current = 0
7874
if useSelection:
79-
total = 100.0 / float(len(layer.selectedFeatures()))
75+
selection = layer.selectedFeatures()
76+
total = 100.0 / float(len(selection))
8077
for f in selection:
8178
featGeometry = QgsGeometry(f.geometry())
8279
attrMap = f.attributeMap()
Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
# -*- coding: utf-8 -*-
2+
3+
"""
4+
***************************************************************************
5+
DensifyGeometriesInterval.py by Anita Graser, Dec 2012
6+
based on
7+
DensifyGeometries.py
8+
---------------------
9+
Date : October 2012
10+
Copyright : (C) 2012 by Victor Olaya
11+
Email : volayaf at gmail dot com
12+
***************************************************************************
13+
* *
14+
* This program is free software; you can redistribute it and/or modify *
15+
* it under the terms of the GNU General Public License as published by *
16+
* the Free Software Foundation; either version 2 of the License, or *
17+
* (at your option) any later version. *
18+
* *
19+
***************************************************************************
20+
"""
21+
22+
__author__ = 'Anita Graser'
23+
__date__ = 'Dec 2012'
24+
__copyright__ = '(C) 2012, Anita Graser'
25+
# This will get replaced with a git SHA1 when you do a git archive
26+
__revision__ = '$Format:%H$'
27+
28+
from math import sqrt
29+
30+
from PyQt4.QtCore import *
31+
32+
from qgis.core import *
33+
34+
from sextante.core.GeoAlgorithm import GeoAlgorithm
35+
from sextante.core.QGisLayers import QGisLayers
36+
37+
from sextante.parameters.ParameterVector import ParameterVector
38+
from sextante.parameters.ParameterNumber import ParameterNumber
39+
from sextante.parameters.ParameterBoolean import ParameterBoolean
40+
41+
from sextante.outputs.OutputVector import OutputVector
42+
43+
class DensifyGeometriesInterval(GeoAlgorithm):
44+
45+
INPUT = "INPUT"
46+
#VERTICES = "VERTICES"
47+
INTERVAL = "INTERVAL"
48+
USE_SELECTION = "USE_SELECTION"
49+
OUTPUT = "OUTPUT"
50+
51+
def defineCharacteristics(self):
52+
self.name = "Densify geometries given an interval"
53+
self.group = "Geometry tools"
54+
55+
self.addParameter(ParameterVector(self.INPUT, "Input layer", ParameterVector.VECTOR_TYPE_ANY))
56+
#self.addParameter(ParameterNumber(self.VERTICES, "Vertices to add", 1, 10000000, 1))
57+
self.addParameter(ParameterNumber(self.INTERVAL, "Interval between Vertices to add", 1, 10000000, 1))
58+
self.addParameter(ParameterBoolean(self.USE_SELECTION, "Use only selected features", False))
59+
60+
self.addOutput(OutputVector(self.OUTPUT, "Simplified layer"))
61+
62+
def processAlgorithm(self, progress):
63+
layer = QGisLayers.getObjectFromUri(self.getParameterValue(self.INPUT))
64+
useSelection = self.getParameterValue(self.USE_SELECTION)
65+
interval =self.getParameterValue(self.INTERVAL)
66+
67+
isPolygon = layer.geometryType() == QGis.Polygon
68+
69+
provider = layer.dataProvider()
70+
layer.select(layer.pendingAllAttributesList())
71+
72+
writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(layer.pendingFields(),
73+
layer.wkbType(), provider.crs())
74+
75+
current = 0
76+
if useSelection:
77+
selection = layer.selectedFeatures()
78+
total = 100.0 / float(len(selection))
79+
for f in selection:
80+
featGeometry = QgsGeometry(f.geometry())
81+
attrMap = f.attributeMap()
82+
newGeometry = self.densifyGeometry(featGeometry, interval, isPolygon)
83+
84+
feature = QgsFeature()
85+
feature.setGeometry(newGeometry)
86+
feature.setAttributeMap(attrMap)
87+
writer.addFeature(feature)
88+
89+
current += 1
90+
progress.setPercentage(int(current * total))
91+
else:
92+
total = 100.0 / float(provider.featureCount())
93+
f = QgsFeature()
94+
while layer.nextFeature(f):
95+
featGeometry = QgsGeometry(f.geometry())
96+
attrMap = f.attributeMap()
97+
newGeometry = self.densifyGeometry(featGeometry, interval, isPolygon)
98+
99+
feature = QgsFeature()
100+
feature.setGeometry(newGeometry)
101+
feature.setAttributeMap(attrMap)
102+
writer.addFeature(feature)
103+
104+
current += 1
105+
progress.setPercentage(int(current * total))
106+
107+
del writer
108+
109+
def densifyGeometry(self, geometry, interval, isPolygon):
110+
output = []
111+
if isPolygon:
112+
if geometry.isMultipart():
113+
polygons = geometry.asMultiPolygon()
114+
for poly in polygons:
115+
p = []
116+
for ring in poly:
117+
p.append(self.densify(ring, interval))
118+
output.append(p)
119+
return QgsGeometry.fromMultiPolygon(output)
120+
else:
121+
rings = geometry.asPolygon()
122+
for ring in rings:
123+
output.append(self.densify(ring, interval))
124+
return QgsGeometry.fromPolygon(output)
125+
else:
126+
if geometry.isMultipart():
127+
lines = geometry.asMultiPolyline()
128+
for points in lines:
129+
output.append(self.densify(points, interval))
130+
return QgsGeometry.fromMultiPolyline(output)
131+
else:
132+
points = geometry.asPolyline()
133+
output = self.densify(points, interval)
134+
return QgsGeometry.fromPolyline(output)
135+
136+
def densify(self, polyline, interval):
137+
output = []
138+
for i in xrange(len(polyline) - 1):
139+
p1 = polyline[i]
140+
p2 = polyline[i + 1]
141+
output.append(p1)
142+
# calculate necessary number of points between p1 and p2
143+
pointsNumber = sqrt(p1.sqrDist(p2)) / interval
144+
if pointsNumber > 1:
145+
multiplier = 1.0 / float(pointsNumber)
146+
else:
147+
multiplier = 1
148+
for j in xrange(int(pointsNumber)):
149+
delta = multiplier * (j + 1)
150+
x = p1.x() + delta * (p2.x() - p1.x())
151+
y = p1.y() + delta * (p2.y() - p1.y())
152+
output.append(QgsPoint( x, y ))
153+
if j + 1 == pointsNumber:
154+
break
155+
output.append(polyline[len(polyline) - 1])
156+
return output

0 commit comments

Comments
 (0)
Please sign in to comment.