Merge pull request #4863 from nyalldawson/nn

Port 2 more processing algorithms
This commit is contained in:
Nyall Dawson 2017-07-16 17:30:15 +10:00 committed by GitHub
commit aec6a79462
13 changed files with 1129 additions and 256 deletions

View File

@ -31,12 +31,16 @@ import math
from qgis.PyQt.QtGui import QIcon from qgis.PyQt.QtGui import QIcon
from qgis.PyQt.QtCore import QVariant from qgis.PyQt.QtCore import QVariant
from qgis.core import QgsFeature, QgsGeometry, QgsWkbTypes, QgsField, QgsFeatureSink, QgsProcessingUtils from qgis.core import (QgsFeature,
QgsGeometry,
QgsWkbTypes,
QgsField,
QgsFeatureSink,
QgsProcessing,
QgsProcessingParameterFeatureSource,
QgsProcessingParameterFeatureSink)
from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm
from processing.core.parameters import ParameterVector
from processing.core.outputs import OutputVector
from processing.tools import dataobjects, vector
pluginPath = os.path.split(os.path.split(os.path.dirname(__file__))[0])[0] pluginPath = os.path.split(os.path.split(os.path.dirname(__file__))[0])[0]
@ -56,12 +60,10 @@ class ExtractNodes(QgisAlgorithm):
super().__init__() super().__init__()
def initAlgorithm(self, config=None): def initAlgorithm(self, config=None):
self.addParameter(ParameterVector(self.INPUT, self.addParameter(QgsProcessingParameterFeatureSource(self.INPUT,
self.tr('Input layer'), self.tr('Input layer')))
[dataobjects.TYPE_VECTOR_POLYGON,
dataobjects.TYPE_VECTOR_LINE]))
self.addOutput(OutputVector(self.OUTPUT, self.tr('Nodes'), datatype=[dataobjects.TYPE_VECTOR_POINT])) self.addParameter(QgsProcessingParameterFeatureSink(self.OUTPUT, self.tr('Nodes'), QgsProcessing.TypeVectorPoint))
def name(self): def name(self):
return 'extractnodes' return 'extractnodes'
@ -70,36 +72,51 @@ class ExtractNodes(QgisAlgorithm):
return self.tr('Extract nodes') return self.tr('Extract nodes')
def processAlgorithm(self, parameters, context, feedback): def processAlgorithm(self, parameters, context, feedback):
layer = QgsProcessingUtils.mapLayerFromString(self.getParameterValue(self.INPUT), context) source = self.parameterAsSource(parameters, self.INPUT, context)
fields = layer.fields() fields = source.fields()
fields.append(QgsField('node_index', QVariant.Int)) fields.append(QgsField('node_index', QVariant.Int))
fields.append(QgsField('distance', QVariant.Double)) fields.append(QgsField('distance', QVariant.Double))
fields.append(QgsField('angle', QVariant.Double)) fields.append(QgsField('angle', QVariant.Double))
writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fields, QgsWkbTypes.Point, layer.crs(), context) out_wkb = QgsWkbTypes.Point
if QgsWkbTypes.hasM(source.wkbType()):
out_wkb = QgsWkbTypes.addM(out_wkb)
if QgsWkbTypes.hasZ(source.wkbType()):
out_wkb = QgsWkbTypes.addZ(out_wkb)
features = QgsProcessingUtils.getFeatures(layer, context) (sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
total = 100.0 / layer.featureCount() if layer.featureCount() else 0 fields, out_wkb, source.sourceCrs())
features = source.getFeatures()
total = 100.0 / source.featureCount() if source.featureCount() else 0
for current, f in enumerate(features): for current, f in enumerate(features):
if feedback.isCanceled():
break
input_geometry = f.geometry() input_geometry = f.geometry()
if not input_geometry: if not input_geometry:
writer.addFeature(f, QgsFeatureSink.FastInsert) sink.addFeature(f, QgsFeatureSink.FastInsert)
else: else:
points = vector.extractPoints(input_geometry) i = 0
for part in input_geometry.geometry().coordinateSequence():
for ring in part:
if feedback.isCanceled():
break
for i, point in enumerate(points): for point in ring:
distance = input_geometry.distanceToVertex(i) distance = input_geometry.distanceToVertex(i)
angle = math.degrees(input_geometry.angleAtVertex(i)) angle = math.degrees(input_geometry.angleAtVertex(i))
attrs = f.attributes() attrs = f.attributes()
attrs.append(i) attrs.append(i)
attrs.append(distance) attrs.append(distance)
attrs.append(angle) attrs.append(angle)
output_feature = QgsFeature() output_feature = QgsFeature()
output_feature.setAttributes(attrs) output_feature.setAttributes(attrs)
output_feature.setGeometry(QgsGeometry.fromPoint(point)) output_feature.setGeometry(QgsGeometry(point.clone()))
writer.addFeature(output_feature, QgsFeatureSink.FastInsert) sink.addFeature(output_feature, QgsFeatureSink.FastInsert)
i += 1
feedback.setProgress(int(current * total)) feedback.setProgress(int(current * total))
del writer return {self.OUTPUT: dest_id}

View File

