Port Distance Matrix algorithm to new API

Enhancements:
- support source/target layers in different CRS
- output layers with geometry (i.e. keep input point geometry - avoids
need to rejoin result back to original table to get geometry)
- keep original data types for id fields
- don't fire off many single feature requests - instead request
multiple features at once to improve speed
This commit is contained in:
Nyall Dawson 2017-07-15 20:28:59 +10:00
parent 7f58af11ae
commit b7f888bf5b
5 changed files with 843 additions and 92 deletions

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

@ -69,6 +69,7 @@ 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
@ -93,7 +94,6 @@ from .VoronoiPolygons import VoronoiPolygons
from .ZonalStatistics import ZonalStatistics
# from .ExtractByLocation import ExtractByLocation
# from .PointDistance import PointDistance
# from .UniqueValues import UniqueValues
# from .ExportGeometryInfo import ExportGeometryInfo
# from .SinglePartsToMultiparts import SinglePartsToMultiparts
@ -184,7 +184,7 @@ class QGISAlgorithmProvider(QgsProcessingProvider):
def getAlgs(self):
# algs = [
# UniqueValues(), PointDistance(),
# UniqueValues(),
# ExportGeometryInfo(),
# SinglePartsToMultiparts(),
# ExtractNodes(),
@ -263,6 +263,7 @@ class QGISAlgorithmProvider(QgsProcessingProvider):
MeanCoords(),
Merge(),
NearestNeighbourAnalysis(),
PointDistance(),
PointsInPolygon(),
PointsLayerFromTable(),
PolygonsToLines(),

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

@ -2171,21 +2171,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