mirror of
https://github.com/qgis/QGIS.git
synced 2025-04-18 00:03:05 -04:00
Port polygon from layer extent alg to new API
This commit is contained in:
parent
c6c20c6114
commit
448f019e1f
@ -36,6 +36,11 @@ from qgis.core import (QgsField,
|
|||||||
QgsFeature,
|
QgsFeature,
|
||||||
QgsWkbTypes,
|
QgsWkbTypes,
|
||||||
QgsProcessingUtils,
|
QgsProcessingUtils,
|
||||||
|
QgsProcessingParameterFeatureSource,
|
||||||
|
QgsProcessingParameterFeatureSink,
|
||||||
|
QgsProcessingOutputVectorLayer,
|
||||||
|
QgsProcessingParameterBoolean,
|
||||||
|
QgsProcessingParameterDefinition,
|
||||||
QgsFields)
|
QgsFields)
|
||||||
|
|
||||||
from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm
|
from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm
|
||||||
@ -65,12 +70,13 @@ class ExtentFromLayer(QgisAlgorithm):
|
|||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self.addParameter(ParameterVector(self.INPUT_LAYER,
|
|
||||||
self.tr('Input layer')))
|
|
||||||
self.addParameter(ParameterBoolean(self.BY_FEATURE,
|
|
||||||
self.tr('Calculate extent for each feature separately'), False))
|
|
||||||
|
|
||||||
self.addOutput(OutputVector(self.OUTPUT, self.tr('Extent'), datatype=[dataobjects.TYPE_VECTOR_POLYGON]))
|
self.addParameter(QgsProcessingParameterFeatureSource(self.INPUT_LAYER, self.tr('Input layer')))
|
||||||
|
self.addParameter(QgsProcessingParameterBoolean(self.BY_FEATURE,
|
||||||
|
self.tr('Calculate extent for each feature separately'), False))
|
||||||
|
|
||||||
|
self.addParameter(QgsProcessingParameterFeatureSink(self.OUTPUT, self.tr('Extent')))
|
||||||
|
self.addOutput(QgsProcessingOutputVectorLayer(self.OUTPUT, self.tr("Extent"), QgsProcessingParameterDefinition.TypeVectorPolygon))
|
||||||
|
|
||||||
def name(self):
|
def name(self):
|
||||||
return 'polygonfromlayerextent'
|
return 'polygonfromlayerextent'
|
||||||
@ -79,8 +85,8 @@ class ExtentFromLayer(QgisAlgorithm):
|
|||||||
return self.tr('Polygon from layer extent')
|
return self.tr('Polygon from layer extent')
|
||||||
|
|
||||||
def processAlgorithm(self, parameters, context, feedback):
|
def processAlgorithm(self, parameters, context, feedback):
|
||||||
layer = QgsProcessingUtils.mapLayerFromString(self.getParameterValue(self.INPUT_LAYER), context)
|
source = self.parameterAsSource(parameters, self.INPUT_LAYER, context)
|
||||||
byFeature = self.getParameterValue(self.BY_FEATURE)
|
byFeature = self.parameterAsBool(parameters, self.BY_FEATURE, context)
|
||||||
|
|
||||||
fields = QgsFields()
|
fields = QgsFields()
|
||||||
fields.append(QgsField('MINX', QVariant.Double))
|
fields.append(QgsField('MINX', QVariant.Double))
|
||||||
@ -94,17 +100,19 @@ class ExtentFromLayer(QgisAlgorithm):
|
|||||||
fields.append(QgsField('HEIGHT', QVariant.Double))
|
fields.append(QgsField('HEIGHT', QVariant.Double))
|
||||||
fields.append(QgsField('WIDTH', QVariant.Double))
|
fields.append(QgsField('WIDTH', QVariant.Double))
|
||||||
|
|
||||||
writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fields, QgsWkbTypes.Polygon, layer.crs(), context)
|
(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
|
||||||
|
fields, QgsWkbTypes.Polygon, source.sourceCrs())
|
||||||
|
|
||||||
if byFeature:
|
if byFeature:
|
||||||
self.featureExtent(layer, context, writer, feedback)
|
self.featureExtent(source, context, sink, feedback)
|
||||||
else:
|
else:
|
||||||
self.layerExtent(layer, writer, feedback)
|
self.layerExtent(source, sink, feedback)
|
||||||
|
|
||||||
del writer
|
return {self.OUTPUT: dest_id}
|
||||||
|
|
||||||
def layerExtent(self, layer, writer, feedback):
|
def layerExtent(self, source, sink, feedback):
|
||||||
rect = layer.extent()
|
rect = source.sourceExtent()
|
||||||
|
geometry = QgsGeometry.fromRect(rect)
|
||||||
minx = rect.xMinimum()
|
minx = rect.xMinimum()
|
||||||
miny = rect.yMinimum()
|
miny = rect.yMinimum()
|
||||||
maxx = rect.xMaximum()
|
maxx = rect.xMaximum()
|
||||||
@ -116,9 +124,6 @@ class ExtentFromLayer(QgisAlgorithm):
|
|||||||
area = width * height
|
area = width * height
|
||||||
perim = 2 * width + 2 * height
|
perim = 2 * width + 2 * height
|
||||||
|
|
||||||
rect = [QgsPointXY(minx, miny), QgsPointXY(minx, maxy), QgsPointXY(maxx,
|
|
||||||
maxy), QgsPointXY(maxx, miny), QgsPointXY(minx, miny)]
|
|
||||||
geometry = QgsGeometry().fromPolygon([rect])
|
|
||||||
feat = QgsFeature()
|
feat = QgsFeature()
|
||||||
feat.setGeometry(geometry)
|
feat.setGeometry(geometry)
|
||||||
attrs = [
|
attrs = [
|
||||||
@ -134,13 +139,16 @@ class ExtentFromLayer(QgisAlgorithm):
|
|||||||
width,
|
width,
|
||||||
]
|
]
|
||||||
feat.setAttributes(attrs)
|
feat.setAttributes(attrs)
|
||||||
writer.addFeature(feat)
|
sink.addFeature(feat)
|
||||||
|
|
||||||
def featureExtent(self, layer, context, writer, feedback):
|
def featureExtent(self, source, context, sink, feedback):
|
||||||
features = QgsProcessingUtils.getFeatures(layer, context)
|
features = source.getFeatures()
|
||||||
total = 100.0 / QgsProcessingUtils.featureCount(layer, context)
|
total = 100.0 / source.featureCount()
|
||||||
feat = QgsFeature()
|
feat = QgsFeature()
|
||||||
for current, f in enumerate(features):
|
for current, f in enumerate(features):
|
||||||
|
if feedback.isCanceled():
|
||||||
|
break
|
||||||
|
|
||||||
rect = f.geometry().boundingBox()
|
rect = f.geometry().boundingBox()
|
||||||
minx = rect.xMinimum()
|
minx = rect.xMinimum()
|
||||||
miny = rect.yMinimum()
|
miny = rect.yMinimum()
|
||||||
@ -171,5 +179,5 @@ class ExtentFromLayer(QgisAlgorithm):
|
|||||||
]
|
]
|
||||||
feat.setAttributes(attrs)
|
feat.setAttributes(attrs)
|
||||||
|
|
||||||
writer.addFeature(feat)
|
sink.addFeature(feat)
|
||||||
feedback.setProgress(int(current * total))
|
feedback.setProgress(int(current * total))
|
||||||
|
@ -79,7 +79,7 @@ from .Clip import Clip
|
|||||||
# from .Difference import Difference
|
# from .Difference import Difference
|
||||||
# from .Dissolve import Dissolve
|
# from .Dissolve import Dissolve
|
||||||
# from .Intersection import Intersection
|
# from .Intersection import Intersection
|
||||||
# from .ExtentFromLayer import ExtentFromLayer
|
from .ExtentFromLayer import ExtentFromLayer
|
||||||
# from .RandomSelection import RandomSelection
|
# from .RandomSelection import RandomSelection
|
||||||
# from .RandomSelectionWithinSubsets import RandomSelectionWithinSubsets
|
# from .RandomSelectionWithinSubsets import RandomSelectionWithinSubsets
|
||||||
# from .SelectByLocation import SelectByLocation
|
# from .SelectByLocation import SelectByLocation
|
||||||
@ -210,7 +210,7 @@ class QGISAlgorithmProvider(QgsProcessingProvider):
|
|||||||
# PolygonsToLines(), LinesToPolygons(), ExtractNodes(),
|
# PolygonsToLines(), LinesToPolygons(), ExtractNodes(),
|
||||||
# ConvexHull(), FixedDistanceBuffer(),
|
# ConvexHull(), FixedDistanceBuffer(),
|
||||||
# VariableDistanceBuffer(), Dissolve(), Difference(),
|
# VariableDistanceBuffer(), Dissolve(), Difference(),
|
||||||
# Intersection(), Union(), ExtentFromLayer(),
|
# Intersection(), Union(),
|
||||||
# RandomSelection(), RandomSelectionWithinSubsets(),
|
# RandomSelection(), RandomSelectionWithinSubsets(),
|
||||||
# SelectByLocation(), RandomExtract(), DeleteHoles(),
|
# SelectByLocation(), RandomExtract(), DeleteHoles(),
|
||||||
# RandomExtractWithinSubsets(), ExtractByLocation(),
|
# RandomExtractWithinSubsets(), ExtractByLocation(),
|
||||||
@ -265,7 +265,8 @@ class QGISAlgorithmProvider(QgsProcessingProvider):
|
|||||||
Boundary(),
|
Boundary(),
|
||||||
BoundingBox(),
|
BoundingBox(),
|
||||||
Clip(),
|
Clip(),
|
||||||
DeleteColumn()
|
DeleteColumn(),
|
||||||
|
ExtentFromLayer()
|
||||||
]
|
]
|
||||||
|
|
||||||
if hasPlotly:
|
if hasPlotly:
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
|
|
||||||
<gml:featureMember>
|
<gml:featureMember>
|
||||||
<ogr:polygon_from_extent fid="polygon_from_extent.0">
|
<ogr:polygon_from_extent fid="polygon_from_extent.0">
|
||||||
<ogr:geometryProperty><gml:Polygon srsName="EPSG:4326"><gml:outerBoundaryIs><gml:LinearRing><gml:coordinates>-1,-3 -1,6 10,6 10,-3 -1,-3</gml:coordinates></gml:LinearRing></gml:outerBoundaryIs></gml:Polygon></ogr:geometryProperty>
|
<ogr:geometryProperty><gml:Polygon srsName="EPSG:4326"><gml:outerBoundaryIs><gml:LinearRing><gml:coordinates>-1,-3 10,-3 10,6 -1,6 -1,-3</gml:coordinates></gml:LinearRing></gml:outerBoundaryIs></gml:Polygon></ogr:geometryProperty>
|
||||||
<ogr:MINX>-1</ogr:MINX>
|
<ogr:MINX>-1</ogr:MINX>
|
||||||
<ogr:MINY>-3</ogr:MINY>
|
<ogr:MINY>-3</ogr:MINY>
|
||||||
<ogr:MAXX>10</ogr:MAXX>
|
<ogr:MAXX>10</ogr:MAXX>
|
||||||
|
@ -2342,18 +2342,18 @@ tests:
|
|||||||
# name: expected/find_projection.html
|
# name: expected/find_projection.html
|
||||||
# type: file
|
# type: file
|
||||||
#
|
#
|
||||||
# - algorithm: qgis:polygonfromlayerextent
|
- algorithm: qgis:polygonfromlayerextent
|
||||||
# name: Standard polygon from layer extent
|
name: Standard polygon from layer extent
|
||||||
# params:
|
params:
|
||||||
# BY_FEATURE: false
|
BY_FEATURE: false
|
||||||
# INPUT_LAYER:
|
INPUT_LAYER:
|
||||||
# name: polys.gml
|
name: polys.gml
|
||||||
# type: vector
|
type: vector
|
||||||
# results:
|
results:
|
||||||
# OUTPUT:
|
OUTPUT:
|
||||||
# name: expected/polygon_from_extent.gml
|
name: expected/polygon_from_extent.gml
|
||||||
# type: vector
|
type: vector
|
||||||
#
|
|
||||||
# - algorithm: qgis:topologicalcoloring
|
# - algorithm: qgis:topologicalcoloring
|
||||||
# name: Topological coloring
|
# name: Topological coloring
|
||||||
# params:
|
# params:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user