@ -31,21 +31,28 @@ import os
from qgis.PyQt.QtGui import QIcon from qgis.PyQt.QtGui import QIcon
from qgis.PyQt.QtCore import QVariant from qgis.PyQt.QtCore import QVariant
from qgis.core import QgsField, QgsFeature, QgsGeometry, QgsPointXY, QgsWkbTypes, QgsProcessingUtils, QgsFeatureSink, QgsFields from qgis.core import (QgsField,
QgsFeature,
QgsGeometry,
QgsPointXY,
QgsWkbTypes,
QgsFeatureRequest,
QgsFeatureSink,
QgsFields,
QgsProcessing,
QgsProcessingParameterFeatureSink,
QgsProcessingParameterField,
QgsProcessingParameterFeatureSource,
QgsProcessingException)
from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm
from processing.core.GeoAlgorithmExecutionException import GeoAlgorithmExecutionException from processing.tools import vector
from processing.core.parameters import ParameterTableField
from processing.core.parameters import ParameterVector
from processing.core.outputs import OutputVector
from processing.tools import dataobjects, vector
pluginPath = os.path.split(os.path.split(os.path.dirname(__file__))[0])[0] pluginPath = os.path.split(os.path.split(os.path.dirname(__file__))[0])[0]
class MeanCoords(QgisAlgorithm): class MeanCoords(QgisAlgorithm):
INPUT = 'INPUT'
POINTS = 'POINTS'
WEIGHT = 'WEIGHT' WEIGHT = 'WEIGHT'
OUTPUT = 'OUTPUT' OUTPUT = 'OUTPUT'
UID = 'UID' UID = 'UID'
@ -61,19 +68,19 @@ class MeanCoords(QgisAlgorithm):
super().__init__() super().__init__()
def initAlgorithm(self, config=None): def initAlgorithm(self, config=None):
self.addParameter(ParameterVector(self.POINTS, self.addParameter(QgsProcessingParameterFeatureSource(self.INPUT,
self.tr('Input layer'))) self.tr('Input layer')))
self.addParameter(ParameterTableField(self.WEIGHT, self.addParameter(QgsProcessingParameterField(self.WEIGHT, self.tr('Weight field'),
self.tr('Weight field'), parentLayerParameterName=MeanCoords.INPUT,
MeanCoords.POINTS, type=QgsProcessingParameterField.Numeric,
ParameterTableField.DATA_TYPE_NUMBER, optional=True))
optional=True)) self.addParameter(QgsProcessingParameterField(self.UID,
self.addParameter(ParameterTableField(self.UID, self.tr('Unique ID field'),
self.tr('Unique ID field'), parentLayerParameterName=MeanCoords.INPUT,
MeanCoords.POINTS, optional=True))
optional=True))
self.addOutput(OutputVector(MeanCoords.OUTPUT, self.tr('Mean coordinates'), datatype=[dataobjects.TYPE_VECTOR_POINT])) self.addParameter(QgsProcessingParameterFeatureSink(MeanCoords.OUTPUT, self.tr('Mean coordinates'),
QgsProcessing.TypeVectorPoint))
def name(self): def name(self):
return 'meancoordinates' return 'meancoordinates'
@ -82,46 +89,58 @@ class MeanCoords(QgisAlgorithm):
return self.tr('Mean coordinate(s)') return self.tr('Mean coordinate(s)')
def processAlgorithm(self, parameters, context, feedback): def processAlgorithm(self, parameters, context, feedback):
layer = QgsProcessingUtils.mapLayerFromString(self.getParameterValue(self.POINTS), context) source = self.parameterAsSource(parameters, self.INPUT, context)
weightField = self.getParameterValue(self.WEIGHT)
uniqueField = self.getParameterValue(self.UID)
if weightField is None: weight_field = self.parameterAsString(parameters, self.WEIGHT, context)
weightIndex = -1 unique_field = self.parameterAsString(parameters, self.UID, context)
attributes = []
if not weight_field:
weight_index = -1
else: else:
weightIndex = layer.fields().lookupField(weightField) weight_index = source.fields().lookupField(weight_field)
if weight_index >= 0:
attributes.append(weight_index)
if uniqueField is None: if not unique_field:
uniqueIndex = -1 unique_index = -1
else: else:
uniqueIndex = layer.fields().lookupField(uniqueField) unique_index = source.fields().lookupField(unique_field)
if unique_index >= 0:
attributes.append(unique_index)
fieldList = QgsFields() field_list = QgsFields()
fieldList.append(QgsField('MEAN_X', QVariant.Double, '', 24, 15)) field_list.append(QgsField('MEAN_X', QVariant.Double, '', 24, 15))
fieldList.append(QgsField('MEAN_Y', QVariant.Double, '', 24, 15)) field_list.append(QgsField('MEAN_Y', QVariant.Double, '', 24, 15))
fieldList.append(QgsField('UID', QVariant.String, '', 255)) if unique_index >= 0:
field_list.append(QgsField('UID', QVariant.String, '', 255))
writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fieldList, QgsWkbTypes.Point, layer.crs(), context) (sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
field_list, QgsWkbTypes.Point, source.sourceCrs())
features = QgsProcessingUtils.getFeatures(layer, context) features = source.getFeatures(QgsFeatureRequest().setSubsetOfAttributes(attributes))
total = 100.0 / layer.featureCount() if layer.featureCount() else 0 total = 100.0 / source.featureCount() if source.featureCount() else 0
means = {} means = {}
for current, feat in enumerate(features): for current, feat in enumerate(features):
if feedback.isCanceled():
break
feedback.setProgress(int(current * total)) feedback.setProgress(int(current * total))
if uniqueIndex == -1: if unique_index == -1:
clazz = "Single class" clazz = "Single class"
else: else:
clazz = str(feat.attributes()[uniqueIndex]).strip() clazz = str(feat.attributes()[unique_index]).strip()
if weightIndex == -1: if weight_index == -1:
weight = 1.00 weight = 1.00
else: else:
try: try:
weight = float(feat.attributes()[weightIndex]) weight = float(feat.attributes()[weight_index])
except: except:
weight = 1.00 weight = 1.00
if weight < 0: if weight < 0:
raise GeoAlgorithmExecutionException(self.tr('Negative weight value found. Please fix your data and try again.')) raise QgsProcessingException(
self.tr('Negative weight value found. Please fix your data and try again.'))
if clazz not in means: if clazz not in means:
means[clazz] = (0, 0, 0) means[clazz] = (0, 0, 0)
@ -138,15 +157,21 @@ class MeanCoords(QgisAlgorithm):
current = 0 current = 0
total = 100.0 / len(means) if means else 1 total = 100.0 / len(means) if means else 1
for (clazz, values) in list(means.items()): for (clazz, values) in list(means.items()):
if feedback.isCanceled():
break
outFeat = QgsFeature() outFeat = QgsFeature()
cx = values[0] / values[2] cx = values[0] / values[2]
cy = values[1] / values[2] cy = values[1] / values[2]
meanPoint = QgsPointXY(cx, cy) meanPoint = QgsPointXY(cx, cy)
outFeat.setGeometry(QgsGeometry.fromPoint(meanPoint)) outFeat.setGeometry(QgsGeometry.fromPoint(meanPoint))
outFeat.setAttributes([cx, cy, clazz]) attributes = [cx, cy]
writer.addFeature(outFeat, QgsFeatureSink.FastInsert) if unique_index >= 0:
attributes.append(clazz)
outFeat.setAttributes(attributes)
sink.addFeature(outFeat, QgsFeatureSink.FastInsert)
current += 1 current += 1
feedback.setProgress(int(current * total)) feedback.setProgress(int(current * total))
del writer return {self.OUTPUT: dest_id}

View File

