def test_ring_intersections(self): # no intersections g = QgsGeometry.fromWkt( "Polygon ((0 0, 10 0, 10 10, 0 10, 0 0),(1 1, 5 1, 1 9, 1 1), (6 9, 2 9, 6 1, 6 9))" ) validator = QgsGeometryValidator(g) spy = QSignalSpy(validator.errorFound) validator.run() self.assertEqual(len(spy), 0) # two interior rings intersecting g = QgsGeometry.fromWkt( "Polygon ((0 0, 10 0, 10 10, 0 10, 0 0),(1 1, 5 1, 1 9, 1 1), (2 2, 5 2, 2 9, 2 2))" ) validator = QgsGeometryValidator(g) spy = QSignalSpy(validator.errorFound) validator.run() self.assertEqual(len(spy), 2) self.assertEqual(spy[0][0].where(), QgsPointXY(4.5, 2)) self.assertEqual( spy[0][0].what(), 'segment 1 of ring 1 of polygon 0 intersects segment 0 of ring 2 of polygon 0 at 4.5, 2' ) self.assertEqual(spy[1][0].where(), QgsPointXY(2, 7)) self.assertEqual( spy[1][0].what(), 'segment 1 of ring 1 of polygon 0 intersects segment 2 of ring 2 of polygon 0 at 2, 7' )
def test_ring_closed(self): # valid ring g = QgsGeometry.fromWkt("Polygon ((0 0, 10 0, 10 10, 0 0))") validator = QgsGeometryValidator(g) spy = QSignalSpy(validator.errorFound) validator.run() self.assertEqual(len(spy), 0) # not closed g = QgsGeometry.fromWkt("Polygon ((0 0, 10 0, 10 10, 1 1))") validator = QgsGeometryValidator(g) spy = QSignalSpy(validator.errorFound) validator.run() self.assertEqual(len(spy), 1) self.assertEqual(spy[0][0].where(), QgsPointXY(0, 0)) self.assertEqual(spy[0][0].what(), 'ring 0 not closed') g = QgsGeometry.fromWkt( "Polygon ((0 0, 10 0, 10 10, 0 0),(1 1, 2 1, 2 2, 1.1 1))") validator = QgsGeometryValidator(g) spy = QSignalSpy(validator.errorFound) validator.run() self.assertEqual(len(spy), 1) self.assertEqual(spy[0][0].where(), QgsPointXY(1, 1)) self.assertEqual(spy[0][0].what(), 'ring 1 not closed') g = QgsGeometry.fromWkt( "Polygon ((0 0, 10 0, 10 10, 0 10, 0 0),(1 1, 2 1, 2 2, 1 1),(3 3, 3 4, 4 4, 3.1 3))" ) validator = QgsGeometryValidator(g) spy = QSignalSpy(validator.errorFound) validator.run() self.assertEqual(len(spy), 1) self.assertEqual(spy[0][0].where(), QgsPointXY(3, 3)) self.assertEqual(spy[0][0].what(), 'ring 2 not closed') # not closed but 2d closed g = QgsGeometry.fromWkt( "POLYGONZ((1 1 0, 1 2 1, 2 2 2, 2 1 3, 1 1 4))") validator = QgsGeometryValidator(g) spy = QSignalSpy(validator.errorFound) validator.run() self.assertEqual(len(spy), 1) self.assertEqual(spy[0][0].where(), QgsPointXY(1, 1)) self.assertEqual(spy[0][0].what(), 'ring 0 not closed, Z mismatch: 0 vs 4')
def test_multi_part_curve(self): # A circle inside another one g = QgsGeometry.fromWkt("MultiSurface (CurvePolygon (CircularString (0 5, 5 0, 0 -5, -5 0, 0 5)),CurvePolygon (CircularString (100 1, 100 0, 100 -1, 99 0, 100 1)))") validator = QgsGeometryValidator(g) spy = QSignalSpy(validator.errorFound) validator.run() self.assertEqual(len(spy), 0) # converted as a straight polygon g.convertToStraightSegment() validator = QgsGeometryValidator(g) spy = QSignalSpy(validator.errorFound) validator.run() self.assertEqual(len(spy), 0)
def test_linestring_duplicate_nodes(self): g = QgsGeometry.fromWkt("LineString (1 1, 1 1, 1 1, 1 2, 1 3, 1 3, 1 3, 1 4, 1 5, 1 6, 1 6)") validator = QgsGeometryValidator(g) spy = QSignalSpy(validator.errorFound) validator.run() self.assertEqual(len(spy), 3) self.assertEqual(spy[0][0].where(), QgsPointXY(1, 6)) self.assertEqual(spy[0][0].what(), 'line 1 contains 2 duplicate node(s) starting at vertex 10') self.assertEqual(spy[1][0].where(), QgsPointXY(1, 3)) self.assertEqual(spy[1][0].what(), 'line 1 contains 3 duplicate node(s) starting at vertex 5') self.assertEqual(spy[2][0].where(), QgsPointXY(1, 1)) self.assertEqual(spy[2][0].what(), 'line 1 contains 3 duplicate node(s) starting at vertex 1')
def test_multi_part_curve_nested_shell(self): # A circle inside another one g = QgsGeometry.fromWkt("MultiSurface (CurvePolygon (CircularString (0 5, 5 0, 0 -5, -5 0, 0 5)),CurvePolygon (CircularString (0 1, 1 0, 0 -1, -1 0, 0 1)))") validator = QgsGeometryValidator(g) spy = QSignalSpy(validator.errorFound) validator.run() self.assertEqual(len(spy), 1) self.assertEqual(spy[0][0].where(), QgsPointXY()) self.assertEqual(spy[0][0].what(), 'Polygon 1 lies inside polygon 0') # converted as a straight polygon g.convertToStraightSegment() validator = QgsGeometryValidator(g) spy = QSignalSpy(validator.errorFound) validator.run() self.assertEqual(len(spy), 1) self.assertEqual(spy[0][0].where(), QgsPointXY()) self.assertEqual(spy[0][0].what(), 'Polygon 1 lies inside polygon 0')
def test_line_vertices(self): # valid line g = QgsGeometry.fromWkt("LineString (0 0, 10 0)") validator = QgsGeometryValidator(g) spy = QSignalSpy(validator.errorFound) validator.run() self.assertEqual(len(spy), 0) # not enough vertices g = QgsGeometry.fromWkt("LineString (1 0)") validator = QgsGeometryValidator(g) spy = QSignalSpy(validator.errorFound) validator.run() self.assertEqual(len(spy), 1) self.assertEqual(spy[0][0].where(), QgsPointXY()) self.assertEqual(spy[0][0].what(), 'line 0 with less than two points') g = QgsGeometry.fromWkt("LineString ()") validator = QgsGeometryValidator(g) spy = QSignalSpy(validator.errorFound) validator.run() self.assertEqual(len(spy), 1) self.assertEqual(spy[0][0].where(), QgsPointXY()) self.assertEqual(spy[0][0].what(), 'line 0 with less than two points')
def test_ring_vertex_count(self): # valid ring g = QgsGeometry.fromWkt("Polygon ((0 0, 10 0, 10 10, 0 0))") validator = QgsGeometryValidator(g) spy = QSignalSpy(validator.errorFound) validator.run() self.assertEqual(len(spy), 0) # not enough vertices g = QgsGeometry.fromWkt("Polygon ((0 0, 10 0, 10 10))") validator = QgsGeometryValidator(g) spy = QSignalSpy(validator.errorFound) validator.run() self.assertEqual(len(spy), 1) self.assertEqual(spy[0][0].where(), QgsPointXY()) self.assertEqual(spy[0][0].what(), 'ring 0 with less than four points') g = QgsGeometry.fromWkt("Polygon ((0 0, 10 0, 0 0))") validator = QgsGeometryValidator(g) spy = QSignalSpy(validator.errorFound) validator.run() self.assertEqual(len(spy), 1) self.assertEqual(spy[0][0].where(), QgsPointXY()) self.assertEqual(spy[0][0].what(), 'ring 0 with less than four points') g = QgsGeometry.fromWkt("Polygon ((0 0, 10 0))") validator = QgsGeometryValidator(g) spy = QSignalSpy(validator.errorFound) validator.run() self.assertEqual(len(spy), 1) self.assertEqual(spy[0][0].where(), QgsPointXY()) self.assertEqual(spy[0][0].what(), 'ring 0 with less than four points') g = QgsGeometry.fromWkt("Polygon ((0 0))") validator = QgsGeometryValidator(g) spy = QSignalSpy(validator.errorFound) validator.run() self.assertEqual(len(spy), 1) self.assertEqual(spy[0][0].where(), QgsPointXY()) self.assertEqual(spy[0][0].what(), 'ring 0 with less than four points') g = QgsGeometry.fromWkt("Polygon (())") validator = QgsGeometryValidator(g) spy = QSignalSpy(validator.errorFound) validator.run() self.assertEqual(len(spy), 0) g = QgsGeometry.fromWkt("Polygon ((0 0, 10 0, 10 10, 0 0),(1 1, 2 1, 2 2))") validator = QgsGeometryValidator(g) spy = QSignalSpy(validator.errorFound) validator.run() self.assertEqual(len(spy), 1) self.assertEqual(spy[0][0].where(), QgsPointXY()) self.assertEqual(spy[0][0].what(), 'ring 1 with less than four points') g = QgsGeometry.fromWkt("Polygon ((0 0, 10 0, 10 10, 0 0),(1 1, 2 1, 2 2, 1 1))") validator = QgsGeometryValidator(g) spy = QSignalSpy(validator.errorFound) validator.run() self.assertEqual(len(spy), 0) g = QgsGeometry.fromWkt("Polygon ((0 0, 10 0, 10 10, 0 10, 0 0),(1 1, 2 1, 2 2, 1 1),(3 3, 3 4, 4 4))") validator = QgsGeometryValidator(g) spy = QSignalSpy(validator.errorFound) validator.run() self.assertEqual(len(spy), 1) self.assertEqual(spy[0][0].where(), QgsPointXY()) self.assertEqual(spy[0][0].what(), 'ring 2 with less than four points')