Skip to content

Commit 18dd097

Browse files
committedJul 27, 2017
Remove vector.simpleMeasure
It's quite a confusing function - instead use optimised versions of the measurement calculations in its place
1 parent 3e3f1d4 commit 18dd097

File tree

3 files changed

+66
-69
lines changed

3 files changed

+66
-69
lines changed
 

‎python/plugins/processing/algs/qgis/ConvexHull.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@
3737
QgsGeometry,
3838
QgsWkbTypes,
3939
QgsProcessingUtils,
40-
QgsFields)
40+
QgsFields,
41+
NULL)
4142

4243
from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm
4344
from processing.core.GeoAlgorithmExecutionException import GeoAlgorithmExecutionException
@@ -145,7 +146,12 @@ def processAlgorithm(self, parameters, context, feedback):
145146
tmpGeom = QgsGeometry(outGeom.fromMultiPoint(hull))
146147
try:
147148
outGeom = tmpGeom.convexHull()
148-
(area, perim) = vector.simpleMeasure(outGeom)
149+
if outGeom:
150+
area = outGeom.geometry().area()
151+
perim = outGeom.geometry().perimeter()
152+
else:
153+
area = NULL
154+
perim = NULL
149155
outFeat.setGeometry(outGeom)
150156
outFeat.setAttributes([fid, val, area, perim])
151157
writer.addFeature(outFeat, QgsFeatureSink.FastInsert)
@@ -166,7 +172,12 @@ def processAlgorithm(self, parameters, context, feedback):
166172
tmpGeom = QgsGeometry(outGeom.fromMultiPoint(hull))
167173
try:
168174
outGeom = tmpGeom.convexHull()
169-
(area, perim) = vector.simpleMeasure(outGeom)
175+
if outGeom:
176+
area = outGeom.geometry().area()
177+
perim = outGeom.geometry().perimeter()
178+
else:
179+
area = NULL
180+
perim = NULL
170181
outFeat.setGeometry(outGeom)
171182
outFeat.setAttributes([0, 'all', area, perim])
172183
writer.addFeature(outFeat, QgsFeatureSink.FastInsert)

‎python/plugins/processing/algs/qgis/ExportGeometryInfo.py

Lines changed: 52 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,12 @@
3030
from qgis.PyQt.QtGui import QIcon
3131
from qgis.PyQt.QtCore import QVariant
3232

33-
from qgis.core import QgsProject, QgsCoordinateTransform, QgsFeature, QgsField, QgsWkbTypes, QgsFeatureSink, QgsProcessingUtils
34-
from qgis.utils import iface
33+
from qgis.core import (QgsCoordinateTransform,
34+
QgsField,
35+
QgsWkbTypes,
36+
QgsFeatureSink,
37+
QgsProcessingUtils,
38+
QgsDistanceArea)
3539

3640
from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm
3741
from processing.core.parameters import ParameterVector
@@ -59,6 +63,9 @@ def group(self):
5963

6064
def __init__(self):
6165
super().__init__()
66+
self.export_z = False
67+
self.export_m = False
68+
self.distance_area = None
6269

6370
def initAlgorithm(self, config=None):
6471
self.calc_methods = [self.tr('Layer CRS'),
@@ -85,8 +92,6 @@ def processAlgorithm(self, parameters, context, feedback):
8592
geometryType = layer.geometryType()
8693
fields = layer.fields()
8794

88-
export_z = False
89-
export_m = False
9095
if geometryType == QgsWkbTypes.PolygonGeometry:
9196
areaName = vector.createUniqueFieldName('area', fields)
9297
fields.append(QgsField(areaName, QVariant.Double))
@@ -101,64 +106,77 @@ def processAlgorithm(self, parameters, context, feedback):
101106
yName = vector.createUniqueFieldName('ycoord', fields)
102107
fields.append(QgsField(yName, QVariant.Double))
103108
if QgsWkbTypes.hasZ(layer.wkbType()):
104-
export_z = True
109+
self.export_z = True
105110
zName = vector.createUniqueFieldName('zcoord', fields)
106111
fields.append(QgsField(zName, QVariant.Double))
107112
if QgsWkbTypes.hasM(layer.wkbType()):
108-
export_m = True
113+
self.export_m = True
109114
zName = vector.createUniqueFieldName('mvalue', fields)
110115
fields.append(QgsField(zName, QVariant.Double))
111116

112117
writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fields, layer.wkbType(), layer.crs(),
113118
context)
114119

115-
ellips = None
116-
crs = None
117120
coordTransform = None
118121

119122
# Calculate with:
120123
# 0 - layer CRS
121124
# 1 - project CRS
122125
# 2 - ellipsoidal
123126