@ -32,29 +32,38 @@ import os
import math import math
from qgis.PyQt.QtGui import QIcon from qgis.PyQt.QtGui import QIcon
from qgis.PyQt.QtCore import QVariant
from qgis.core import QgsFeatureRequest, QgsProject, QgsDistanceArea, QgsFeatureSink, QgsProcessingUtils from qgis.core import (QgsFeatureRequest,
QgsField,
QgsFields,
QgsProject,
QgsFeature,
QgsGeometry,
QgsDistanceArea,
QgsFeatureSink,
QgsProcessingParameterFeatureSource,
QgsProcessing,
QgsProcessingParameterEnum,
QgsProcessingParameterField,
QgsProcessingParameterNumber,
QgsProcessingParameterFeatureSink,
QgsSpatialIndex,
QgsWkbTypes)
from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm
from processing.core.parameters import ParameterNumber
from processing.core.parameters import ParameterVector
from processing.core.parameters import ParameterSelection
from processing.core.parameters import ParameterTableField
from processing.core.outputs import OutputTable
from processing.tools import dataobjects
pluginPath = os.path.split(os.path.split(os.path.dirname(__file__))[0])[0] pluginPath = os.path.split(os.path.split(os.path.dirname(__file__))[0])[0]
class PointDistance(QgisAlgorithm): class PointDistance(QgisAlgorithm):
INPUT = 'INPUT'
INPUT_LAYER = 'INPUT_LAYER'
INPUT_FIELD = 'INPUT_FIELD' INPUT_FIELD = 'INPUT_FIELD'
TARGET_LAYER = 'TARGET_LAYER' TARGET = 'TARGET'
TARGET_FIELD = 'TARGET_FIELD' TARGET_FIELD = 'TARGET_FIELD'
MATRIX_TYPE = 'MATRIX_TYPE' MATRIX_TYPE = 'MATRIX_TYPE'
NEAREST_POINTS = 'NEAREST_POINTS' NEAREST_POINTS = 'NEAREST_POINTS'
DISTANCE_MATRIX = 'DISTANCE_MATRIX' OUTPUT = 'OUTPUT'
def icon(self): def icon(self):
return QIcon(os.path.join(pluginPath, 'images', 'ftools', 'matrix.png')) return QIcon(os.path.join(pluginPath, 'images', 'ftools', 'matrix.png'))
@ -70,22 +79,26 @@ class PointDistance(QgisAlgorithm):
self.tr('Standard (N x T) distance matrix'), self.tr('Standard (N x T) distance matrix'),
self.tr('Summary distance matrix (mean, std. dev., min, max)')] self.tr('Summary distance matrix (mean, std. dev., min, max)')]
self.addParameter(ParameterVector(self.INPUT_LAYER, self.addParameter(QgsProcessingParameterFeatureSource(self.INPUT,
self.tr('Input point layer'), [dataobjects.TYPE_VECTOR_POINT])) self.tr('Input point layer'),
self.addParameter(ParameterTableField(self.INPUT_FIELD, [QgsProcessing.TypeVectorPoint]))
self.tr('Input unique ID field'), self.INPUT_LAYER, self.addParameter(QgsProcessingParameterField(self.INPUT_FIELD,
ParameterTableField.DATA_TYPE_ANY)) self.tr('Input unique ID field'),
self.addParameter(ParameterVector(self.TARGET_LAYER, parentLayerParameterName=self.INPUT,
self.tr('Target point layer'), dataobjects.TYPE_VECTOR_POINT)) type=QgsProcessingParameterField.Any))
self.addParameter(ParameterTableField(self.TARGET_FIELD, self.addParameter(QgsProcessingParameterFeatureSource(self.TARGET,
self.tr('Target unique ID field'), self.TARGET_LAYER, self.tr('Target point layer'),
ParameterTableField.DATA_TYPE_ANY)) [QgsProcessing.TypeVectorPoint]))
self.addParameter(ParameterSelection(self.MATRIX_TYPE, self.addParameter(QgsProcessingParameterField(self.TARGET_FIELD,
self.tr('Output matrix type'), self.mat_types, 0)) self.tr('Target unique ID field'),
self.addParameter(ParameterNumber(self.NEAREST_POINTS, parentLayerParameterName=self.TARGET,
self.tr('Use only the nearest (k) target points'), 0, 9999, 0)) type=QgsProcessingParameterField.Any))
self.addParameter(QgsProcessingParameterEnum(self.MATRIX_TYPE,
self.tr('Output matrix type'), options=self.mat_types, defaultValue=0))
self.addParameter(QgsProcessingParameterNumber(self.NEAREST_POINTS,
self.tr('Use only the nearest (k) target points'), type=QgsProcessingParameterNumber.Integer, minValue=0, maxValue=9999, defaultValue=0))
self.addOutput(OutputTable(self.DISTANCE_MATRIX, self.tr('Distance matrix'))) self.addParameter(QgsProcessingParameterFeatureSink(self.OUTPUT, self.tr('Distance matrix'), QgsProcessing.TypeVectorPoint))
def name(self): def name(self):
return 'distancematrix' return 'distancematrix'
@ -94,65 +107,86 @@ class PointDistance(QgisAlgorithm):
return self.tr('Distance matrix') return self.tr('Distance matrix')
def processAlgorithm(self, parameters, context, feedback): def processAlgorithm(self, parameters, context, feedback):
inLayer = QgsProcessingUtils.mapLayerFromString(self.getParameterValue(self.INPUT_LAYER), context) source = self.parameterAsSource(parameters, self.INPUT, context)
inField = self.getParameterValue(self.INPUT_FIELD) source_field = self.parameterAsString(parameters, self.INPUT_FIELD, context)
targetLayer = QgsProcessingUtils.mapLayerFromString(self.getParameterValue(self.TARGET_LAYER), context) target_source = self.parameterAsSource(parameters, self.TARGET, context)
targetField = self.getParameterValue(self.TARGET_FIELD) target_field = self.parameterAsString(parameters, self.TARGET_FIELD, context)
matType = self.getParameterValue(self.MATRIX_TYPE) matType = self.parameterAsEnum(parameters, self.MATRIX_TYPE, context)
nPoints = self.getParameterValue(self.NEAREST_POINTS) nPoints = self.parameterAsInt(parameters, self.NEAREST_POINTS, context)
outputFile = self.getOutputFromName(self.DISTANCE_MATRIX)
if nPoints < 1: if nPoints < 1:
nPoints = QgsProcessingUtils.featureCount(targetLayer, context) nPoints = target_source.featureCount()
self.writer = outputFile.getTableWriter([])
if matType == 0: if matType == 0:
# Linear distance matrix # Linear distance matrix
self.linearMatrix(context, inLayer, inField, targetLayer, targetField, return self.linearMatrix(parameters, context, source, source_field, target_source, target_field,
matType, nPoints, feedback) matType, nPoints, feedback)
elif matType == 1: elif matType == 1:
# Standard distance matrix # Standard distance matrix
self.regularMatrix(context, inLayer, inField, targetLayer, targetField, return self.regularMatrix(parameters, context, source, source_field, target_source, target_field,
nPoints, feedback) nPoints, feedback)
elif matType == 2: elif matType == 2:
# Summary distance matrix # Summary distance matrix
self.linearMatrix(context, inLayer, inField, targetLayer, targetField, return self.linearMatrix(parameters, context, source, source_field, target_source, target_field,
matType, nPoints, feedback) matType, nPoints, feedback)
def linearMatrix(self, context, inLayer, inField, targetLayer, targetField, def linearMatrix(self, parameters, context, source, inField, target_source, targetField,
matType, nPoints, feedback): matType, nPoints, feedback):
inIdx = source.fields().lookupField(inField)
outIdx = target_source.fields().lookupField(targetField)
fields = QgsFields()
input_id_field = source.fields()[inIdx]
input_id_field.setName('InputID')
fields.append(input_id_field)
if matType == 0: if matType == 0:
self.writer.addRecord(['InputID', 'TargetID', 'Distance']) target_id_field = target_source.fields()[outIdx]
target_id_field.setName('TargetID')
fields.append(target_id_field)
fields.append(QgsField('Distance', QVariant.Double))
else: else:
self.writer.addRecord(['InputID', 'MEAN', 'STDDEV', 'MIN', 'MAX']) fields.append(QgsField('MEAN', QVariant.Double))
fields.append(QgsField('STDDEV', QVariant.Double))
fields.append(QgsField('MIN', QVariant.Double))
fields.append(QgsField('MAX', QVariant.Double))
index = QgsProcessingUtils.createSpatialIndex(targetLayer, context) out_wkb = QgsWkbTypes.multiType(source.wkbType()) if matType == 0 else source.wkbType()
(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
fields, out_wkb, source.sourceCrs())
inIdx = inLayer.fields().lookupField(inField) index = QgsSpatialIndex(target_source.getFeatures(QgsFeatureRequest().setSubsetOfAttributes([]).setDestinationCrs(source.sourceCrs())), feedback)
outIdx = targetLayer.fields().lookupField(targetField)
distArea = QgsDistanceArea() distArea = QgsDistanceArea()
distArea.setSourceCrs(inLayer.crs()) distArea.setSourceCrs(source.sourceCrs())
distArea.setEllipsoid(QgsProject.instance().ellipsoid()) distArea.setEllipsoid(QgsProject.instance().ellipsoid())
features = QgsProcessingUtils.getFeatures(inLayer, context) features = source.getFeatures(QgsFeatureRequest().setSubsetOfAttributes([inIdx]))
total = 100.0 / inLayer.featureCount() if inLayer.featureCount() else 0 total = 100.0 / source.featureCount() if source.featureCount() else 0
for current, inFeat in enumerate(features): for current, inFeat in enumerate(features):
if feedback.isCanceled():
break
inGeom = inFeat.geometry() inGeom = inFeat.geometry()
inID = str(inFeat.attributes()[inIdx]) inID = str(inFeat.attributes()[inIdx])
featList = index.nearestNeighbor(inGeom.asPoint(), nPoints) featList = index.nearestNeighbor(inGeom.asPoint(), nPoints)
distList = [] distList = []
vari = 0.0 vari = 0.0
request = QgsFeatureRequest().setFilterFids(featList).setSubsetOfAttributes([outIdx]) request = QgsFeatureRequest().setFilterFids(featList).setSubsetOfAttributes([outIdx]).setDestinationCrs(source.sourceCrs())
for outFeat in targetLayer.getFeatures(request): for outFeat in target_source.getFeatures(request):
if feedback.isCanceled():
break
outID = outFeat.attributes()[outIdx] outID = outFeat.attributes()[outIdx]
outGeom = outFeat.geometry() outGeom = outFeat.geometry()
dist = distArea.measureLine(inGeom.asPoint(), dist = distArea.measureLine(inGeom.asPoint(),
outGeom.asPoint()) outGeom.asPoint())
if matType == 0: if matType == 0:
self.writer.addRecord([inID, str(outID), str(dist)]) out_feature = QgsFeature()
out_geom = QgsGeometry.unaryUnion([inFeat.geometry(), outFeat.geometry()])
out_feature.setGeometry(out_geom)
out_feature.setAttributes([inID, outID, dist])
sink.addFeature(out_feature, QgsFeatureSink.FastInsert)
else: else:
distList.append(float(dist)) distList.append(float(dist))
@ -161,44 +195,61 @@ class PointDistance(QgisAlgorithm):
for i in distList: for i in distList:
vari += (i - mean) * (i - mean) vari += (i - mean) * (i - mean)
vari = math.sqrt(vari / len(distList)) vari = math.sqrt(vari / len(distList))
self.writer.addRecord([inID, str(mean),
str(vari), str(min(distList)), out_feature = QgsFeature()
str(max(distList))]) out_feature.setGeometry(inFeat.geometry())
out_feature.setAttributes([inID, mean, vari, min(distList), max(distList)])
sink.addFeature(out_feature, QgsFeatureSink.FastInsert)
feedback.setProgress(int(current * total)) feedback.setProgress(int(current * total))
def regularMatrix(self, context, inLayer, inField, targetLayer, targetField, return {self.OUTPUT: dest_id}
nPoints, feedback):
index = QgsProcessingUtils.createSpatialIndex(targetLayer, context)
inIdx = inLayer.fields().lookupField(inField) def regularMatrix(self, parameters, context, source, inField, target_source, targetField,
nPoints, feedback):
index = QgsSpatialIndex(target_source.getFeatures(QgsFeatureRequest().setSubsetOfAttributes([]).setDestinationCrs(source.sourceCrs())), feedback)
inIdx = source.fields().lookupField(inField)
distArea = QgsDistanceArea() distArea = QgsDistanceArea()
distArea.setSourceCrs(inLayer.sourceCrs()) distArea.setSourceCrs(source.sourceCrs())
distArea.setEllipsoid(QgsProject.instance().ellipsoid()) distArea.setEllipsoid(QgsProject.instance().ellipsoid())
first = True first = True
features = QgsProcessingUtils.getFeatures(inLayer, context) sink = None
total = 100.0 / inLayer.featureCount() if inLayer.featureCount() else 0 dest_id = None
features = source.getFeatures(QgsFeatureRequest().setSubsetOfAttributes([inIdx]))
total = 100.0 / source.featureCount() if source.featureCount() else 0
for current, inFeat in enumerate(features): for current, inFeat in enumerate(features):
if feedback.isCanceled():
break
inGeom = inFeat.geometry() inGeom = inFeat.geometry()
inID = str(inFeat.attributes()[inIdx]) inID = str(inFeat.attributes()[inIdx])
featList = index.nearestNeighbor(inGeom.asPoint(), nPoints) featList = index.nearestNeighbor(inGeom.asPoint(), nPoints)
if first: if first:
first = False first = False
data = ['ID'] fields = QgsFields()
input_id_field = source.fields()[inIdx]
input_id_field.setName('ID')
fields.append(input_id_field)
for i in range(len(featList)): for i in range(len(featList)):
data.append('DIST_{0}'.format(i + 1)) fields.append(QgsField('DIST_{0}'.format(i + 1), QVariant.Double))
self.writer.addRecord(data) (sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
fields, source.wkbType(), source.sourceCrs())
data = [inID] data = [inID]
for i in featList: for target in target_source.getFeatures(QgsFeatureRequest().setSubsetOfAttributes([]).setFilterFids(featList).setDestinationCrs(source.sourceCrs())):
request = QgsFeatureRequest().setFilterFid(i) if feedback.isCanceled():
outFeat = next(targetLayer.getFeatures(request)) break
outGeom = outFeat.geometry() outGeom = target.geometry()
dist = distArea.measureLine(inGeom.asPoint(), dist = distArea.measureLine(inGeom.asPoint(),
outGeom.asPoint()) outGeom.asPoint())
data.append(str(float(dist))) data.append(float(dist))
self.writer.addRecord(data) out_feature = QgsFeature()
out_feature.setGeometry(inGeom)
out_feature.setAttributes(data)
sink.addFeature(out_feature, QgsFeatureSink.FastInsert)
feedback.setProgress(int(current * total)) feedback.setProgress(int(current * total))
return {self.OUTPUT: dest_id}

