diff --git a/python/plugins/processing/algs/qgis/ConvexHull.py b/python/plugins/processing/algs/qgis/ConvexHull.py index 74e4e3e8bfc..755102811d1 100644 --- a/python/plugins/processing/algs/qgis/ConvexHull.py +++ b/python/plugins/processing/algs/qgis/ConvexHull.py @@ -37,7 +37,8 @@ from qgis.core import (QgsField, QgsGeometry, QgsWkbTypes, QgsProcessingUtils, - QgsFields) + QgsFields, + NULL) from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm from processing.core.GeoAlgorithmExecutionException import GeoAlgorithmExecutionException @@ -145,7 +146,12 @@ class ConvexHull(QgisAlgorithm): tmpGeom = QgsGeometry(outGeom.fromMultiPoint(hull)) try: outGeom = tmpGeom.convexHull() - (area, perim) = vector.simpleMeasure(outGeom) + if outGeom: + area = outGeom.geometry().area() + perim = outGeom.geometry().perimeter() + else: + area = NULL + perim = NULL outFeat.setGeometry(outGeom) outFeat.setAttributes([fid, val, area, perim]) writer.addFeature(outFeat, QgsFeatureSink.FastInsert) @@ -166,7 +172,12 @@ class ConvexHull(QgisAlgorithm): tmpGeom = QgsGeometry(outGeom.fromMultiPoint(hull)) try: outGeom = tmpGeom.convexHull() - (area, perim) = vector.simpleMeasure(outGeom) + if outGeom: + area = outGeom.geometry().area() + perim = outGeom.geometry().perimeter() + else: + area = NULL + perim = NULL outFeat.setGeometry(outGeom) outFeat.setAttributes([0, 'all', area, perim]) writer.addFeature(outFeat, QgsFeatureSink.FastInsert) diff --git a/python/plugins/processing/algs/qgis/ExportGeometryInfo.py b/python/plugins/processing/algs/qgis/ExportGeometryInfo.py index 9ba3b06ac99..0ccedf3ec29 100644 --- a/python/plugins/processing/algs/qgis/ExportGeometryInfo.py +++ b/python/plugins/processing/algs/qgis/ExportGeometryInfo.py @@ -30,8 +30,12 @@ import os from qgis.PyQt.QtGui import QIcon from qgis.PyQt.QtCore import QVariant -from qgis.core import QgsProject, QgsCoordinateTransform, QgsFeature, QgsField, QgsWkbTypes, QgsFeatureSink, QgsProcessingUtils -from qgis.utils import iface +from qgis.core import (QgsCoordinateTransform, + QgsField, + QgsWkbTypes, + QgsFeatureSink, + QgsProcessingUtils, + QgsDistanceArea) from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm from processing.core.parameters import ParameterVector @@ -59,6 +63,9 @@ class ExportGeometryInfo(QgisAlgorithm): def __init__(self): super().__init__() + self.export_z = False + self.export_m = False + self.distance_area = None def initAlgorithm(self, config=None): self.calc_methods = [self.tr('Layer CRS'), @@ -85,8 +92,6 @@ class ExportGeometryInfo(QgisAlgorithm): geometryType = layer.geometryType() fields = layer.fields() - export_z = False - export_m = False if geometryType == QgsWkbTypes.PolygonGeometry: areaName = vector.createUniqueFieldName('area', fields) fields.append(QgsField(areaName, QVariant.Double)) @@ -101,19 +106,17 @@ class ExportGeometryInfo(QgisAlgorithm): yName = vector.createUniqueFieldName('ycoord', fields) fields.append(QgsField(yName, QVariant.Double)) if QgsWkbTypes.hasZ(layer.wkbType()): - export_z = True + self.export_z = True zName = vector.createUniqueFieldName('zcoord', fields) fields.append(QgsField(zName, QVariant.Double)) if QgsWkbTypes.hasM(layer.wkbType()): - export_m = True + self.export_m = True zName = vector.createUniqueFieldName('mvalue', fields) fields.append(QgsField(zName, QVariant.Double)) writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fields, layer.wkbType(), layer.crs(), context) - ellips = None - crs = None coordTransform = None # Calculate with: @@ -121,40 +124,29 @@ class ExportGeometryInfo(QgisAlgorithm): # 1 - project CRS # 2 - ellipsoidal + self.distance_area = QgsDistanceArea() if method == 2: - ellips = QgsProject.instance().ellipsoid() - crs = layer.crs().srsid() + self.distance_area.setSourceCrs(layer.crs()) + self.distance_area.setEllipsoid(context.project().ellipsoid()) elif method == 1: - mapCRS = iface.mapCanvas().mapSettings().destinationCrs() - layCRS = layer.crs() - coordTransform = QgsCoordinateTransform(layCRS, mapCRS) - - outFeat = QgsFeature() - - outFeat.initAttributes(len(fields)) - outFeat.setFields(fields) + coordTransform = QgsCoordinateTransform(layer.crs(), context.project().crs()) features = QgsProcessingUtils.getFeatures(layer, context) total = 100.0 / layer.featureCount() if layer.featureCount() else 0 for current, f in enumerate(features): - inGeom = f.geometry() - - if method == 1: - inGeom.transform(coordTransform) - - (attr1, attr2) = vector.simpleMeasure(inGeom, method, ellips, crs) - - outFeat.setGeometry(inGeom) + outFeat = f attrs = f.attributes() - attrs.append(attr1) - if attr2 is not None: - attrs.append(attr2) + inGeom = f.geometry() + if inGeom: + if coordTransform is not None: + inGeom.transform(coordTransform) - # add point z/m - if export_z: - attrs.append(inGeom.geometry().z()) - if export_m: - attrs.append(inGeom.geometry().m()) + if inGeom.type() == QgsWkbTypes.PointGeometry: + attrs.extend(self.point_attributes(inGeom)) + elif inGeom.type() == QgsWkbTypes.PolygonGeometry: + attrs.extend(self.polygon_attributes(inGeom)) + else: + attrs.extend(self.line_attributes(inGeom)) outFeat.setAttributes(attrs) writer.addFeature(outFeat, QgsFeatureSink.FastInsert) @@ -162,3 +154,29 @@ class ExportGeometryInfo(QgisAlgorithm): feedback.setProgress(int(current * total)) del writer + + def point_attributes(self, geometry): + pt = None + if not geometry.isMultipart(): + pt = geometry.geometry() + else: + if geometry.numGeometries() > 0: + pt = geometry.geometryN(0) + attrs = [] + if pt: + attrs.append(pt.x()) + attrs.append(pt.y()) + # add point z/m + if self.export_z: + attrs.append(pt.z()) + if self.export_m: + attrs.append(pt.m()) + return attrs + + def line_attributes(self, geometry): + return [self.distance_area.measureLength(geometry)] + + def polygon_attributes(self, geometry): + area = self.distance_area.measureArea(geometry) + perimeter = self.distance_area.measurePerimeter(geometry) + return [area, perimeter] diff --git a/python/plugins/processing/tools/vector.py b/python/plugins/processing/tools/vector.py index ba750624f5f..41e3df48d34 100644 --- a/python/plugins/processing/tools/vector.py +++ b/python/plugins/processing/tools/vector.py @@ -196,38 +196,6 @@ def extractPoints(geom): return points -def simpleMeasure(geom, method=0, ellips=None, crs=None): - # Method defines calculation type: - # 0 - layer CRS - # 1 - project CRS - # 2 - ellipsoidal - - if geom.type() == QgsWkbTypes.PointGeometry: - if not geom.isMultipart(): - pt = geom.geometry() - attr1 = pt.x() - attr2 = pt.y() - else: - pt = geom.asMultiPoint() - attr1 = pt[0].x() - attr2 = pt[0].y() - else: - measure = QgsDistanceArea() - - if method == 2: - measure.setSourceCrs(crs) - measure.setEllipsoid(ellips) - - if geom.type() == QgsWkbTypes.PolygonGeometry: - attr1 = measure.measureArea(geom) - attr2 = measure.measurePerimeter(geom) - else: - attr1 = measure.measureLength(geom) - attr2 = None - - return (attr1, attr2) - - def combineFields(fieldsA, fieldsB): """Create single field map from two input field maps. """