Skip to content

Commit

Permalink
Add tests
Browse files Browse the repository at this point in the history
  • Loading branch information
nyalldawson committed Nov 1, 2023
1 parent 77529cd commit 2d2b099
Show file tree
Hide file tree
Showing 7 changed files with 334 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8" ?>
<ogr:FeatureCollection
gml:id="aFeatureCollection"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://ogr.maptools.org/ coverage_dissolve.xsd"
xmlns:ogr="http://ogr.maptools.org/"
xmlns:gml="http://www.opengis.net/gml/3.2">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::4326"><gml:lowerCorner>-3 -1</gml:lowerCorner><gml:upperCorner>6 10</gml:upperCorner></gml:Envelope></gml:boundedBy>

<ogr:featureMember>
<ogr:coverage_dissolve gml:id="coverage_dissolve.0">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::4326"><gml:lowerCorner>-3 -1</gml:lowerCorner><gml:upperCorner>6 10</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:MultiSurface srsName="urn:ogc:def:crs:EPSG::4326" gml:id="coverage_dissolve.geom.0"><gml:surfaceMember><gml:Polygon gml:id="coverage_dissolve.geom.0.0"><gml:exterior><gml:LinearRing><gml:posList>3 -1 3 3 2 3 1 6 1 10 -3 10 -3 6 -1 2 -1 -1 3 -1</gml:posList></gml:LinearRing></gml:exterior><gml:interior><gml:LinearRing><gml:posList>-2 7 -2 9 0 9 0 7 -2 7</gml:posList></gml:LinearRing></gml:interior></gml:Polygon></gml:surfaceMember><gml:surfaceMember><gml:Polygon gml:id="coverage_dissolve.geom.0.1"><gml:exterior><gml:LinearRing><gml:posList>4 6 4 4 5 5 4 6</gml:posList></gml:LinearRing></gml:exterior></gml:Polygon></gml:surfaceMember><gml:surfaceMember><gml:Polygon gml:id="coverage_dissolve.geom.0.2"><gml:exterior><gml:LinearRing><gml:posList>6 2 6 3 5 3 5 2 6 2</gml:posList></gml:LinearRing></gml:exterior></gml:Polygon></gml:surfaceMember></gml:MultiSurface></ogr:geometryProperty>
<ogr:fid xsi:nil="true"/>
<ogr:name xsi:nil="true"/>
<ogr:intval xsi:nil="true"/>
<ogr:floatval xsi:nil="true"/>
</ogr:coverage_dissolve>
</ogr:featureMember>
</ogr:FeatureCollection>
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
targetNamespace="http://ogr.maptools.org/"
xmlns:ogr="http://ogr.maptools.org/"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:gml="http://www.opengis.net/gml/3.2"
xmlns:gmlsf="http://www.opengis.net/gmlsf/2.0"
elementFormDefault="qualified"
version="1.0">
<xs:annotation>
<xs:appinfo source="http://schemas.opengis.net/gmlsfProfile/2.0/gmlsfLevels.xsd">
<gmlsf:ComplianceLevel>0</gmlsf:ComplianceLevel>
</xs:appinfo>
</xs:annotation>
<xs:import namespace="http://www.opengis.net/gml/3.2" schemaLocation="http://schemas.opengis.net/gml/3.2.1/gml.xsd"/>
<xs:import namespace="http://www.opengis.net/gmlsf/2.0" schemaLocation="http://schemas.opengis.net/gmlsfProfile/2.0/gmlsfLevels.xsd"/>
<xs:element name="FeatureCollection" type="ogr:FeatureCollectionType" substitutionGroup="gml:AbstractFeature"/>
<xs:complexType name="FeatureCollectionType">
<xs:complexContent>
<xs:extension base="gml:AbstractFeatureType">
<xs:sequence minOccurs="0" maxOccurs="unbounded">
<xs:element name="featureMember">
<xs:complexType>
<xs:complexContent>
<xs:extension base="gml:AbstractFeatureMemberType">
<xs:sequence>
<xs:element ref="gml:AbstractFeature"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name="coverage_dissolve" type="ogr:coverage_dissolve_Type" substitutionGroup="gml:AbstractFeature"/>
<xs:complexType name="coverage_dissolve_Type">
<xs:complexContent>
<xs:extension base="gml:AbstractFeatureType">
<xs:sequence>
<xs:element name="geometryProperty" type="gml:MultiSurfacePropertyType" nillable="true" minOccurs="0" maxOccurs="1"/> <!-- restricted to MultiPolygon --><!-- srsName="urn:ogc:def:crs:EPSG::4326" -->
<xs:element name="fid" nillable="true" minOccurs="0" maxOccurs="1">
<xs:simpleType>
<xs:restriction base="xs:string">
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="name" nillable="true" minOccurs="0" maxOccurs="1">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="5"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="intval" nillable="true" minOccurs="0" maxOccurs="1">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:totalDigits value="10"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="floatval" nillable="true" minOccurs="0" maxOccurs="1">
<xs:simpleType>
<xs:restriction base="xs:decimal">
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
<?xml version="1.0" encoding="utf-8" ?>
<ogr:FeatureCollection
gml:id="aFeatureCollection"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://ogr.maptools.org/ simplify_coverage.xsd"
xmlns:ogr="http://ogr.maptools.org/"
xmlns:gml="http://www.opengis.net/gml/3.2">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::4326"><gml:lowerCorner>-3 -1</gml:lowerCorner><gml:upperCorner>6 10</gml:upperCorner></gml:Envelope></gml:boundedBy>