View File

@ -57,6 +57,7 @@ from .DensifyGeometriesInterval import DensifyGeometriesInterval
from .Difference import Difference from .Difference import Difference
from .DropGeometry import DropGeometry from .DropGeometry import DropGeometry
from .ExtentFromLayer import ExtentFromLayer from .ExtentFromLayer import ExtentFromLayer
from .ExtractNodes import ExtractNodes
from .FixGeometry import FixGeometry from .FixGeometry import FixGeometry
from .GridPolygon import GridPolygon from .GridPolygon import GridPolygon
from .Heatmap import Heatmap from .Heatmap import Heatmap
@ -66,8 +67,10 @@ from .ImportIntoSpatialite import ImportIntoSpatialite
from .Intersection import Intersection from .Intersection import Intersection
from .LinesIntersection import LinesIntersection from .LinesIntersection import LinesIntersection
from .LinesToPolygons import LinesToPolygons from .LinesToPolygons import LinesToPolygons
from .MeanCoords import MeanCoords
from .Merge import Merge from .Merge import Merge
from .NearestNeighbourAnalysis import NearestNeighbourAnalysis from .NearestNeighbourAnalysis import NearestNeighbourAnalysis
from .PointDistance import PointDistance
from .PointsInPolygon import PointsInPolygon from .PointsInPolygon import PointsInPolygon
from .PointsLayerFromTable import PointsLayerFromTable from .PointsLayerFromTable import PointsLayerFromTable
from .PolygonsToLines import PolygonsToLines from .PolygonsToLines import PolygonsToLines
@ -87,17 +90,14 @@ from .SpatialiteExecuteSQL import SpatialiteExecuteSQL
from .SumLines import SumLines from .SumLines import SumLines
from .SymmetricalDifference import SymmetricalDifference from .SymmetricalDifference import SymmetricalDifference
from .Union import Union from .Union import Union
from .UniqueValues import UniqueValues
from .VectorSplit import VectorSplit from .VectorSplit import VectorSplit
from .VoronoiPolygons import VoronoiPolygons from .VoronoiPolygons import VoronoiPolygons
from .ZonalStatistics import ZonalStatistics from .ZonalStatistics import ZonalStatistics
# from .ExtractByLocation import ExtractByLocation # from .ExtractByLocation import ExtractByLocation
# from .MeanCoords import MeanCoords
# from .PointDistance import PointDistance
# from .UniqueValues import UniqueValues
# from .ExportGeometryInfo import ExportGeometryInfo # from .ExportGeometryInfo import ExportGeometryInfo
# from .SinglePartsToMultiparts import SinglePartsToMultiparts # from .SinglePartsToMultiparts import SinglePartsToMultiparts
# from .ExtractNodes import ExtractNodes
# from .ConvexHull import ConvexHull # from .ConvexHull import ConvexHull
# from .FixedDistanceBuffer import FixedDistanceBuffer # from .FixedDistanceBuffer import FixedDistanceBuffer
# from .VariableDistanceBuffer import VariableDistanceBuffer # from .VariableDistanceBuffer import VariableDistanceBuffer
@ -183,11 +183,10 @@ class QGISAlgorithmProvider(QgsProcessingProvider):
self.externalAlgs = [] self.externalAlgs = []
def getAlgs(self): def getAlgs(self):
# algs = [MeanCoords(), # algs = [
# UniqueValues(), PointDistance(), #
# ExportGeometryInfo(), # ExportGeometryInfo(),
# SinglePartsToMultiparts(), # SinglePartsToMultiparts(),
# ExtractNodes(),
# ConvexHull(), FixedDistanceBuffer(), # ConvexHull(), FixedDistanceBuffer(),
# VariableDistanceBuffer(), # VariableDistanceBuffer(),
# RandomSelection(), RandomSelectionWithinSubsets(), # RandomSelection(), RandomSelectionWithinSubsets(),
@ -251,6 +250,7 @@ class QGISAlgorithmProvider(QgsProcessingProvider):
Difference(), Difference(),
DropGeometry(), DropGeometry(),
ExtentFromLayer(), ExtentFromLayer(),
ExtractNodes(),
FixGeometry(), FixGeometry(),
GridPolygon(), GridPolygon(),
Heatmap(), Heatmap(),
@ -260,8 +260,10 @@ class QGISAlgorithmProvider(QgsProcessingProvider):
Intersection(), Intersection(),
LinesIntersection(), LinesIntersection(),
LinesToPolygons(), LinesToPolygons(),
MeanCoords(),
Merge(), Merge(),
NearestNeighbourAnalysis(), NearestNeighbourAnalysis(),
PointDistance(),
PointsInPolygon(), PointsInPolygon(),
PointsLayerFromTable(), PointsLayerFromTable(),
PolygonsToLines(), PolygonsToLines(),
@ -281,6 +283,7 @@ class QGISAlgorithmProvider(QgsProcessingProvider):
SumLines(), SumLines(),
SymmetricalDifference(), SymmetricalDifference(),
Union(), Union(),
UniqueValues(),
VectorSplit(), VectorSplit(),
VoronoiPolygons(), VoronoiPolygons(),
ZonalStatistics() ZonalStatistics()