127+
self.distance_area = QgsDistanceArea()
124128
if method == 2:
125-
ellips = QgsProject.instance().ellipsoid()
126-
crs = layer.crs().srsid()
129+
self.distance_area.setSourceCrs(layer.crs())
130+
self.distance_area.setEllipsoid(context.project().ellipsoid())
127131
elif method == 1:
128-
mapCRS = iface.mapCanvas().mapSettings().destinationCrs()
129-
layCRS = layer.crs()
130-
coordTransform = QgsCoordinateTransform(layCRS, mapCRS)
131-
132-
outFeat = QgsFeature()
133-
134-
outFeat.initAttributes(len(fields))
135-
outFeat.setFields(fields)
132+
coordTransform = QgsCoordinateTransform(layer.crs(), context.project().crs())
136133

137134
features = QgsProcessingUtils.getFeatures(layer, context)
138135
total = 100.0 / layer.featureCount() if layer.featureCount() else 0
139136
for current, f in enumerate(features):
140-
inGeom = f.geometry()
141-
142-
if method == 1:
143-
inGeom.transform(coordTransform)
144-
145-
(attr1, attr2) = vector.simpleMeasure(inGeom, method, ellips, crs)
146-
147-
outFeat.setGeometry(inGeom)
137+
outFeat = f
148138
attrs = f.attributes()
149-
attrs.append(attr1)
150-
if attr2 is not None:
151-
attrs.append(attr2)
139+
inGeom = f.geometry()
140+
if inGeom:
141+
if coordTransform is not None:
142+
inGeom.transform(coordTransform)
152143

153-
# add point z/m
154-
if export_z:
155-
attrs.append(inGeom.geometry().z())
156-
if export_m:
157-
attrs.append(inGeom.geometry().m())
144+
if inGeom.type() == QgsWkbTypes.PointGeometry:
145+
attrs.extend(self.point_attributes(inGeom))
146+
elif inGeom.type() == QgsWkbTypes.PolygonGeometry:
147+
attrs.extend(self.polygon_attributes(inGeom))
148+
else:
149+
attrs.extend(self.line_attributes(inGeom))
158150

159151
outFeat.setAttributes(attrs)
160152
writer.addFeature(outFeat, QgsFeatureSink.FastInsert)
161153

162154
feedback.setProgress(int(current * total))
163155

164156
del writer
157+
158+
def point_attributes(self, geometry):
159+
pt = None
160+
if not geometry.isMultipart():
161+
pt = geometry.geometry()
162+
else:
163+
if geometry.numGeometries() > 0:
164+
pt = geometry.geometryN(0)
165+
attrs = []
166+
if pt:
167+
attrs.append(pt.x())
168+
attrs.append(pt.y())
169+
# add point z/m
170+
if self.export_z:
171+
attrs.append(pt.z())
172+
if self.export_m:
173+
attrs.append(pt.m())
174+
return attrs
175+
176+
def line_attributes(self, geometry):
177+
return [self.distance_area.measureLength(geometry)]
178+
179+
def polygon_attributes(self, geometry):
180+
area = self.distance_area.measureArea(geometry)
181+
perimeter = self.distance_area.measurePerimeter(geometry)
182+
return [area, perimeter]

‎python/plugins/processing/tools/vector.py

Lines changed: 0 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -196,38 +196,6 @@ def extractPoints(geom):
196196
return points
197197

198198

199-
def simpleMeasure(geom, method=0, ellips=None, crs=None):
200-
# Method defines calculation type:
201-
# 0 - layer CRS
202-
# 1 - project CRS
203-
# 2 - ellipsoidal
204-
205-
if geom.type() == QgsWkbTypes.PointGeometry:
206-
if not geom.isMultipart():
207-
pt = geom.geometry()
208-
attr1 = pt.x()
209-
attr2 = pt.y()
210-
else:
211-
pt = geom.asMultiPoint()
212-
attr1 = pt[0].x()
213-
attr2 = pt[0].y()
214-
else:
215-
measure = QgsDistanceArea()
216-
217-
if method == 2:
218-
measure.setSourceCrs(crs)
219-
measure.setEllipsoid(ellips)
220-
221-
if geom.type() == QgsWkbTypes.PolygonGeometry:
222-
attr1 = measure.measureArea(geom)
223-
attr2 = measure.measurePerimeter(geom)
224-
else:
225-
attr1 = measure.measureLength(geom)
226-
attr2 = None
227-
228-
return (attr1, attr2)
229-
230-
231199
def combineFields(fieldsA, fieldsB):
232200
"""Create single field map from two input field maps.
233201
"""

0 commit comments

Comments
 (0)
Please sign in to comment.