<ogr:featureMember>
<ogr:simplify_coverage gml:id="simplify_coverage.0">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::4326"><gml:lowerCorner>-1 -1</gml:lowerCorner><gml:upperCorner>3 3</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:Polygon srsName="urn:ogc:def:crs:EPSG::4326" gml:id="simplify_coverage.geom.0"><gml:exterior><gml:LinearRing><gml:posList>2 3 -1 2 3 -1 2 3</gml:posList></gml:LinearRing></gml:exterior></gml:Polygon></ogr:geometryProperty>
<ogr:fid>polys.0</ogr:fid>
<ogr:name>aaaaa</ogr:name>
<ogr:intval>33</ogr:intval>
<ogr:floatval>44.123456</ogr:floatval>
</ogr:simplify_coverage>
</ogr:featureMember>
<ogr:featureMember>
<ogr:simplify_coverage gml:id="simplify_coverage.1">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::4326"><gml:lowerCorner>4 4</gml:lowerCorner><gml:upperCorner>5 6</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:Polygon srsName="urn:ogc:def:crs:EPSG::4326" gml:id="simplify_coverage.geom.1"><gml:exterior><gml:LinearRing><gml:posList>5 5 4 6 4 4 5 5</gml:posList></gml:LinearRing></gml:exterior></gml:Polygon></ogr:geometryProperty>
<ogr:fid>polys.1</ogr:fid>
<ogr:name>Aaaaa</ogr:name>
<ogr:intval>-33</ogr:intval>
<ogr:floatval>0</ogr:floatval>
</ogr:simplify_coverage>
</ogr:featureMember>
<ogr:featureMember>
<ogr:simplify_coverage gml:id="simplify_coverage.2">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::4326"><gml:lowerCorner>5 2</gml:lowerCorner><gml:upperCorner>6 3</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:Polygon srsName="urn:ogc:def:crs:EPSG::4326" gml:id="simplify_coverage.geom.2"><gml:exterior><gml:LinearRing><gml:posList>6 2 6 3 5 3 6 2</gml:posList></gml:LinearRing></gml:exterior></gml:Polygon></ogr:geometryProperty>
<ogr:fid>polys.2</ogr:fid>
<ogr:name>bbaaa</ogr:name>
<ogr:intval xsi:nil="true"/>
<ogr:floatval>0.123</ogr:floatval>
</ogr:simplify_coverage>
</ogr:featureMember>
<ogr:featureMember>
<ogr:simplify_coverage gml:id="simplify_coverage.3">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::4326"><gml:lowerCorner>-3 6</gml:lowerCorner><gml:upperCorner>1 10</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:Polygon srsName="urn:ogc:def:crs:EPSG::4326" gml:id="simplify_coverage.geom.3"><gml:exterior><gml:LinearRing><gml:posList>1 6 1 10 -3 10 -3 6 1 6</gml:posList></gml:LinearRing></gml:exterior><gml:interior><gml:LinearRing><gml:posList>-2 7 -2 9 0 9 -2 7</gml:posList></gml:LinearRing></gml:interior></gml:Polygon></ogr:geometryProperty>
<ogr:fid>polys.3</ogr:fid>
<ogr:name>ASDF</ogr:name>
<ogr:intval>0</ogr:intval>
<ogr:floatval xsi:nil="true"/>
</ogr:simplify_coverage>
</ogr:featureMember>
<ogr:featureMember>
<ogr:simplify_coverage gml:id="simplify_coverage.4">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::4326"><gml:lowerCorner>-3 2</gml:lowerCorner><gml:upperCorner>2 6</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:Polygon srsName="urn:ogc:def:crs:EPSG::4326" gml:id="simplify_coverage.geom.4"><gml:exterior><gml:LinearRing><gml:posList>2 3 1 6 -3 6 -1 2 2 3</gml:posList></gml:LinearRing></gml:exterior></gml:Polygon></ogr:geometryProperty>
<ogr:fid>polys.5</ogr:fid>
<ogr:name>elim</ogr:name>
<ogr:intval>2</ogr:intval>
<ogr:floatval>3.33</ogr:floatval>
</ogr:simplify_coverage>
</ogr:featureMember>
<ogr:featureMember>
<ogr:simplify_coverage gml:id="simplify_coverage.5">
<ogr:fid>polys.4</ogr:fid>
<ogr:name xsi:nil="true"/>
<ogr:intval>120</ogr:intval>
<ogr:floatval>-100291.43213</ogr:floatval>
</ogr:simplify_coverage>
</ogr:featureMember>
</ogr:FeatureCollection>
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
targetNamespace="http://ogr.maptools.org/"
xmlns:ogr="http://ogr.maptools.org/"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:gml="http://www.opengis.net/gml/3.2"
xmlns:gmlsf="http://www.opengis.net/gmlsf/2.0"
elementFormDefault="qualified"
version="1.0">
<xs:annotation>
<xs:appinfo source="http://schemas.opengis.net/gmlsfProfile/2.0/gmlsfLevels.xsd">
<gmlsf:ComplianceLevel>0</gmlsf:ComplianceLevel>
</xs:appinfo>
</xs:annotation>
<xs:import namespace="http://www.opengis.net/gml/3.2" schemaLocation="http://schemas.opengis.net/gml/3.2.1/gml.xsd"/>
<xs:import namespace="http://www.opengis.net/gmlsf/2.0" schemaLocation="http://schemas.opengis.net/gmlsfProfile/2.0/gmlsfLevels.xsd"/>
<xs:element name="FeatureCollection" type="ogr:FeatureCollectionType" substitutionGroup="gml:AbstractFeature"/>
<xs:complexType name="FeatureCollectionType">
<xs:complexContent>
<xs:extension base="gml:AbstractFeatureType">
<xs:sequence minOccurs="0" maxOccurs="unbounded">
<xs:element name="featureMember">
<xs:complexType>
<xs:complexContent>
<xs:extension base="gml:AbstractFeatureMemberType">
<xs:sequence>
<xs:element ref="gml:AbstractFeature"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name="simplify_coverage" type="ogr:simplify_coverage_Type" substitutionGroup="gml:AbstractFeature"/>
<xs:complexType name="simplify_coverage_Type">
<xs:complexContent>
<xs:extension base="gml:AbstractFeatureType">
<xs:sequence>
<xs:element name="geometryProperty" type="gml:SurfacePropertyType" nillable="true" minOccurs="0" maxOccurs="1"/> <!-- restricted to Polygon --><!-- srsName="urn:ogc:def:crs:EPSG::4326" -->
<xs:element name="fid" nillable="true" minOccurs="0" maxOccurs="1">
<xs:simpleType>
<xs:restriction base="xs:string">
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="name" nillable="true" minOccurs="0" maxOccurs="1">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="5"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="intval" nillable="true" minOccurs="0" maxOccurs="1">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:totalDigits value="10"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="floatval" nillable="true" minOccurs="0" maxOccurs="1">
<xs:simpleType>
<xs:restriction base="xs:decimal">
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>
Original file line number Diff line number Diff line change
Expand Up @@ -200,3 +200,33 @@ tests:
OUTPUT_NONGROUND:
hash: cec23a44e0a5da2c9d0be68a13cdb1e851492061e64d81b564e5a269
type: rasterhash