View File

@ -31,25 +31,32 @@ import codecs
from qgis.PyQt.QtGui import QIcon from qgis.PyQt.QtGui import QIcon
from qgis.core import QgsProcessingUtils, QgsFeatureSink from qgis.core import (QgsCoordinateReferenceSystem,
QgsWkbTypes,
QgsFeature,
QgsFeatureSink,
QgsFields,
QgsProcessingParameterField,
QgsProcessingParameterFeatureSource,
QgsProcessingParameterFeatureSink,
QgsProcessingOutputNumber,
QgsProcessingOutputString,
QgsProcessingParameterFileDestination,
QgsProcessingOutputHtml)
from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm
from processing.core.parameters import ParameterVector
from processing.core.parameters import ParameterTableField
from processing.core.outputs import OutputHTML
from processing.core.outputs import OutputNumber
from processing.core.outputs import OutputString
pluginPath = os.path.split(os.path.split(os.path.dirname(__file__))[0])[0] pluginPath = os.path.split(os.path.split(os.path.dirname(__file__))[0])[0]
class UniqueValues(QgisAlgorithm): class UniqueValues(QgisAlgorithm):
INPUT_LAYER = 'INPUT_LAYER' INPUT = 'INPUT'
FIELD_NAME = 'FIELD_NAME' FIELD_NAME = 'FIELD_NAME'
TOTAL_VALUES = 'TOTAL_VALUES' TOTAL_VALUES = 'TOTAL_VALUES'
UNIQUE_VALUES = 'UNIQUE_VALUES' UNIQUE_VALUES = 'UNIQUE_VALUES'
OUTPUT = 'OUTPUT' OUTPUT = 'OUTPUT'
OUTPUT_HTML_FILE = 'OUTPUT_HTML_FILE'
def icon(self): def icon(self):
return QIcon(os.path.join(pluginPath, 'images', 'ftools', 'unique.png')) return QIcon(os.path.join(pluginPath, 'images', 'ftools', 'unique.png'))
@ -61,14 +68,18 @@ class UniqueValues(QgisAlgorithm):
super().__init__() super().__init__()
def initAlgorithm(self, config=None): def initAlgorithm(self, config=None):
self.addParameter(ParameterVector(self.INPUT_LAYER, self.addParameter(QgsProcessingParameterFeatureSource(self.INPUT,
self.tr('Input layer'))) self.tr('Input layer')))
self.addParameter(ParameterTableField(self.FIELD_NAME, self.addParameter(QgsProcessingParameterField(self.FIELD_NAME,
self.tr('Target field'), self.tr('Target field'),
self.INPUT_LAYER, ParameterTableField.DATA_TYPE_ANY)) parentLayerParameterName=self.INPUT, type=QgsProcessingParameterField.Any))
self.addOutput(OutputHTML(self.OUTPUT, self.tr('Unique values')))
self.addOutput(OutputNumber(self.TOTAL_VALUES, self.tr('Total unique values'))) self.addParameter(QgsProcessingParameterFeatureSink(self.OUTPUT, self.tr('Unique values'), optional=True, defaultValue=''))
self.addOutput(OutputString(self.UNIQUE_VALUES, self.tr('Unique values')))
self.addParameter(QgsProcessingParameterFileDestination(self.OUTPUT_HTML_FILE, self.tr('HTML report'), self.tr('HTML files (*.html)'), None, True))
self.addOutput(QgsProcessingOutputHtml(self.OUTPUT_HTML_FILE, self.tr('HTML report')))
self.addOutput(QgsProcessingOutputNumber(self.TOTAL_VALUES, self.tr('Total unique values')))
self.addOutput(QgsProcessingOutputString(self.UNIQUE_VALUES, self.tr('Unique values')))
def name(self): def name(self):
return 'listuniquevalues' return 'listuniquevalues'
@ -77,14 +88,36 @@ class UniqueValues(QgisAlgorithm):
return self.tr('List unique values') return self.tr('List unique values')
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, context)
fieldName = self.getParameterValue(self.FIELD_NAME) field_name = self.parameterAsString(parameters, self.FIELD_NAME, context)
outputFile = self.getOutputValue(self.OUTPUT) values = source.uniqueValues(source.fields().lookupField(field_name))
values = QgsProcessingUtils.uniqueValues(layer, layer.fields().lookupField(fieldName), context)
self.createHTML(outputFile, values) fields = QgsFields()
self.setOutputValue(self.TOTAL_VALUES, len(values)) field = source.fields()[source.fields().lookupField(field_name)]
self.setOutputValue(self.UNIQUE_VALUES, ';'.join([str(v) for v in field.setName('VALUES')
values])) fields.append(field)
(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
fields, QgsWkbTypes.NoGeometry, QgsCoordinateReferenceSystem())
results = {}
if sink:
for value in values:
if feedback.isCanceled():
break
f = QgsFeature()
f.setAttributes([value])
sink.addFeature(f, QgsFeatureSink.FastInsert)
results[self.OUTPUT] = dest_id
output_file = self.parameterAsFileOutput(parameters, self.OUTPUT_HTML_FILE, context)
if output_file:
self.createHTML(output_file, values)
results[self.OUTPUT_HTML_FILE] = output_file
results[self.TOTAL_VALUES] = len(values)
results[self.UNIQUE_VALUES] = ';'.join([str(v) for v in
values])
return results
def createHTML(self, outputFile, algData): def createHTML(self, outputFile, algData):
with codecs.open(outputFile, 'w', encoding='utf-8') as f: with codecs.open(outputFile, 'w', encoding='utf-8') as f:

View File

