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.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.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]
@ -56,12 +60,10 @@ class ExtractNodes(QgisAlgorithm):
super().__init__()
def initAlgorithm(self, config=None):
self.addParameter(ParameterVector(self.INPUT,
self.tr('Input layer'),
[dataobjects.TYPE_VECTOR_POLYGON,
dataobjects.TYPE_VECTOR_LINE]))
self.addParameter(QgsProcessingParameterFeatureSource(self.INPUT,
self.tr('Input layer')))
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):
return 'extractnodes'
@ -70,36 +72,51 @@ class ExtractNodes(QgisAlgorithm):
return self.tr('Extract nodes')
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('distance', 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)
total = 100.0 / layer.featureCount() if layer.featureCount() else 0
(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
fields, out_wkb, source.sourceCrs())
features = source.getFeatures()
total = 100.0 / source.featureCount() if source.featureCount() else 0
for current, f in enumerate(features):
if feedback.isCanceled():
break
input_geometry = f.geometry()
if not input_geometry:
writer.addFeature(f, QgsFeatureSink.FastInsert)
sink.addFeature(f, QgsFeatureSink.FastInsert)
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):
distance = input_geometry.distanceToVertex(i)
angle = math.degrees(input_geometry.angleAtVertex(i))
attrs = f.attributes()
attrs.append(i)
attrs.append(distance)
attrs.append(angle)
output_feature = QgsFeature()
output_feature.setAttributes(attrs)
output_feature.setGeometry(QgsGeometry.fromPoint(point))
writer.addFeature(output_feature, QgsFeatureSink.FastInsert)
for point in ring:
distance = input_geometry.distanceToVertex(i)
angle = math.degrees(input_geometry.angleAtVertex(i))
attrs = f.attributes()
attrs.append(i)
attrs.append(distance)
attrs.append(angle)
output_feature = QgsFeature()
output_feature.setAttributes(attrs)
output_feature.setGeometry(QgsGeometry(point.clone()))
sink.addFeature(output_feature, QgsFeatureSink.FastInsert)
i += 1
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.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.core.GeoAlgorithmExecutionException import GeoAlgorithmExecutionException
from processing.core.parameters import ParameterTableField
from processing.core.parameters import ParameterVector
from processing.core.outputs import OutputVector
from processing.tools import dataobjects, vector
from processing.tools import vector
pluginPath = os.path.split(os.path.split(os.path.dirname(__file__))[0])[0]
class MeanCoords(QgisAlgorithm):
POINTS = 'POINTS'
INPUT = 'INPUT'
WEIGHT = 'WEIGHT'
OUTPUT = 'OUTPUT'
UID = 'UID'
@ -61,19 +68,19 @@ class MeanCoords(QgisAlgorithm):
super().__init__()
def initAlgorithm(self, config=None):
self.addParameter(ParameterVector(self.POINTS,
self.tr('Input layer')))
self.addParameter(ParameterTableField(self.WEIGHT,
self.tr('Weight field'),
MeanCoords.POINTS,
ParameterTableField.DATA_TYPE_NUMBER,
optional=True))
self.addParameter(ParameterTableField(self.UID,
self.tr('Unique ID field'),
MeanCoords.POINTS,
optional=True))
self.addParameter(QgsProcessingParameterFeatureSource(self.INPUT,
self.tr('Input layer')))
self.addParameter(QgsProcessingParameterField(self.WEIGHT, self.tr('Weight field'),
parentLayerParameterName=MeanCoords.INPUT,
type=QgsProcessingParameterField.Numeric,
optional=True))
self.addParameter(QgsProcessingParameterField(self.UID,
self.tr('Unique ID field'),
parentLayerParameterName=MeanCoords.INPUT,
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):
return 'meancoordinates'
@ -82,46 +89,58 @@ class MeanCoords(QgisAlgorithm):
return self.tr('Mean coordinate(s)')
def processAlgorithm(self, parameters, context, feedback):
layer = QgsProcessingUtils.mapLayerFromString(self.getParameterValue(self.POINTS), context)
weightField = self.getParameterValue(self.WEIGHT)
uniqueField = self.getParameterValue(self.UID)
source = self.parameterAsSource(parameters, self.INPUT, context)
if weightField is None:
weightIndex = -1
weight_field = self.parameterAsString(parameters, self.WEIGHT, context)
unique_field = self.parameterAsString(parameters, self.UID, context)
attributes = []
if not weight_field:
weight_index = -1
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:
uniqueIndex = -1
if not unique_field:
unique_index = -1
else:
uniqueIndex = layer.fields().lookupField(uniqueField)
unique_index = source.fields().lookupField(unique_field)
if unique_index >= 0:
attributes.append(unique_index)
fieldList = QgsFields()
fieldList.append(QgsField('MEAN_X', QVariant.Double, '', 24, 15))
fieldList.append(QgsField('MEAN_Y', QVariant.Double, '', 24, 15))
fieldList.append(QgsField('UID', QVariant.String, '', 255))
field_list = QgsFields()
field_list.append(QgsField('MEAN_X', QVariant.Double, '', 24, 15))
field_list.append(QgsField('MEAN_Y', QVariant.Double, '', 24, 15))
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)
total = 100.0 / layer.featureCount() if layer.featureCount() else 0
features = source.getFeatures(QgsFeatureRequest().setSubsetOfAttributes(attributes))
total = 100.0 / source.featureCount() if source.featureCount() else 0
means = {}
for current, feat in enumerate(features):
if feedback.isCanceled():
break
feedback.setProgress(int(current * total))
if uniqueIndex == -1:
if unique_index == -1:
clazz = "Single class"
else:
clazz = str(feat.attributes()[uniqueIndex]).strip()
if weightIndex == -1:
clazz = str(feat.attributes()[unique_index]).strip()
if weight_index == -1:
weight = 1.00
else:
try:
weight = float(feat.attributes()[weightIndex])
weight = float(feat.attributes()[weight_index])
except:
weight = 1.00
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:
means[clazz] = (0, 0, 0)
@ -138,15 +157,21 @@ class MeanCoords(QgisAlgorithm):
current = 0
total = 100.0 / len(means) if means else 1
for (clazz, values) in list(means.items()):
if feedback.isCanceled():
break
outFeat = QgsFeature()
cx = values[0] / values[2]
cy = values[1] / values[2]
meanPoint = QgsPointXY(cx, cy)
outFeat.setGeometry(QgsGeometry.fromPoint(meanPoint))
outFeat.setAttributes([cx, cy, clazz])
writer.addFeature(outFeat, QgsFeatureSink.FastInsert)
attributes = [cx, cy]
if unique_index >= 0:
attributes.append(clazz)
outFeat.setAttributes(attributes)
sink.addFeature(outFeat, QgsFeatureSink.FastInsert)
current += 1
feedback.setProgress(int(current * total))
del writer
return {self.OUTPUT: dest_id}