- algorithm: native:coverageunion
name: Coverage union
condition:
geos:
at_least: 31200
params:
INPUT:
name: polys.gml|layername=polys2
type: vector
results:
OUTPUT:
name: expected/coverage_dissolve.gml
type: vector

- algorithm: native:coveragesimplify
name: Simplify coverage
condition:
geos:
at_least: 31200
params:
INPUT:
name: polys.gml|layername=polys2
type: vector
PRESERVE_BOUNDARY: false
TOLERANCE: 3.0
results:
OUTPUT:
name: expected/simplify_coverage.gml
type: vector
5 changes: 5 additions & 0 deletions src/core/geometry/qgsgeometry.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2648,6 +2648,11 @@ QgsGeometry QgsGeometry::unionCoverage() const
return QgsGeometry();
}

if ( QgsWkbTypes::flatType( d->geometry->wkbType() ) != Qgis::WkbType::GeometryCollection &&
QgsWkbTypes::flatType( d->geometry->wkbType() ) != Qgis::WkbType::MultiPolygon
&& QgsWkbTypes::flatType( d->geometry->wkbType() ) != Qgis::WkbType::Polygon )
return QgsGeometry();

QgsGeos geos( d->geometry.get() );
mLastError.clear();
const QgsGeometry result = QgsGeometry( geos.unionCoverage( &mLastError ) );
Expand Down
65 changes: 65 additions & 0 deletions tests/src/python/test_qgsgeometry.py
Original file line number Diff line number Diff line change
Expand Up @@ -7373,6 +7373,71 @@ def testSplitGeometry(self):
self.assertTrue(compareWkt(parts[1].asWkt(), 'MultiLineString ((1 1, 2 0))'))
self.assertTrue(compareWkt(parts[2].asWkt(), 'MultiLineString ((0 1, 1 0))'))