@ -239,7 +239,7 @@ def createTest(text):
definition['params'] = params definition['params'] = params
for i, out in enumerate([out for out in alg.destinationParameterDefinitions() if not out.flags() & QgsProcessingParameterDefinition.FlagHiddenn]): for i, out in enumerate([out for out in alg.destinationParameterDefinitions() if not out.flags() & QgsProcessingParameterDefinition.FlagHidden]):
token = tokens[i - len(alg.destinationParameterDefinitions())] token = tokens[i - len(alg.destinationParameterDefinitions())]
if isinstance(out, (OutputNumber, OutputString)): if isinstance(out, (OutputNumber, OutputString)):

View File

@ -0,0 +1,33 @@
<GMLFeatureClassList>
<GMLFeatureClass>
<Name>distance_matrix</Name>
<ElementPath>distance_matrix</ElementPath>
<!--MULTIPOINT-->
<GeometryType>4</GeometryType>
<SRSName>EPSG:4326</SRSName>
<DatasetSpecificInfo>
<FeatureCount>81</FeatureCount>
<ExtentXMin>0.00000</ExtentXMin>
<ExtentXMax>8.00000</ExtentXMax>
<ExtentYMin>-5.00000</ExtentYMin>
<ExtentYMax>3.00000</ExtentYMax>
</DatasetSpecificInfo>
<PropertyDefn>
<Name>InputID</Name>
<ElementPath>InputID</ElementPath>
<Type>String</Type>
<Width>8</Width>
</PropertyDefn>
<PropertyDefn>
<Name>TargetID</Name>
<ElementPath>TargetID</ElementPath>
<Type>String</Type>
<Width>8</Width>
</PropertyDefn>
<PropertyDefn>
<Name>Distance</Name>
<ElementPath>Distance</ElementPath>
<Type>Real</Type>
</PropertyDefn>
</GMLFeatureClass>
</GMLFeatureClassList>

View File