View File

@ -32,29 +32,38 @@ import os
import math
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.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]
class PointDistance(QgisAlgorithm):
INPUT_LAYER = 'INPUT_LAYER'
INPUT = 'INPUT'
INPUT_FIELD = 'INPUT_FIELD'
TARGET_LAYER = 'TARGET_LAYER'
TARGET = 'TARGET'
TARGET_FIELD = 'TARGET_FIELD'
MATRIX_TYPE = 'MATRIX_TYPE'
NEAREST_POINTS = 'NEAREST_POINTS'
DISTANCE_MATRIX = 'DISTANCE_MATRIX'
OUTPUT = 'OUTPUT'
def icon(self):
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('Summary distance matrix (mean, std. dev., min, max)')]
self.addParameter(ParameterVector(self.INPUT_LAYER,
self.tr('Input point layer'), [dataobjects.TYPE_VECTOR_POINT]))
self.addParameter(ParameterTableField(self.INPUT_FIELD,
self.tr('Input unique ID field'), self.INPUT_LAYER,
ParameterTableField.DATA_TYPE_ANY))
self.addParameter(ParameterVector(self.TARGET_LAYER,
self.tr('Target point layer'), dataobjects.TYPE_VECTOR_POINT))
self.addParameter(ParameterTableField(self.TARGET_FIELD,
self.tr('Target unique ID field'), self.TARGET_LAYER,
ParameterTableField.DATA_TYPE_ANY))
self.addParameter(ParameterSelection(self.MATRIX_TYPE,
self.tr('Output matrix type'), self.mat_types, 0))
self.addParameter(ParameterNumber(self.NEAREST_POINTS,
self.tr('Use only the nearest (k) target points'), 0, 9999, 0))
self.addParameter(QgsProcessingParameterFeatureSource(self.INPUT,
self.tr('Input point layer'),
[QgsProcessing.TypeVectorPoint]))
self.addParameter(QgsProcessingParameterField(self.INPUT_FIELD,
self.tr('Input unique ID field'),
parentLayerParameterName=self.INPUT,
type=QgsProcessingParameterField.Any))
self.addParameter(QgsProcessingParameterFeatureSource(self.TARGET,
self.tr('Target point layer'),
[QgsProcessing.TypeVectorPoint]))
self.addParameter(QgsProcessingParameterField(self.TARGET_FIELD,
self.tr('Target unique ID field'),
parentLayerParameterName=self.TARGET,
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):
return 'distancematrix'
@ -94,65 +107,86 @@ class PointDistance(QgisAlgorithm):
return self.tr('Distance matrix')
def processAlgorithm(self, parameters, context, feedback):
inLayer = QgsProcessingUtils.mapLayerFromString(self.getParameterValue(self.INPUT_LAYER), context)
inField = self.getParameterValue(self.INPUT_FIELD)
targetLayer = QgsProcessingUtils.mapLayerFromString(self.getParameterValue(self.TARGET_LAYER), context)
targetField = self.getParameterValue(self.TARGET_FIELD)
matType = self.getParameterValue(self.MATRIX_TYPE)
nPoints = self.getParameterValue(self.NEAREST_POINTS)
outputFile = self.getOutputFromName(self.DISTANCE_MATRIX)
source = self.parameterAsSource(parameters, self.INPUT, context)
source_field = self.parameterAsString(parameters, self.INPUT_FIELD, context)
target_source = self.parameterAsSource(parameters, self.TARGET, context)
target_field = self.parameterAsString(parameters, self.TARGET_FIELD, context)
matType = self.parameterAsEnum(parameters, self.MATRIX_TYPE, context)
nPoints = self.parameterAsInt(parameters, self.NEAREST_POINTS, context)
if nPoints < 1:
nPoints = QgsProcessingUtils.featureCount(targetLayer, context)
self.writer = outputFile.getTableWriter([])
nPoints = target_source.featureCount()
if matType == 0:
# Linear distance matrix
self.linearMatrix(context, inLayer, inField, targetLayer, targetField,
matType, nPoints, feedback)
return self.linearMatrix(parameters, context, source, source_field, target_source, target_field,
matType, nPoints, feedback)
elif matType == 1:
# Standard distance matrix
self.regularMatrix(context, inLayer, inField, targetLayer, targetField,
nPoints, feedback)
return self.regularMatrix(parameters, context, source, source_field, target_source, target_field,
nPoints, feedback)
elif matType == 2:
# Summary distance matrix
self.linearMatrix(context, inLayer, inField, targetLayer, targetField,
matType, nPoints, feedback)
return self.linearMatrix(parameters, context, source, source_field, target_source, target_field,
matType, nPoints, feedback)
def linearMatrix(self, context, inLayer, inField, targetLayer, targetField,
def linearMatrix(self, parameters, context, source, inField, target_source, targetField,
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:
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:
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)
outIdx = targetLayer.fields().lookupField(targetField)
index = QgsSpatialIndex(target_source.getFeatures(QgsFeatureRequest().setSubsetOfAttributes([]).setDestinationCrs(source.sourceCrs())), feedback)
distArea = QgsDistanceArea()
distArea.setSourceCrs(inLayer.crs())
distArea.setSourceCrs(source.sourceCrs())
distArea.setEllipsoid(QgsProject.instance().ellipsoid())
features = QgsProcessingUtils.getFeatures(inLayer, context)
total = 100.0 / inLayer.featureCount() if inLayer.featureCount() else 0
features = source.getFeatures(QgsFeatureRequest().setSubsetOfAttributes([inIdx]))
total = 100.0 / source.featureCount() if source.featureCount() else 0
for current, inFeat in enumerate(features):
if feedback.isCanceled():
break
inGeom = inFeat.geometry()
inID = str(inFeat.attributes()[inIdx])
featList = index.nearestNeighbor(inGeom.asPoint(), nPoints)
distList = []
vari = 0.0
request = QgsFeatureRequest().setFilterFids(featList).setSubsetOfAttributes([outIdx])
for outFeat in targetLayer.getFeatures(request):
request = QgsFeatureRequest().setFilterFids(featList).setSubsetOfAttributes([outIdx]).setDestinationCrs(source.sourceCrs())
for outFeat in target_source.getFeatures(request):
if feedback.isCanceled():
break
outID = outFeat.attributes()[outIdx]
outGeom = outFeat.geometry()
dist = distArea.measureLine(inGeom.asPoint(),
outGeom.asPoint())
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:
distList.append(float(dist))
@ -161,44 +195,61 @@ class PointDistance(QgisAlgorithm):
for i in distList:
vari += (i - mean) * (i - mean)
vari = math.sqrt(vari / len(distList))
self.writer.addRecord([inID, str(mean),
str(vari), str(min(distList)),
str(max(distList))])
out_feature = QgsFeature()
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))
def regularMatrix(self, context, inLayer, inField, targetLayer, targetField,
nPoints, feedback):
index = QgsProcessingUtils.createSpatialIndex(targetLayer, context)
return {self.OUTPUT: dest_id}
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.setSourceCrs(inLayer.sourceCrs())
distArea.setSourceCrs(source.sourceCrs())
distArea.setEllipsoid(QgsProject.instance().ellipsoid())
first = True
features = QgsProcessingUtils.getFeatures(inLayer, context)
total = 100.0 / inLayer.featureCount() if inLayer.featureCount() else 0
sink = None
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):
if feedback.isCanceled():
break
inGeom = inFeat.geometry()
inID = str(inFeat.attributes()[inIdx])
featList = index.nearestNeighbor(inGeom.asPoint(), nPoints)
if first:
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)):
data.append('DIST_{0}'.format(i + 1))
self.writer.addRecord(data)
fields.append(QgsField('DIST_{0}'.format(i + 1), QVariant.Double))
(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
fields, source.wkbType(), source.sourceCrs())
data = [inID]
for i in featList:
request = QgsFeatureRequest().setFilterFid(i)
outFeat = next(targetLayer.getFeatures(request))
outGeom = outFeat.geometry()
for target in target_source.getFeatures(QgsFeatureRequest().setSubsetOfAttributes([]).setFilterFids(featList).setDestinationCrs(source.sourceCrs())):
if feedback.isCanceled():
break
outGeom = target.geometry()
dist = distArea.measureLine(inGeom.asPoint(),
outGeom.asPoint())
data.append(str(float(dist)))
self.writer.addRecord(data)
data.append(float(dist))
out_feature = QgsFeature()
out_feature.setGeometry(inGeom)
out_feature.setAttributes(data)
sink.addFeature(out_feature, QgsFeatureSink.FastInsert)
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 .DropGeometry import DropGeometry
from .ExtentFromLayer import ExtentFromLayer
from .ExtractNodes import ExtractNodes
from .FixGeometry import FixGeometry
from .GridPolygon import GridPolygon
from .Heatmap import Heatmap
@ -66,8 +67,10 @@ from .ImportIntoSpatialite import ImportIntoSpatialite
from .Intersection import Intersection
from .LinesIntersection import LinesIntersection
from .LinesToPolygons import LinesToPolygons
from .MeanCoords import MeanCoords
from .Merge import Merge
from .NearestNeighbourAnalysis import NearestNeighbourAnalysis
from .PointDistance import PointDistance
from .PointsInPolygon import PointsInPolygon
from .PointsLayerFromTable import PointsLayerFromTable
from .PolygonsToLines import PolygonsToLines
@ -87,17 +90,14 @@ from .SpatialiteExecuteSQL import SpatialiteExecuteSQL
from .SumLines import SumLines
from .SymmetricalDifference import SymmetricalDifference
from .Union import Union
from .UniqueValues import UniqueValues
from .VectorSplit import VectorSplit
from .VoronoiPolygons import VoronoiPolygons
from .ZonalStatistics import ZonalStatistics
# from .ExtractByLocation import ExtractByLocation
# from .MeanCoords import MeanCoords
# from .PointDistance import PointDistance
# from .UniqueValues import UniqueValues
# from .ExportGeometryInfo import ExportGeometryInfo
# from .SinglePartsToMultiparts import SinglePartsToMultiparts
# from .ExtractNodes import ExtractNodes
# from .ConvexHull import ConvexHull
# from .FixedDistanceBuffer import FixedDistanceBuffer
# from .VariableDistanceBuffer import VariableDistanceBuffer
@ -183,11 +183,10 @@ class QGISAlgorithmProvider(QgsProcessingProvider):
self.externalAlgs = []
def getAlgs(self):
# algs = [MeanCoords(),
# UniqueValues(), PointDistance(),
# algs = [
#
# ExportGeometryInfo(),
# SinglePartsToMultiparts(),
# ExtractNodes(),
# ConvexHull(), FixedDistanceBuffer(),
# VariableDistanceBuffer(),
# RandomSelection(), RandomSelectionWithinSubsets(),
@ -251,6 +250,7 @@ class QGISAlgorithmProvider(QgsProcessingProvider):
Difference(),
DropGeometry(),
ExtentFromLayer(),
ExtractNodes(),
FixGeometry(),
GridPolygon(),
Heatmap(),
@ -260,8 +260,10 @@ class QGISAlgorithmProvider(QgsProcessingProvider):
Intersection(),
LinesIntersection(),
LinesToPolygons(),
MeanCoords(),
Merge(),
NearestNeighbourAnalysis(),
PointDistance(),
PointsInPolygon(),
PointsLayerFromTable(),
PolygonsToLines(),
@ -281,6 +283,7 @@ class QGISAlgorithmProvider(QgsProcessingProvider):
SumLines(),
SymmetricalDifference(),
Union(),
UniqueValues(),
VectorSplit(),
VoronoiPolygons(),
ZonalStatistics()