@unittest.skipIf(Qgis.geosVersionInt() < 31200, "GEOS 3.12 required")
def testCoverageValidate(self):
"""
Test QgsGeometry.validateCoverage
"""
g1 = QgsGeometry()
valid, edges = g1.validateCoverage(0)
self.assertEqual(valid, Qgis.CoverageValidityResult.Error)
self.assertFalse(edges)

g1 = QgsGeometry.fromWkt('Point(1 2)')
valid, edges = g1.validateCoverage(0)
self.assertEqual(valid, Qgis.CoverageValidityResult.Error)
self.assertFalse(edges)

g1 = QgsGeometry.fromWkt('MULTIPOLYGON(((0 0,10 0,10.1 5,10 10,0 10,0 0)), ((10 0,20 0,20 10,10 10,10.1 5,10 0)))')
valid, edges = g1.validateCoverage(0)
self.assertEqual(valid, Qgis.CoverageValidityResult.Valid)
self.assertFalse(edges)

g1 = QgsGeometry.fromWkt('MULTIPOLYGON(((0 0,10 0,10.1 5,10 10,0 10,0 0)), ((9 0,20 0,20 10,10 10,10.1 5,9 0)))')
valid, edges = g1.validateCoverage(0)
self.assertEqual(valid, Qgis.CoverageValidityResult.Invalid)
self.assertEqual(edges.asWkt(0), 'GeometryCollection (LineString (0 0, 10 0, 10 5),LineString (10 5, 9 0, 20 0))')

@unittest.skipIf(Qgis.geosVersionInt() < 31200, "GEOS 3.12 required")
def testCoverageDissolve(self):
"""
Test QgsGeometry.unionCoverage
"""
g1 = QgsGeometry()
res = g1.unionCoverage()
self.assertTrue(res.isNull())

g1 = QgsGeometry.fromWkt('Point(1 2)')
res = g1.unionCoverage()
self.assertTrue(res.isNull())

g1 = QgsGeometry.fromWkt('MULTIPOLYGON(((0 0,10 0,10.1 5,10 10,0 10,0 0)), ((10 0,20 0,20 10,10 10,10.1 5,10 0)))')
res = g1.unionCoverage()
self.assertEqual(res.asWkt(0), 'Polygon ((0 0, 0 10, 10 10, 20 10, 20 0, 10 0, 0 0))')

@unittest.skipIf(Qgis.geosVersionInt() < 31200, "GEOS 3.12 required")
def testCoverageSimplify(self):
"""
Test QgsGeometry.simplifyCoverageVW
"""
g1 = QgsGeometry()
res = g1.unionCoverage()
self.assertTrue(res.isNull())

g1 = QgsGeometry.fromWkt('Point(1 2)')
res = g1.simplifyCoverageVW(3, False)
self.assertTrue(res.isNull())

g1 = QgsGeometry.fromWkt('MULTIPOLYGON(((0 0,10 0,10.1 5,10 10,0 10,0 0)), ((10 0,20 0,20 10,10 10,10.1 5,10 0)))')
res = g1.simplifyCoverageVW(3, False)
self.assertEqual(res.asWkt(0), 'GeometryCollection (Polygon ((10 0, 10 10, 0 10, 0 0, 10 0)),Polygon ((10 0, 20 0, 20 10, 10 10, 10 0)))')

res = g1.simplifyCoverageVW(10, False)
self.assertEqual(res.asWkt(0), 'GeometryCollection (Polygon ((10 0, 10 10, 0 0, 10 0)),Polygon ((10 0, 20 10, 10 10, 10 0)))')

res = g1.simplifyCoverageVW(10, True)
self.assertEqual(res.asWkt(0), 'GeometryCollection (Polygon ((10 0, 10 10, 0 10, 0 0, 10 0)),Polygon ((10 0, 20 0, 20 10, 10 10, 10 0)))')


if __name__ == '__main__':
unittest.main()

0 comments on commit 2d2b099

Please sign in to comment.