@ -0,0 +1,662 @@
<?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</gml:X><gml:Y>-5</gml:Y></gml:coord>
<gml:coord><gml:X>8</gml:X><gml:Y>3</gml:Y></gml:coord>
</gml:Box>
</gml:boundedBy>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.0">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>1,1</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>3,3</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.0</ogr:InputID>
<ogr:TargetID>points.1</ogr:TargetID>
<ogr:Distance>2.82842712474619</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.1">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>1,1</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.0</ogr:InputID>
<ogr:TargetID>points.0</ogr:TargetID>
<ogr:Distance>0</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.2">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>1,1</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>7,-1</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.0</ogr:InputID>
<ogr:TargetID>points.7</ogr:TargetID>
<ogr:Distance>6.32455532033676</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.3">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>1,1</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>8,-1</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.0</ogr:InputID>
<ogr:TargetID>points.6</ogr:TargetID>
<ogr:Distance>7.28010988928052</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.4">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>0,-5</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>1,1</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.0</ogr:InputID>
<ogr:TargetID>points.5</ogr:TargetID>
<ogr:Distance>6.08276253029822</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.5">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>1,1</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>4,1</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.0</ogr:InputID>
<ogr:TargetID>points.4</ogr:TargetID>
<ogr:Distance>3</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.6">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>0,-1</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>1,1</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.0</ogr:InputID>
<ogr:TargetID>points.8</ogr:TargetID>
<ogr:Distance>2.23606797749979</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.7">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>1,1</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>5,2</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.0</ogr:InputID>
<ogr:TargetID>points.3</ogr:TargetID>
<ogr:Distance>4.12310562561766</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.8">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>1,1</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>2,2</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.0</ogr:InputID>
<ogr:TargetID>points.2</ogr:TargetID>
<ogr:Distance>1.4142135623731</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.9">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>3,3</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.1</ogr:InputID>
<ogr:TargetID>points.1</ogr:TargetID>
<ogr:Distance>0</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.10">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>1,1</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>3,3</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.1</ogr:InputID>
<ogr:TargetID>points.0</ogr:TargetID>
<ogr:Distance>2.82842712474619</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.11">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>3,3</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>7,-1</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.1</ogr:InputID>
<ogr:TargetID>points.7</ogr:TargetID>
<ogr:Distance>5.65685424949238</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.12">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>3,3</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>8,-1</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.1</ogr:InputID>
<ogr:TargetID>points.6</ogr:TargetID>
<ogr:Distance>6.40312423743285</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.13">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>0,-5</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>3,3</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.1</ogr:InputID>
<ogr:TargetID>points.5</ogr:TargetID>
<ogr:Distance>8.54400374531753</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.14">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>3,3</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>4,1</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.1</ogr:InputID>
<ogr:TargetID>points.4</ogr:TargetID>
<ogr:Distance>2.23606797749979</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.15">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>0,-1</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>3,3</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.1</ogr:InputID>
<ogr:TargetID>points.8</ogr:TargetID>
<ogr:Distance>5</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.16">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>3,3</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>5,2</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.1</ogr:InputID>
<ogr:TargetID>points.3</ogr:TargetID>
<ogr:Distance>2.23606797749979</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.17">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>2,2</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>3,3</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.1</ogr:InputID>
<ogr:TargetID>points.2</ogr:TargetID>
<ogr:Distance>1.4142135623731</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.18">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>2,2</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>3,3</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.2</ogr:InputID>
<ogr:TargetID>points.1</ogr:TargetID>
<ogr:Distance>1.4142135623731</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.19">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>1,1</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>2,2</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.2</ogr:InputID>
<ogr:TargetID>points.0</ogr:TargetID>
<ogr:Distance>1.4142135623731</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.20">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>2,2</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>7,-1</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.2</ogr:InputID>
<ogr:TargetID>points.7</ogr:TargetID>
<ogr:Distance>5.8309518948453</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.21">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>2,2</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>8,-1</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.2</ogr:InputID>
<ogr:TargetID>points.6</ogr:TargetID>
<ogr:Distance>6.70820393249937</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.22">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>0,-5</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>2,2</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.2</ogr:InputID>
<ogr:TargetID>points.5</ogr:TargetID>
<ogr:Distance>7.28010988928052</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.23">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>2,2</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>4,1</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.2</ogr:InputID>
<ogr:TargetID>points.4</ogr:TargetID>
<ogr:Distance>2.23606797749979</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.24">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>0,-1</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>2,2</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.2</ogr:InputID>
<ogr:TargetID>points.8</ogr:TargetID>
<ogr:Distance>3.60555127546399</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.25">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>2,2</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>5,2</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.2</ogr:InputID>
<ogr:TargetID>points.3</ogr:TargetID>
<ogr:Distance>3</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.26">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>2,2</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.2</ogr:InputID>
<ogr:TargetID>points.2</ogr:TargetID>
<ogr:Distance>0</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.27">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>3,3</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>5,2</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.3</ogr:InputID>
<ogr:TargetID>points.1</ogr:TargetID>
<ogr:Distance>2.23606797749979</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.28">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>1,1</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>5,2</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.3</ogr:InputID>
<ogr:TargetID>points.0</ogr:TargetID>
<ogr:Distance>4.12310562561766</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.29">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>5,2</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>7,-1</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.3</ogr:InputID>
<ogr:TargetID>points.7</ogr:TargetID>
<ogr:Distance>3.60555127546399</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.30">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>5,2</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>8,-1</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.3</ogr:InputID>
<ogr:TargetID>points.6</ogr:TargetID>
<ogr:Distance>4.24264068711928</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.31">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>0,-5</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>5,2</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.3</ogr:InputID>
<ogr:TargetID>points.5</ogr:TargetID>
<ogr:Distance>8.60232526704263</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.32">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>4,1</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>5,2</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.3</ogr:InputID>
<ogr:TargetID>points.4</ogr:TargetID>
<ogr:Distance>1.4142135623731</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.33">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>0,-1</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>5,2</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.3</ogr:InputID>
<ogr:TargetID>points.8</ogr:TargetID>
<ogr:Distance>5.8309518948453</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.34">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>5,2</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.3</ogr:InputID>
<ogr:TargetID>points.3</ogr:TargetID>
<ogr:Distance>0</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.35">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>2,2</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>5,2</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.3</ogr:InputID>
<ogr:TargetID>points.2</ogr:TargetID>
<ogr:Distance>3</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.36">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>3,3</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>4,1</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.4</ogr:InputID>
<ogr:TargetID>points.1</ogr:TargetID>
<ogr:Distance>2.23606797749979</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.37">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>1,1</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>4,1</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.4</ogr:InputID>
<ogr:TargetID>points.0</ogr:TargetID>
<ogr:Distance>3</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.38">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>4,1</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>7,-1</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.4</ogr:InputID>
<ogr:TargetID>points.7</ogr:TargetID>
<ogr:Distance>3.60555127546399</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.39">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>4,1</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>8,-1</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.4</ogr:InputID>
<ogr:TargetID>points.6</ogr:TargetID>
<ogr:Distance>4.47213595499958</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.40">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>0,-5</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>4,1</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.4</ogr:InputID>
<ogr:TargetID>points.5</ogr:TargetID>
<ogr:Distance>7.21110255092798</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.41">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>4,1</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.4</ogr:InputID>
<ogr:TargetID>points.4</ogr:TargetID>
<ogr:Distance>0</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.42">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>0,-1</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>4,1</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.4</ogr:InputID>
<ogr:TargetID>points.8</ogr:TargetID>
<ogr:Distance>4.47213595499958</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.43">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>4,1</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>5,2</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.4</ogr:InputID>
<ogr:TargetID>points.3</ogr:TargetID>
<ogr:Distance>1.4142135623731</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.44">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>2,2</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>4,1</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.4</ogr:InputID>
<ogr:TargetID>points.2</ogr:TargetID>
<ogr:Distance>2.23606797749979</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.45">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>0,-5</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>3,3</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.5</ogr:InputID>
<ogr:TargetID>points.1</ogr:TargetID>
<ogr:Distance>8.54400374531753</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.46">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>0,-5</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>1,1</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.5</ogr:InputID>
<ogr:TargetID>points.0</ogr:TargetID>
<ogr:Distance>6.08276253029822</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.47">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>0,-5</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>7,-1</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.5</ogr:InputID>
<ogr:TargetID>points.7</ogr:TargetID>
<ogr:Distance>8.06225774829855</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.48">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>0,-5</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>8,-1</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.5</ogr:InputID>
<ogr:TargetID>points.6</ogr:TargetID>
<ogr:Distance>8.94427190999916</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.49">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>0,-5</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.5</ogr:InputID>
<ogr:TargetID>points.5</ogr:TargetID>
<ogr:Distance>0</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.50">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>0,-5</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>4,1</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.5</ogr:InputID>
<ogr:TargetID>points.4</ogr:TargetID>
<ogr:Distance>7.21110255092798</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.51">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>0,-5</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>0,-1</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.5</ogr:InputID>
<ogr:TargetID>points.8</ogr:TargetID>
<ogr:Distance>4</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.52">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>0,-5</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>5,2</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.5</ogr:InputID>
<ogr:TargetID>points.3</ogr:TargetID>
<ogr:Distance>8.60232526704263</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.53">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>0,-5</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>2,2</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.5</ogr:InputID>
<ogr:TargetID>points.2</ogr:TargetID>
<ogr:Distance>7.28010988928052</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.54">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>3,3</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>8,-1</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.6</ogr:InputID>
<ogr:TargetID>points.1</ogr:TargetID>
<ogr:Distance>6.40312423743285</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.55">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>1,1</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>8,-1</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.6</ogr:InputID>
<ogr:TargetID>points.0</ogr:TargetID>
<ogr:Distance>7.28010988928052</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.56">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>7,-1</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>8,-1</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.6</ogr:InputID>
<ogr:TargetID>points.7</ogr:TargetID>
<ogr:Distance>1</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.57">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>8,-1</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.6</ogr:InputID>
<ogr:TargetID>points.6</ogr:TargetID>
<ogr:Distance>0</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.58">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>0,-5</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>8,-1</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.6</ogr:InputID>
<ogr:TargetID>points.5</ogr:TargetID>
<ogr:Distance>8.94427190999916</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.59">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>4,1</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>8,-1</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.6</ogr:InputID>
<ogr:TargetID>points.4</ogr:TargetID>
<ogr:Distance>4.47213595499958</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.60">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>0,-1</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>8,-1</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.6</ogr:InputID>
<ogr:TargetID>points.8</ogr:TargetID>
<ogr:Distance>8</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.61">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>5,2</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>8,-1</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.6</ogr:InputID>
<ogr:TargetID>points.3</ogr:TargetID>
<ogr:Distance>4.24264068711928</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.62">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>2,2</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>8,-1</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.6</ogr:InputID>
<ogr:TargetID>points.2</ogr:TargetID>
<ogr:Distance>6.70820393249937</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.63">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>3,3</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>7,-1</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.7</ogr:InputID>
<ogr:TargetID>points.1</ogr:TargetID>
<ogr:Distance>5.65685424949238</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.64">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>1,1</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>7,-1</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.7</ogr:InputID>
<ogr:TargetID>points.0</ogr:TargetID>
<ogr:Distance>6.32455532033676</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.65">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>7,-1</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.7</ogr:InputID>
<ogr:TargetID>points.7</ogr:TargetID>
<ogr:Distance>0</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.66">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>7,-1</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>8,-1</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.7</ogr:InputID>
<ogr:TargetID>points.6</ogr:TargetID>
<ogr:Distance>1</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.67">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>0,-5</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>7,-1</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.7</ogr:InputID>
<ogr:TargetID>points.5</ogr:TargetID>
<ogr:Distance>8.06225774829855</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.68">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>4,1</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>7,-1</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.7</ogr:InputID>
<ogr:TargetID>points.4</ogr:TargetID>
<ogr:Distance>3.60555127546399</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.69">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>0,-1</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>7,-1</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.7</ogr:InputID>
<ogr:TargetID>points.8</ogr:TargetID>
<ogr:Distance>7</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.70">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>5,2</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>7,-1</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.7</ogr:InputID>
<ogr:TargetID>points.3</ogr:TargetID>
<ogr:Distance>3.60555127546399</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.71">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>2,2</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>7,-1</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.7</ogr:InputID>
<ogr:TargetID>points.2</ogr:TargetID>
<ogr:Distance>5.8309518948453</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.72">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>0,-1</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>3,3</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.8</ogr:InputID>
<ogr:TargetID>points.1</ogr:TargetID>
<ogr:Distance>5</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.73">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>0,-1</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>1,1</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.8</ogr:InputID>
<ogr:TargetID>points.0</ogr:TargetID>
<ogr:Distance>2.23606797749979</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.74">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>0,-1</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>7,-1</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.8</ogr:InputID>
<ogr:TargetID>points.7</ogr:TargetID>
<ogr:Distance>7</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.75">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>0,-1</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>8,-1</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.8</ogr:InputID>
<ogr:TargetID>points.6</ogr:TargetID>
<ogr:Distance>8</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.76">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>0,-5</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>0,-1</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.8</ogr:InputID>
<ogr:TargetID>points.5</ogr:TargetID>
<ogr:Distance>4</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.77">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>0,-1</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>4,1</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.8</ogr:InputID>
<ogr:TargetID>points.4</ogr:TargetID>
<ogr:Distance>4.47213595499958</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.78">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>0,-1</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.8</ogr:InputID>
<ogr:TargetID>points.8</ogr:TargetID>
<ogr:Distance>0</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.79">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>0,-1</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>5,2</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.8</ogr:InputID>
<ogr:TargetID>points.3</ogr:TargetID>
<ogr:Distance>5.8309518948453</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
<gml:featureMember>
<ogr:distance_matrix fid="distance_matrix.80">
<ogr:geometryProperty><gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>0,-1</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>2,2</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></ogr:geometryProperty>
<ogr:InputID>points.8</ogr:InputID>
<ogr:TargetID>points.2</ogr:TargetID>
<ogr:Distance>3.60555127546399</ogr:Distance>
</ogr:distance_matrix>
</gml:featureMember>
</ogr:FeatureCollection>