View File

@ -31,25 +31,32 @@ import codecs
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.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]
class UniqueValues(QgisAlgorithm):
INPUT_LAYER = 'INPUT_LAYER'
INPUT = 'INPUT'
FIELD_NAME = 'FIELD_NAME'
TOTAL_VALUES = 'TOTAL_VALUES'
UNIQUE_VALUES = 'UNIQUE_VALUES'
OUTPUT = 'OUTPUT'
OUTPUT_HTML_FILE = 'OUTPUT_HTML_FILE'
def icon(self):
return QIcon(os.path.join(pluginPath, 'images', 'ftools', 'unique.png'))
@ -61,14 +68,18 @@ class UniqueValues(QgisAlgorithm):
super().__init__()
def initAlgorithm(self, config=None):
self.addParameter(ParameterVector(self.INPUT_LAYER,
self.tr('Input layer')))
self.addParameter(ParameterTableField(self.FIELD_NAME,
self.tr('Target field'),
self.INPUT_LAYER, ParameterTableField.DATA_TYPE_ANY))
self.addOutput(OutputHTML(self.OUTPUT, self.tr('Unique values')))
self.addOutput(OutputNumber(self.TOTAL_VALUES, self.tr('Total unique values')))
self.addOutput(OutputString(self.UNIQUE_VALUES, self.tr('Unique values')))
self.addParameter(QgsProcessingParameterFeatureSource(self.INPUT,
self.tr('Input layer')))
self.addParameter(QgsProcessingParameterField(self.FIELD_NAME,
self.tr('Target field'),
parentLayerParameterName=self.INPUT, type=QgsProcessingParameterField.Any))
self.addParameter(QgsProcessingParameterFeatureSink(self.OUTPUT, self.tr('Unique values'), optional=True, defaultValue=''))
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):
return 'listuniquevalues'
@ -77,14 +88,36 @@ class UniqueValues(QgisAlgorithm):
return self.tr('List unique values')
def processAlgorithm(self, parameters, context, feedback):
layer = QgsProcessingUtils.mapLayerFromString(self.getParameterValue(self.INPUT_LAYER), context)
fieldName = self.getParameterValue(self.FIELD_NAME)
outputFile = self.getOutputValue(self.OUTPUT)
values = QgsProcessingUtils.uniqueValues(layer, layer.fields().lookupField(fieldName), context)
self.createHTML(outputFile, values)
self.setOutputValue(self.TOTAL_VALUES, len(values))
self.setOutputValue(self.UNIQUE_VALUES, ';'.join([str(v) for v in
values]))
source = self.parameterAsSource(parameters, self.INPUT, context)
field_name = self.parameterAsString(parameters, self.FIELD_NAME, context)
values = source.uniqueValues(source.fields().lookupField(field_name))
fields = QgsFields()
field = source.fields()[source.fields().lookupField(field_name)]
field.setName('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):
with codecs.open(outputFile, 'w', encoding='utf-8') as f:

View File

@ -239,7 +239,7 @@ def createTest(text):
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())]
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>
<Type>Real</Type>
</PropertyDefn>
<PropertyDefn>
<Name>UID</Name>
<ElementPath>UID</ElementPath>
<Type>String</Type>
<Width>12</Width>
</PropertyDefn>
</GMLFeatureClass>
</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:MEAN_X>3.333333333333333</ogr:MEAN_X>
<ogr:MEAN_Y>0.111111111111111</ogr:MEAN_Y>
<ogr:UID>Single class</ogr:UID>
</ogr:mean_coordinates>
</gml:featureMember>
</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:
# 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
name: Add autoincremental field
params:
@ -876,50 +889,50 @@ tests:
# OUTPUT_LAYER:
# name: expected/single_sided_buffer_multiline_bevel.gml
# type: vector
#
# - algorithm: qgis:extractnodes
# name: Test (qgis:extractnodes)
# params:
# INPUT:
# name: multipolys.gml
# type: vector
# results:
# OUTPUT:
# name: expected/extract_nodes_multipolys.gml
# type: vector
#
# - algorithm: qgis:extractnodes
# name: Extract nodes from polygons
# params:
# INPUT:
# name: polys.gml
# type: vector
# results:
# OUTPUT:
# name: expected/extract_nodes_polys.gml
# type: vector
#
# - algorithm: qgis:extractnodes
# name: Extract nodes from multilines
# params:
# INPUT:
# name: multilines.gml
# type: vector
# results:
# OUTPUT:
# name: expected/extract_nodes_multilines.gml
# type: vector
#
# - algorithm: qgis:extractnodes
# name: Extract nodes from lines
# params:
# INPUT:
# name: lines.gml
# type: vector
# results:
# OUTPUT:
# name: expected/extract_nodes_lines.gml
# type: vector
- algorithm: qgis:extractnodes
name: Test (qgis:extractnodes)
params:
INPUT:
name: multipolys.gml
type: vector
results:
OUTPUT:
name: expected/extract_nodes_multipolys.gml
type: vector
- algorithm: qgis:extractnodes
name: Extract nodes from polygons
params:
INPUT:
name: polys.gml
type: vector
results:
OUTPUT:
name: expected/extract_nodes_polys.gml
type: vector
- algorithm: qgis:extractnodes
name: Extract nodes from multilines
params:
INPUT:
name: multilines.gml
type: vector
results:
OUTPUT:
name: expected/extract_nodes_multilines.gml
type: vector
- algorithm: qgis:extractnodes
name: Extract nodes from lines
params:
INPUT:
name: lines.gml
type: vector
results:
OUTPUT:
name: expected/extract_nodes_lines.gml
type: vector
- algorithm: qgis:simplifygeometries
name: Simplify (lines)
@ -2171,21 +2184,25 @@ tests:
# name: expected/truncated.shp
# type: vector
# in_place_result: true
#
# - algorithm: qgis:distancematrix
# name: Distance matrix (only tests for TableWriter, does not check result)
# params:
# INPUT_FIELD: fid
# INPUT_LAYER:
# name: points.gml
# type: vector
# MATRIX_TYPE: '0'
# NEAREST_POINTS: 0
# TARGET_FIELD: fid
# TARGET_LAYER:
# name: points.gml
# type: vector
# results: {}
- algorithm: qgis:distancematrix
name: Distance matrix (only tests for run, does not check result as rows are in random order)
params:
INPUT_FIELD: fid
INPUT:
name: points.gml
type: vector
MATRIX_TYPE: '0'
NEAREST_POINTS: 0
TARGET_FIELD: fid
TARGET:
name: points.gml
type: vector
results:
OUTPUT:
name: expected/count_unique_points.gml
type: vector
compare: false
- algorithm: qgis:countpointsinpolygon
name: standard count unique points in polygon
@ -2232,18 +2249,18 @@ tests:
# OUTPUT:
# name: expected/points_alog_lines.gml
# type: vector
#
# - algorithm: qgis:meancoordinates
# name: standard mean coordinates
# params:
# POINTS:
# name: custom/points.shp
# type: vector
# results:
# OUTPUT:
# name: expected/mean_coordinates.gml
# type: vector
#
- algorithm: qgis:meancoordinates
name: standard mean coordinates
params:
INPUT:
name: custom/points.shp
type: vector
results:
OUTPUT:
name: expected/mean_coordinates.gml
type: vector
# # Temporarily disable until we figure out why it failed after merging
# # into master
# #- algorithm: qgis:singlepartstomultipart