View File

@ -22,11 +22,5 @@
<ElementPath>MEAN_Y</ElementPath> <ElementPath>MEAN_Y</ElementPath>
<Type>Real</Type> <Type>Real</Type>
</PropertyDefn> </PropertyDefn>
<PropertyDefn>
<Name>UID</Name>
<ElementPath>UID</ElementPath>
<Type>String</Type>
<Width>12</Width>
</PropertyDefn>
</GMLFeatureClass> </GMLFeatureClass>
</GMLFeatureClassList> </GMLFeatureClassList>

View File

@ -16,7 +16,6 @@
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>3.33333333333333,0.111111111111111</gml:coordinates></gml:Point></ogr:geometryProperty> <ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>3.33333333333333,0.111111111111111</gml:coordinates></gml:Point></ogr:geometryProperty>
<ogr:MEAN_X>3.333333333333333</ogr:MEAN_X> <ogr:MEAN_X>3.333333333333333</ogr:MEAN_X>
<ogr:MEAN_Y>0.111111111111111</ogr:MEAN_Y> <ogr:MEAN_Y>0.111111111111111</ogr:MEAN_Y>
<ogr:UID>Single class</ogr:UID>
</ogr:mean_coordinates> </ogr:mean_coordinates>
</gml:featureMember> </gml:featureMember>
</ogr:FeatureCollection> </ogr:FeatureCollection>

View File

@ -0,0 +1,15 @@
<GMLFeatureClassList>
<GMLFeatureClass>
<Name>unique_values</Name>
<ElementPath>unique_values</ElementPath>
<GeometryType>100</GeometryType>
<DatasetSpecificInfo>
<FeatureCount>3</FeatureCount>
</DatasetSpecificInfo>
<PropertyDefn>
<Name>VALUES</Name>
<ElementPath>VALUES</ElementPath>
<Type>Integer</Type>
</PropertyDefn>
</GMLFeatureClass>
</GMLFeatureClassList>

View File

@ -0,0 +1,24 @@
<?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:null>missing</gml:null></gml:boundedBy>
<gml:featureMember>
<ogr:unique_values fid="unique_values.0">
<ogr:VALUES>0</ogr:VALUES>
</ogr:unique_values>
</gml:featureMember>
<gml:featureMember>
<ogr:unique_values fid="unique_values.1">
<ogr:VALUES>1</ogr:VALUES>
</ogr:unique_values>
</gml:featureMember>
<gml:featureMember>
<ogr:unique_values fid="unique_values.2">
<ogr:VALUES>2</ogr:VALUES>
</ogr:unique_values>
</gml:featureMember>
</ogr:FeatureCollection>

View File

@ -241,6 +241,19 @@ tests:
# geometry: # geometry:
# precision: 7 # precision: 7
# #
- algorithm: qgis:listuniquevalues
name: Unique values
params:
INPUT:
name: points.gml
type: vector
FIELD_NAME: id2
results:
OUTPUT:
name: expected/unique_values.gml
type: vector
- algorithm: qgis:addautoincrementalfield - algorithm: qgis:addautoincrementalfield
name: Add autoincremental field name: Add autoincremental field
params: params:
@ -876,50 +889,50 @@ tests:
# OUTPUT_LAYER: # OUTPUT_LAYER:
# name: expected/single_sided_buffer_multiline_bevel.gml # name: expected/single_sided_buffer_multiline_bevel.gml
# type: vector # type: vector
#
# - algorithm: qgis:extractnodes - algorithm: qgis:extractnodes
# name: Test (qgis:extractnodes) name: Test (qgis:extractnodes)
# params: params:
# INPUT: INPUT:
# name: multipolys.gml name: multipolys.gml
# type: vector type: vector
# results: results:
# OUTPUT: OUTPUT:
# name: expected/extract_nodes_multipolys.gml name: expected/extract_nodes_multipolys.gml
# type: vector type: vector
#
# - algorithm: qgis:extractnodes - algorithm: qgis:extractnodes
# name: Extract nodes from polygons name: Extract nodes from polygons
# params: params:
# INPUT: INPUT:
# name: polys.gml name: polys.gml
# type: vector type: vector
# results: results:
# OUTPUT: OUTPUT:
# name: expected/extract_nodes_polys.gml name: expected/extract_nodes_polys.gml
# type: vector type: vector
#
# - algorithm: qgis:extractnodes - algorithm: qgis:extractnodes
# name: Extract nodes from multilines name: Extract nodes from multilines
# params: params:
# INPUT: INPUT:
# name: multilines.gml name: multilines.gml
# type: vector type: vector
# results: results:
# OUTPUT: OUTPUT:
# name: expected/extract_nodes_multilines.gml name: expected/extract_nodes_multilines.gml
# type: vector type: vector
#
# - algorithm: qgis:extractnodes - algorithm: qgis:extractnodes
# name: Extract nodes from lines name: Extract nodes from lines
# params: params:
# INPUT: INPUT:
# name: lines.gml name: lines.gml
# type: vector type: vector
# results: results:
# OUTPUT: OUTPUT:
# name: expected/extract_nodes_lines.gml name: expected/extract_nodes_lines.gml
# type: vector type: vector
- algorithm: qgis:simplifygeometries - algorithm: qgis:simplifygeometries
name: Simplify (lines) name: Simplify (lines)
@ -2171,21 +2184,25 @@ tests:
# name: expected/truncated.shp # name: expected/truncated.shp
# type: vector # type: vector
# in_place_result: true # in_place_result: true
#
# - algorithm: qgis:distancematrix - algorithm: qgis:distancematrix
# name: Distance matrix (only tests for TableWriter, does not check result) name: Distance matrix (only tests for run, does not check result as rows are in random order)
# params: params:
# INPUT_FIELD: fid INPUT_FIELD: fid
# INPUT_LAYER: INPUT:
# name: points.gml name: points.gml
# type: vector type: vector
# MATRIX_TYPE: '0' MATRIX_TYPE: '0'
# NEAREST_POINTS: 0 NEAREST_POINTS: 0
# TARGET_FIELD: fid TARGET_FIELD: fid
# TARGET_LAYER: TARGET:
# name: points.gml name: points.gml
# type: vector type: vector
# results: {} results:
OUTPUT:
name: expected/count_unique_points.gml
type: vector
compare: false
- algorithm: qgis:countpointsinpolygon - algorithm: qgis:countpointsinpolygon
name: standard count unique points in polygon name: standard count unique points in polygon
@ -2232,18 +2249,18 @@ tests:
# OUTPUT: # OUTPUT:
# name: expected/points_alog_lines.gml # name: expected/points_alog_lines.gml
# type: vector # type: vector
#
# - algorithm: qgis:meancoordinates - algorithm: qgis:meancoordinates
# name: standard mean coordinates name: standard mean coordinates
# params: params:
# POINTS: INPUT:
# name: custom/points.shp name: custom/points.shp
# type: vector type: vector
# results: results:
# OUTPUT: OUTPUT:
# name: expected/mean_coordinates.gml name: expected/mean_coordinates.gml
# type: vector type: vector
#
# # Temporarily disable until we figure out why it failed after merging # # Temporarily disable until we figure out why it failed after merging
# # into master # # into master
# #- algorithm: qgis:singlepartstomultipart # #- algorithm: qgis:singlepartstomultipart