#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id$ # # Project: GDAL/OGR Test Suite # Purpose: Test basic OGR translation of WKT and WKB geometries. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2003, Frank Warmerdam # Copyright (c) 2009-2014, Even Rouault # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Library General Public License for more details. # # You should have received a copy of the GNU Library General Public # License along with this library; if not, write to the # Free Software Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. ############################################################################### import os import gdaltest import ogrtest import pytest from osgeo import gdal, ogr, osr ############################################################################### @pytest.mark.parametrize( "filename", [ f for f in os.listdir(os.path.join(os.path.dirname(__file__), "data/wkb_wkt")) if f[-4:] == ".wkt" ], ) def test_gml_geom(filename): raw_wkt = open("data/wkb_wkt/" + filename).read() ###################################################################### # Convert WKT to GML. geom_wkt = ogr.CreateGeometryFromWkt(raw_wkt) gml = geom_wkt.ExportToGML() assert gml is not None and gml, "Conversion to GML failed." ###################################################################### # Create geometry from GML. geom_gml = ogr.CreateGeometryFromGML(gml) if ogrtest.check_feature_geometry(geom_wkt, geom_gml, 0.0000000000001) == 1: clean_wkt = geom_wkt.ExportToWkt() gml_wkt = geom_gml.ExportToWkt() pytest.fail( "WKT from GML (%s) does not match clean WKT (%s).\ngml was (%s)" % (gml_wkt, clean_wkt, gml) ) ############################################################################### # Test geometries with extra spaces at the end, as sometimes are generated # by ESRI WFS software. def test_gml_space_test(): gml = '189999.99995605,624999.99998375 200000.00005735,624999.99998375 200000.00005735,612499.99997125 195791.3593843,612499.99997125 193327.3749823,612499.99997125 189999.99995605,612499.99997125 189999.99995605,619462.31247125 189999.99995605,624999.99998375 \n' geom = ogr.CreateGeometryFromGML(gml) assert ( geom is not None and geom.GetGeometryType() is ogr.wkbLineString and geom.GetPointCount() == 8 ), "GML not correctly parsed" ############################################################################### # Test GML 3.x "pos" element for a point. def test_gml_pos_point(): gml = '31 29 16' geom = ogr.CreateGeometryFromGML(gml) assert geom.ExportToWkt() == "POINT (31 29 16)", " not correctly parsed" ############################################################################### # Test GML 3.1.1 "pos" element for a polygon. (ticket #3244) def test_gml_pos_polygon(): gml = """ 0 0 4 0 4 4 0 4 0 0 1 1 2 1 2 2 1 2 1 1 """ geom = ogr.CreateGeometryFromGML(gml) assert ( geom.ExportToWkt() == "POLYGON ((0 0,4 0,4 4,0 4,0 0),(1 1,2 1,2 2,1 2,1 1))" ), " not correctly parsed" ############################################################################### # Test GML 3.x "posList" element for a linestring. def test_gml_posList_line(): gml = '31 42 53 64 55 76' geom = ogr.CreateGeometryFromGML(gml) assert ( geom.ExportToWkt() == "LINESTRING (31 42,53 64,55 76)" ), " not correctly parsed" ############################################################################### # Test GML 3.x "posList" element for a 3D linestring. def test_gml_posList_line3d(): gml = '31 42 1 53 64 2 55 76 3' geom = ogr.CreateGeometryFromGML(gml) assert ( geom.ExportToWkt() == "LINESTRING (31 42 1,53 64 2,55 76 3)" ), " not correctly parsed" ############################################################################### # Test GML 3.x "posList" element for a 3D linestring, but with srsDimension # set on LineString, not posList def test_gml_posList_line3d_2(): gml = '31 42 1 53 64 2 55 76 3' geom = ogr.CreateGeometryFromGML(gml) assert ( geom.ExportToWkt() == "LINESTRING (31 42 1,53 64 2,55 76 3)" ), " not correctly parsed" ############################################################################### # Test GML 3.x "polygon" element for a point. def test_gml_polygon(): gml = '0 0 4 0 4 4 0 4 0 01 1 2 1 2 2 1 2 1 1' geom = ogr.CreateGeometryFromGML(gml) assert ( geom.ExportToWkt() == "POLYGON ((0 0,4 0,4 4,0 4,0 0),(1 1,2 1,2 2,1 2,1 1))" ), " not correctly parsed" ############################################################################### # Private utility function to convert WKT to GML with assigned WGS 84 as SRS. def _CreateGMLWithSRSFromWkt(wkt, epsg): geom = ogr.CreateGeometryFromWkt(wkt) if geom is None: gdaltest.post_reason("Import geometry from WKT failed") return None # Assign SRS from given EPSG code srs = osr.SpatialReference() srs.ImportFromEPSG(epsg) if srs is None: gdaltest.post_reason("SRS import from EPSG failed") return None geom.AssignSpatialReference(srs) return geom.ExportToGML() ############################################################################### # Test of Point geometry with SRS assigned def test_gml_out_point_srs(): wkt = "POINT(21.675 53.763)" gml = _CreateGMLWithSRSFromWkt(wkt, 4326) assert gml is not None and gml, "Conversion to GML failed." assert ( gml[0:31] == '' ), "No srsName attribute in GML output" ############################################################################### # Test of Point 3D geometry with SRS assigned def test_gml_out_point3d_srs(): wkt = "POINT(21.675 53.763 100)" gml = _CreateGMLWithSRSFromWkt(wkt, 4326) assert gml is not None and gml, "Conversion to GML failed." assert ( gml[0:31] == '' ), "No srsName attribute in GML output" ############################################################################### # Test of LineString geometry with SRS assigned def test_gml_out_linestring_srs(): wkt = open("data/wkb_wkt/5.wkt").read() gml = _CreateGMLWithSRSFromWkt(wkt, 4326) assert gml is not None and gml, "Conversion to GML failed." assert ( gml[0:36] == '' ), "No srsName attribute in GML output" ############################################################################### # Test of Polygon geometry with SRS assigned def test_gml_out_polygon_srs(): wkt = open("data/wkb_wkt/6.wkt").read() gml = _CreateGMLWithSRSFromWkt(wkt, 4326) assert gml is not None and gml, "Conversion to GML failed." assert ( gml[0:33] == '' ), "No srsName attribute in GML output" ############################################################################### # Test of MultiPoint geometry with SRS assigned def test_gml_out_multipoint_srs(): wkt = open("data/wkb_wkt/11.wkt").read() gml = _CreateGMLWithSRSFromWkt(wkt, 4326) assert gml is not None and gml, "Conversion to GML failed." assert ( gml[0:36] == '' ), "No srsName attribute in GML output" ############################################################################### # Test of MultiLineString geometry with SRS assigned def test_gml_out_multilinestring_srs(): wkt = open("data/wkb_wkt/2.wkt").read() gml = _CreateGMLWithSRSFromWkt(wkt, 4326) assert gml is not None and gml, "Conversion to GML failed." assert ( gml[0:41] == '' ), "No srsName attribute in GML output" ############################################################################### # Test of MultiPolygon geometry with SRS assigned def test_gml_out_multipolygon_srs(): wkt = open("data/wkb_wkt/4.wkt").read() gml = _CreateGMLWithSRSFromWkt(wkt, 4326) assert gml is not None and gml, "Conversion to GML failed." assert ( gml[0:38] == '' ), "No srsName attribute in GML output" # Verify we have no other srsName's on subelements. assert ( gml[39:].find("srsName") == -1 ), "Got extra srsName attributes on subelements." ############################################################################### # Test of GeometryCollection with SRS assigned def test_gml_out_geometrycollection_srs(): wkt = open("data/wkb_wkt/3.wkt").read() gml = _CreateGMLWithSRSFromWkt(wkt, 4326) assert gml is not None and gml, "Conversion to GML failed." assert ( gml[0:39] == '' ), "No srsName attribute in GML output" ############################################################################### # Test GML Box def test_gml_Box(): gml = """ 1 2 3 4 """ geom = ogr.CreateGeometryFromGML(gml) assert ( geom.ExportToWkt() == "POLYGON ((1 2,3 2,3 4,1 4,1 2))" ), " not correctly parsed" ############################################################################### # Test gml:null def test_gml_null(): gml = """unknown""" gdal.ErrorReset() geom = ogr.CreateGeometryFromGML(gml) assert geom is None assert gdal.GetLastErrorMsg() == "" ############################################################################### # Test GML Envelope def test_gml_Envelope(): gml = """ 1 2 3 4 """ geom = ogr.CreateGeometryFromGML(gml) assert ( geom.ExportToWkt() == "POLYGON ((1 2,3 2,3 4,1 4,1 2))" ), " not correctly parsed" ############################################################################### # Test GML Curve def test_gml_Curve(): gml = """ 1 2 3 4 """ geom = ogr.CreateGeometryFromGML(gml) assert ( geom.ExportToWkt() == "LINESTRING (1 2,3 4)" ), " not correctly parsed" ############################################################################### # Test GML Curve with pointProperty elements def test_gml_Curve_with_pointProperty(): gml = """ 1 2 3 4 """ geom = ogr.CreateGeometryFromGML(gml) assert ( geom.ExportToWkt() == "LINESTRING (1 2,3 4)" ), " not correctly parsed" ############################################################################### # Test GML MultiCurve def test_gml_MultiCurve(): gml = """ 1 2 2 3 3 4 4 5 """ geom = ogr.CreateGeometryFromGML(gml) assert ( geom.ExportToWkt() == "MULTILINESTRING ((1 2,2 3),(3 4,4 5))" ), " not correctly parsed" ############################################################################### # Test GML MultiSurface with PolygonPatch def test_gml_MultiSurface(): gml = """ 1 2 3 4 5 6 1 2 2 3 4 5 6 7 2 3 3 4 5 6 7 8 3 4 4 5 6 7 6 7 8 9 8 9 4 5 """ geom = ogr.CreateGeometryFromGML(gml) assert ( geom.ExportToWkt() == "MULTIPOLYGON (((1 2,3 4,5 6,1 2),(2 3,4 5,6 7,2 3),(3 4,5 6,7 8,3 4)),((4 5,6 7,8 9,4 5)))" ), " not correctly parsed" ############################################################################### # Test GML MultiSurface with surfaceMembers def test_gml_MultiSurface_surfaceMembers(): gml = """ 1 2 3 4 5 6 1 2 2 3 4 5 6 7 2 3 3 4 5 6 7 8 3 4 30 40 50 60 70 80 30 40 """ geom = ogr.CreateGeometryFromGML(gml) assert ( geom.ExportToWkt() == "MULTIPOLYGON (((1 2,3 4,5 6,1 2),(2 3,4 5,6 7,2 3)),((3 4,5 6,7 8,3 4)),((30 40,50 60,70 80,30 40)))" ), " not correctly parsed" ############################################################################### # Test GML MultiCurve with curveMembers def test_gml_MultiCurve_curveMembers(): gml = """ 0 0 1 1 """ geom = ogr.CreateGeometryFromGML(gml) assert ( geom.ExportToWkt() == "MULTILINESTRING ((0 0,1 1))" ), " not correctly parsed" ############################################################################### # Test GML MultiGeometry with geometryMembers def test_gml_MultiGeometry_geometryMembers(): gml = """ 0 0 1 1 """ geom = ogr.CreateGeometryFromGML(gml) assert ( geom.ExportToWkt() == "GEOMETRYCOLLECTION (LINESTRING (0 0,1 1))" ), " not correctly parsed" ############################################################################### # Test GML CompositeCurve with curveMembers def test_gml_CompositeCurve_curveMembers(): gml = """ 0 0 1 1 1 1 2 2 """ geom = ogr.CreateGeometryFromGML(gml) assert ( geom.ExportToWkt() == "LINESTRING (0 0,1 1,2 2)" ), " not correctly parsed" ############################################################################### # Test GML MultiPoint with pointMembers def test_gml_MultiCurve_pointMembers(): gml = """ 0 0 1 1 """ geom = ogr.CreateGeometryFromGML(gml) assert ( geom.ExportToWkt() == "MULTIPOINT (0 0,1 1)" ), " not correctly parsed" ############################################################################### # Test GML Solid def test_gml_Solid(): gml = """ 1 2 0 3 4 0 5 6 0 1 2 0 """ geom = ogr.CreateGeometryFromGML(gml) assert ( geom.ExportToWkt() == "POLYHEDRALSURFACE Z (((1 2 0,3 4 0,5 6 0,1 2 0)))" ), " not correctly parsed" ############################################################################### # Test GML OrientableSurface def test_gml_OrientableSurface(): gml = """ -213.475 24.989 0 -213.475 24.989 8.0 -215.704 25.077 8.0 -215.704 25.077 0 -213.475 24.989 0 """ geom = ogr.CreateGeometryFromGML(gml) assert ( geom.ExportToWkt() == "POLYGON ((-213.475 24.989 0,-213.475 24.989 8,-215.704 25.077 8,-215.704 25.077 0,-213.475 24.989 0))" ), " not correctly parsed" ############################################################################### # Test GML Triangle def test_gml_Triangle(): gml = """ 0 0 0 1 1 1 0 0 """ geom = ogr.CreateGeometryFromGML(gml) assert ( geom.ExportToWkt() == "TRIANGLE ((0 0,0 1,1 1,0 0))" ), " not correctly parsed" # check the conversion of Triangle from OGR -> GML wkt_original = "TRIANGLE ((0 0,0 1,0 1,0 0))" triangle = ogr.CreateGeometryFromWkt(wkt_original) opts = ["FORMAT=GML3"] gml_string = triangle.ExportToGML(opts) if ( gml_string != "0 0 0 1 0 1 0 0" ): print(geom.ExportToWkt()) pytest.fail("incorrect conversion from OGR -> GML for OGRTriangle") ############################################################################### # Test GML Rectangle def test_gml_Rectangle(): gml = """ 0 0 0 1 1 1 1 0 0 0 """ geom = ogr.CreateGeometryFromGML(gml) assert ( geom.ExportToWkt() == "POLYGON ((0 0,0 1,1 1,1 0,0 0))" ), " not correctly parsed" ############################################################################### # Test GML PolyhedralSurface def test_gml_PolyhedralSurface(): # Conversion from GML -> OGR # 2 patches and 2 rings gml = """ 1 2 3 4 5 6 7 8 9 1 2 3 10 11 12 13 14 15 16 17 18 10 11 12 19 20 21 22 23 24 25 26 27 19 20 21 """ geom = ogr.CreateGeometryFromGML(gml) # NOTE - this is actually an invalid PolyhedralSurface # need to assert geom.IsValid() == True to determine the validity of the geometry assert ( geom.ExportToWkt() == "POLYHEDRALSURFACE Z (((1 2 3,4 5 6,7 8 9,1 2 3)),((10 11 12,13 14 15,16 17 18,10 11 12),(19 20 21,22 23 24,25 26 27,19 20 21)))" ), " not correctly parsed" # 1 patch and 2 rings gml = """ 1 2 3 4 5 6 7 8 9 1 2 3 10 11 12 13 14 15 16 17 18 10 11 12 """ geom = ogr.CreateGeometryFromGML(gml) # NOTE - this is actually an invalid PolyhedralSurface # need to assert geom.IsValid() == True to determine the validity of the geometry assert ( geom.ExportToWkt() == "POLYHEDRALSURFACE Z (((1 2 3,4 5 6,7 8 9,1 2 3)),((10 11 12,13 14 15,16 17 18,10 11 12)))" ), " not correctly parsed" # Variations of empty PolyhedralSurface gml_strings = [ "", "", """ """, ] for string in gml_strings: geom = ogr.CreateGeometryFromGML(string) assert ( geom.ExportToWkt() == "POLYHEDRALSURFACE EMPTY" ), "Empty not correctly parsed" # Conversion from OGR -> GML wkt_original = "POLYHEDRALSURFACE Z (((0 0 0,0 0 1,0 1 1,0 1 0,0 0 0)),\ ((0 0 0,0 1 0,1 1 0,1 0 0,0 0 0)),\ ((0 0 0,1 0 0,1 0 1,0 0 1,0 0 0)),\ ((1 1 0,1 1 1,1 0 1,1 0 0,1 1 0)),\ ((0 1 0,0 1 1,1 1 1,1 1 0,0 1 0)),\ ((0 0 1,1 0 1,1 1 1,0 1 1,0 0 1)))" ps = ogr.CreateGeometryFromWkt(wkt_original) opts = ["FORMAT=GML3"] string = ps.ExportToGML(opts) if ( string != '0 0 0 0 0 1 0 1 1 0 1 0 0 0 00 0 0 0 1 0 1 1 0 1 0 0 0 0 00 0 0 1 0 0 1 0 1 0 0 1 0 0 01 1 0 1 1 1 1 0 1 1 0 0 1 1 00 1 0 0 1 1 1 1 1 1 1 0 0 1 00 0 1 1 0 1 1 1 1 0 1 1 0 0 1' ): print(geom.ExportToWkt()) pytest.fail("incorrect parsing of OGR -> GML for PolyhedralSurface") g2 = ogr.CreateGeometryFromGML(string) if g2.Equals(ps) != 1: print(geom.ExportToWkt()) pytest.fail("incorrect round-tripping") # empty geometry wkt_original = "POLYHEDRALSURFACE EMPTY" ps = ogr.CreateGeometryFromWkt(wkt_original) opts = ["FORMAT=GML3"] string = ps.ExportToGML(opts) if ( string != "" ): print(geom.ExportToWkt()) pytest.fail("incorrect parsing of OGR -> GML for empty PolyhedralSurface") # several polygon patches (and test that non elements such as comments are parsed OK) gml = """ 1 2 3 4 5 6 7 8 9 1 2 3 1 2 3 4 5 6 7 8 9 1 2 3 """ geom = ogr.CreateGeometryFromGML(gml) assert ( geom.ExportToWkt() == "GEOMETRYCOLLECTION (POLYHEDRALSURFACE (((1 2 3,4 5 6,7 8 9,1 2 3))),POLYHEDRALSURFACE (((1 2 3,4 5 6,7 8 9,1 2 3))))" ), " not correctly parsed" # Test PolyhedralSurface with curve section (which we linearize since the SF PolyhedralSurface doesn't support curves) gml = """ 0 -1 0 1 0 1 1 0 0 -1 """ geom = ogr.CreateGeometryFromGML(gml) assert ( geom.ExportToWkt().find("POLYHEDRALSURFACE (((0 -1,0 1,") >= 0 ), " not correctly parsed" ############################################################################### # Test GML Tin def test_gml_Tin(): gml = """ 0 0 1 0 1 1 1 1 1 1 0 1 0 0 1 """ geom = ogr.CreateGeometryFromGML(gml) # NOTE - this is actually an invalid TIN surface, as the triangle is incorrect # need to assert geom.IsValid() == True to determine the validity of the geometry assert ( geom.ExportToWkt() == "TIN Z (((0 0 1,0 1 1,1 1 1,1 0 1,0 0 1)))" ), " not correctly parsed" # Test for gml:TriangulatedSurface gml = """ 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 """ geom = ogr.CreateGeometryFromGML(gml) assert ( geom.ExportToWkt() == "TIN Z (((0 0 0,0 0 1,0 1 0,0 0 0)),((0 0 0,0 1 0,1 1 0,0 0 0)))" ), " not correctly parsed" # substituting gml:trianglePatches for gml:patches gml = """ 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 """ geom = ogr.CreateGeometryFromGML(gml) assert ( geom.ExportToWkt() == "TIN Z (((0 0 0,0 0 1,0 1 0,0 0 0)),((0 0 0,0 1 0,1 1 0,0 0 0)))" ), " not correctly parsed" # Part 2 - Create GML File from OGR Geometries wkt_original = "TIN Z (((0 0 0,0 0 1,0 1 0,0 0 0)),((0 0 0,0 1 0,1 1 0,0 0 0)))" tin = ogr.CreateGeometryFromWkt(wkt_original) opts = ["FORMAT=GML3"] gml_string = tin.ExportToGML(opts) if ( gml_string != '0 0 0 0 0 1 0 1 0 0 0 00 0 0 0 1 0 1 1 0 0 0 0' ): print(geom.ExportToWkt()) pytest.fail("OGRGeometry::TriangulatedSurface incorrectly converted") ############################################################################### # Test concatenated sections (#4451) def test_gml_ConcatenatedDeduplication(): gml = """ 0 -1 0 1 0 1 1 0 0 -1 """ geom = ogr.CreateGeometryFromGML(gml) expected_wkt = ( "CURVEPOLYGON (COMPOUNDCURVE ((0 -1,0 1),CIRCULARSTRING (0 1,1 0,0 -1)))" ) assert ( ogrtest.check_feature_geometry(geom, ogr.CreateGeometryFromWkt(expected_wkt)) == 0 ) assert not ogrtest.have_geos() or geom.IsValid(), "geometry not valid" ############################################################################### # Test OGRFormatDouble() to check for rounding errors (would also apply for KML output, or ogrinfo output) def gml_out_precision(): geom = ogr.CreateGeometryFromWkt("POINT(93538.15 1.23456789)") expected_gml = ( "93538.15,1.23456789" ) got_gml = geom.ExportToGML() assert got_gml == expected_gml, "did not get expected gml" geom = ogr.CreateGeometryFromWkt("POINT(93538.55 1234567.89)") expected_gml = ( "93538.55,1234567.89" ) got_gml = geom.ExportToGML() assert got_gml == expected_gml, "did not get expected gml" ############################################################################### # Test various error cases of gml2ogrgeometry.cpp @gdaltest.disable_exceptions() def test_gml_invalid_geoms(): gml_expected_wkt_list = [ ('', None), ("", None), ("", None), ( "31 29 1631 29 16", None, ), ( "", "POINT EMPTY", ), # This is valid GML actually ("0", None), ( "0 1", "POINT (0 1)", ), # Support for uncommon formatting of coordinates ( "0 1 2", "POINT (0 1 2)", ), # Support for uncommon formatting of coordinates ("0,1 2,3", None), ("0", None), ( "", "POINT EMPTY", ), # This is valid GML actually ("", None), ("", None), ("", None), ("", None), ( "", "LINESTRING EMPTY", ), # This is valid GML actually ("0", None), ( '0 1 2 3', None, ), ( '0 1 2 3', None, ), ("", None), ("", None), ("0", None), ( "", "POLYGON EMPTY", ), # valid GML3, but invalid GML2. Be tolerant ( "", "POLYGON EMPTY", ), # valid GML2 ( "", None, ), ( "31 29 16", None, ), ( "0 1 2 3 4 5 0 1", None, ), ( "", None, ), ( "0 1 2 3 4 5 0 131 29 16", None, ), ( "", None, ), ( "0 0 4 0 4 4 0 4 0 0", None, ), ("", None), ("", None), ("", None), ("", None), ( "31 29 16", None, ), ("", None), ("31 29 16", None), ( "", "MULTIPOLYGON EMPTY", ), # valid GML3, but invalid GML2. Be tolerant ( "", "MULTIPOLYGON EMPTY", ), # illegal GML, but we are tolerant ( "", "MULTIPOLYGON EMPTY", ), # valid in GML3 (accepted by PostGIS too) ( "", None, ), ( "31 29 16", None, ), ( "", "MULTIPOLYGON EMPTY", ), # valid GML ( "", "MULTIPOLYGON EMPTY", ), # illegal GML, but we are tolerant ( "", "MULTIPOLYGON EMPTY", ), # valid GML3 ("", "MULTIPOINT EMPTY"), ("", "MULTIPOINT EMPTY"), ( "", "MULTIPOINT EMPTY", ), # valid in GML3 (accepted by PostGIS too) ( "0 1 2 3", None, ), ( "", "MULTIPOINT EMPTY", ), ( "", "MULTIPOINT EMPTY", ), ( "", None, ), ("", "MULTILINESTRING EMPTY"), ("", "MULTILINESTRING EMPTY"), ("", None), ( "31 29 16", None, ), ("", "MULTILINESTRING EMPTY"), ("", "MULTILINESTRING EMPTY"), ( "", "MULTILINESTRING EMPTY", ), # valid in GML3 (accepted by PostGIS too) ( "", None, ), ( "", None, ), ( "", None, ), ( "31 29 16", None, ), ( "", "MULTILINESTRING EMPTY", ), ( "", None, ), ( "", None, ), ("", None), ("", None), ("", None), ("", None), ( "31 29 16", None, ), ("", None), ("0 0 0 1", None), ("0 0 0 1 1 0 2 0", None), ("", None), ("0 0 0 1", None), ( "0 0 0 1 1 0 2 0", None, ), ("", None), ("0 0 0 1", None), ("", None), ("", None), ("", None), ( "", None, ), ( "31 29 16", None, ), ("", "GEOMETRYCOLLECTION EMPTY"), ("", "GEOMETRYCOLLECTION EMPTY"), ( "", "GEOMETRYCOLLECTION EMPTY", ), # valid in GML3 (accepted by PostGIS too) ( "", None, ), ( "", None, ), ("", "POLYGON EMPTY"), # valid GML3 ( "", "POLYGON EMPTY", ), # invalid GML3, but we are tolerant ("", "POLYGON EMPTY"), # valid GML3 ("", None), ( "", "POLYGON EMPTY", ), # valid GML3 ("", "POLYHEDRALSURFACE EMPTY"), # valid GML3 ( "", "POLYHEDRALSURFACE EMPTY", ), # invalid GML3, but we are tolerant ( "", "POLYHEDRALSURFACE EMPTY", ), # valid GML3 ("", None), ( '0 0 4 0 4 4 0 4 0 0', "POLYGON ((0 0,4 0,4 4,0 4,0 0))", ), ("", None), ("", None), ("", None), ( "", None, ), ("", None), # invalid ( "", None, ), # invalid GML3, but we are tolerant ( "", "POLYGON EMPTY", ), # validates the schema ("", None), # invalid ( "", None, ), # invalid GML3, but we are tolerant ( "", "MULTIPOINT EMPTY", ), # validates the schema ("", None), ("", None), ( "13 4", None, ), ( '1bla2', None, ), ('1bla2', None), ( '1bla2', None, ), ( '1,2', None, ), ('1,2', None), ('1,2', None), ( '1,2', None, ), ( '1,2', None, ), ( '1,2', None, ), ( """ 0 0 1 0 0 0 -10 0 -1 0 0 0 """, "COMPOUNDCURVE (CIRCULARSTRING (0 0,1 0,0 0),(0 0,-1 0,-10 0))", ), # non contiguous segments ( """ 0 0 1 0 0 0 -10 0 1 0 0 0 0 0 -1 0 0 0 """, None, ), # non contiguous segments ( "2-1", None, ), ( "2 02-1", None, ), ( "2 0 -2 0-1", None, ), ( "2 0 -2 0-1", None, ), ("", None), ( "290270", None, ), ( "1 290270", None, ), ( "1 22270", None, ), ( "1 2290", None, ), ( "2", None, ), ( "1 2", None, ), ("", None), ( "", None, ), ( "", None, ), ( "", None, ), ] for (gml, expected_wkt) in gml_expected_wkt_list: with gdaltest.error_handler(): # print gml geom = ogr.CreateGeometryFromGML(gml) if geom is None: assert ( expected_wkt is None ), "did not get expected result for %s. Got None instead of %s" % ( gml, expected_wkt, ) else: wkt = geom.ExportToWkt() if expected_wkt is None: pytest.fail( "did not get expected result for %s. Got %s instead of None" % (gml, wkt) ) else: assert ( wkt == expected_wkt ), "did not get expected result for %s. Got %s instead of %s" % ( gml, wkt, expected_wkt, ) ############################################################################### # Test write support for GML3 def test_gml_write_gml3_geometries(): gml_list = [ "2 3", "2 3 4", "2 3 4 5", "2 3 4 5", '2 3 10 4 5 20', '2 3 10 4 5 20', "0 0 0 1 1 1 1 0 0 0", "0 0 0 1 1 1 1 0 0 010 10 10 11 11 11 10 10", "2 34 5", "0 1 2 3 4 56 7 8 9 10 11", "0 1 2 3 4 56 7 8 9 10 11", "0 1 2 3 4 5 0 16 7 8 9 10 11 6 7", "0 12 3 4 5", ] for gml_in in gml_list: geom = ogr.CreateGeometryFromGML(gml_in) if gml_in.find("0 0 1 0 1 1 0 1""" geom = ogr.CreateGeometryFromGML(gml) assert ( geom.ExportToWkt() == "POLYGON ((0 0,1 0,1 1,0 1,0 0))" ), " not correctly parsed" ############################################################################### # Test GML 3.3 SimpleRectangle def test_gml_SimpleRectangle(): gml = """0 0 1 0 1 1 0 1""" geom = ogr.CreateGeometryFromGML(gml) assert ( geom.ExportToWkt() == "POLYGON ((0 0,1 0,1 1,0 1,0 0))" ), " not correctly parsed" ############################################################################### # Test GML 3.3 SimpleTriangle def test_gml_SimpleTriangle(): gml = """0 0 1 0 1 1""" geom = ogr.CreateGeometryFromGML(gml) assert ( geom.ExportToWkt() == "TRIANGLE ((0 0,1 0,1 1,0 0))" ), " not correctly parsed" ############################################################################### # Test GML 3.3 SimpleMultiPoint def test_gml_SimpleMultiPoint(): gml = """0 1 2 3""" geom = ogr.CreateGeometryFromGML(gml) assert ( geom.ExportToWkt() == "MULTIPOINT (0 1,2 3)" ), " not correctly parsed" ############################################################################### # Test gml:CompositeCurve> in def test_gml_CompositeCurveInRing(): gml = """ 0 0 0 1 0 1 1 1 1 1 0 0 """ geom = ogr.CreateGeometryFromGML(gml) assert geom.ExportToWkt() == "POLYGON ((0 0,0 1,1 1,0 0))" ############################################################################### # Test in (#5369) def test_gml_CompositeSurface_in_surfaceMembers(): gml = """ 0 0 0 1 1 1 1 0 0 0 2 0 2 1 3 1 3 0 2 0 """ geom = ogr.CreateGeometryFromGML(gml) assert ( geom.ExportToWkt() == "MULTIPOLYGON (((0 0,0 1,1 1,1 0,0 0)),((2 0,2 1,3 1,3 0,2 0)))" ) ############################################################################### # Test with only Interior ring (#5421) def test_gml_MultiSurfaceOfSurfaceOfPolygonPatchWithInteriorRing(): gml = """ 0 0 0 1 1 1 1 0 0 0 0.25 0.25 0.25 0.75 0.75 0.75 0.75 0.25 0.25 0.25 0 0 0 -1 -1 -1 -1 0 0 0 """ geom = ogr.CreateGeometryFromGML(gml) assert ( geom.ExportToWkt() == "MULTIPOLYGON (((0 0,0 1,1 1,1 0,0 0),(0.25 0.25,0.25 0.75,0.75 0.75,0.75 0.25,0.25 0.25)),((0 0,0 -1,-1 -1,-1 0,0 0)))" ) ############################################################################### # Test ts, cs and decimal attributes of gml:coordinates def test_gml_Coordinates_ts_cs_decimal(): gml_expected_wkt_list = [ ( "1,2", "POINT (1 2)", ), # default values ( '1,2', "POINT (1 2)", ), # default values ( '1,2,3', "POINT (1 2 3)", ), # default values ( ' 1,2 ', "POINT (1 2)", ), # we accept that... ( "1 2", "POINT (1 2)", ), # this is completely out of specification ! but we accept that too ! ( '1;2', "POINT (1 2)", ), ( '1,2;3,4', "POINT (1.2 3.4)", ), ( '1,2;3,4;5,6', "POINT (1.2 3.4 5.6)", ), ( "1,2 3,4", "LINESTRING (1 2,3 4)", ), # default values ( '1,2 3,4', "LINESTRING (1 2,3 4)", ), # default values ( '1,2,2.5 3,4', "LINESTRING (1 2 2.5,3 4 0)", ), # default values ( '1,2-3,4', "LINESTRING (1 2,3 4)", ), ( '1 2,3 4', "LINESTRING (1 2,3 4)", ), ( '1 2 2.5,3 4', "LINESTRING (1 2 2.5,3 4 0)", ), ] for (gml, expected_wkt) in gml_expected_wkt_list: geom = ogr.CreateGeometryFromGML(gml) wkt = geom.ExportToWkt() if expected_wkt is None: pytest.fail( "did not get expected result for %s. Got %s instead of None" % (gml, wkt) ) else: assert ( wkt == expected_wkt ), "did not get expected result for %s. Got %s instead of %s" % ( gml, wkt, expected_wkt, ) ############################################################################### # Test gml with XML header and comments def test_gml_with_xml_header_and_comments(): gml_expected_wkt_list = [ ( ' 1,2', "POINT (1 2)", ), ( """ 0 0 0 1 1 1 1 0 0 0 0.25 0.25 0.25 0.75 0.75 0.75 0.75 0.25 0.25 0.25 """, "MULTIPOLYGON (((0 0,0 1,1 1,1 0,0 0),(0.25 0.25,0.25 0.75,0.75 0.75,0.75 0.25,0.25 0.25)))", ), ] for (gml, expected_wkt) in gml_expected_wkt_list: geom = ogr.CreateGeometryFromGML(gml) wkt = geom.ExportToWkt() if expected_wkt is None: pytest.fail( "did not get expected result for %s. Got %s instead of None" % (gml, wkt) ) else: assert ( wkt == expected_wkt ), "did not get expected result for %s. Got %s instead of %s" % ( gml, wkt, expected_wkt, ) ############################################################################### # Test srsDimension attribute on top-level geometry and not on posList (#5606) def test_gml_srsDimension_topgeometry(): gml = """ 0 0 10 0 1 10 1 1 10 1 0 10 0 0 10 """ geom = ogr.CreateGeometryFromGML(gml) assert geom.ExportToWkt() == "POLYGON ((0 0 10,0 1 10,1 1 10,1 0 10,0 0 10))" ############################################################################### # Test GML Arc def test_gml_Arc(): gml = "1 0 0 1 -1 0" geom = ogr.CreateGeometryFromGML(gml) assert ( ogrtest.check_feature_geometry( geom, ogr.CreateGeometryFromWkt("CIRCULARSTRING (1 0,0 1,-1 0)") ) == 0 ) gml2 = geom.ExportToGML(["FORMAT=GML3"]) expected_gml2 = "1 0 0 1 -1 0" assert gml2 == expected_gml2 geom2 = ogr.CreateGeometryFromGML(gml2) assert geom.Equals(geom2) ############################################################################### # Test GML ArcByBulge def test_gml_ArcByBulge(): gml = "2 0 -2 02-1" geom = ogr.CreateGeometryFromGML(gml) assert ( ogrtest.check_feature_geometry( geom, ogr.CreateGeometryFromWkt("CIRCULARSTRING (2 0,0 2,-2 0)") ) == 0 ) ############################################################################### # Test GML ArcByCenterPoint def test_gml_ArcByCenterPoint(): gml = "1 2290270" geom = ogr.CreateGeometryFromGML(gml) assert ( ogrtest.check_feature_geometry( geom, ogr.CreateGeometryFromWkt("CIRCULARSTRING (1 4,-1 2,1 0)") ) == 0 ) ############################################################################### # Test compound curve of ArcByCenterPoint whose ends don't exactly match # with ends of neighbouring curves, as found in some AIXM files def test_gml_CompoundCurve_of_ArcByCenterPoint(): gml = """ -80.40 33.86 -80.27 33.63 -80.47 33.98 23 295 249 -80.63 33.62 -80.39 33.85 """ geom = ogr.CreateGeometryFromGML(gml) assert ( ogrtest.check_feature_geometry( geom, ogr.CreateGeometryFromWkt( "POLYGON ((-80.4 33.86,-80.27 33.63,-80.305028054229538 33.622017309598967,-80.335422529369936 33.613343178471617,-80.366464292754429 33.606448070493634,-80.398003921948742 33.601365147653873,-80.429889693662162 33.598118851265042,-80.461968286017793 33.596724788982847,-80.494085487001527 33.597189662699385,-80.52608690656875 33.599511237590342,-80.557818688893789 33.603678352435914,-80.589128223167393 33.609670971175497,-80.619864849221443 33.617460275496377,-80.63 33.62,-80.39 33.85))" ), ) == 0 ) ############################################################################### # Test GML CircleByCenterPoint def test_gml_CircleByCenterPoint(): gml = "1 22" geom = ogr.CreateGeometryFromGML(gml) assert ( ogrtest.check_feature_geometry( geom, ogr.CreateGeometryFromWkt("CIRCULARSTRING (-1 2,3 2,-1 2)") ) == 0 ) ############################################################################### # Test GML CircleByCenterPoint with uom="m" and uom="km" def test_gml_CircleByCenterPoint_srs_geog_uom_m_km(): gml = '49 22000' geom1 = ogr.CreateGeometryFromGML(gml) geom1.SwapXY() gml = '2 492' geom2 = ogr.CreateGeometryFromGML(gml) assert ogrtest.check_feature_geometry(geom1, geom2) == 0 ############################################################################### # Test compound curve of ArcByCenterPoint whose ends don't exactly match # with ends of neighbouring curves, as found in some AIXM files # with all curves in the same element as found in #2356) def test_gml_CompoundCurve_of_ArcByCenterPoint_curve_in_same_segments(): geom = ogr.CreateGeometryFromGML( """ 55.233333333333334 -36.166666666666664 55.23116372807667 -36.89437337916484 55.2333333333333 -36.166666666666664 25.0 270.0 497.0 54.92816350530716 -35.674116070018954 55.233333333333334 -36.166666666666664 2.0 """ ) assert ( ogrtest.check_feature_geometry( geom, ogr.CreateGeometryFromWkt( "POLYGON ((55.2333333333333 -36.1666666666667,55.2311637280767 -36.8943733791648,55.2602248071013 -36.8960852160185,55.2891782700249 -36.8912782655051,55.3178697537514 -36.88292675789,55.3461587637071 -36.8710639413776,55.3739064765608 -36.8557405708675,55.4009764350458 -36.8370248014709,55.4272352367262 -36.8150019876212,55.4525532129231 -36.7897743859994,55.476805093957 -36.7614607612323,55.4998706568286 -36.7301958939182,55.5216353514589 -36.6961299915025,55.5419909016414 -36.6594280032268,55.5608358769213 -36.6202688413925,55.5780762317212 -36.5788445119267,55.5936258081681 -36.5353591583435,55.6074067992521 -36.4900280239174,55.6193501691593 -36.4430763379496,55.6293960278662 -36.3947381326996,55.6374939573672 -36.3452549984946,55.6436032872147 -36.2948747851727,55.6476933173936 -36.2438502586493,55.6497434869178 -36.19243772209,55.6497434869178 -36.1408956112433,55.6476933173936 -36.089483074684,55.6436032872147 -36.0384585481606,55.6374939573672 -35.9880783348387,55.6293960278662 -35.9385952006337,55.6193501691593 -35.8902569953837,55.6074067992521 -35.8433053094159,55.5936258081681 -35.7979741749898,55.5780762317212 -35.7544888214066,55.5608358769213 -35.7130644919408,55.5419909016414 -35.6739053301065,55.5216353514589 -35.6372033418322,55.4998706568286 -35.6031374394151,55.476805093957 -35.571872572101,55.4525532129231 -35.5435589473339,55.4272352367262 -35.5183313457121,55.4009764350458 -35.4963085318624,55.3739064765608 -35.4775927624659,55.3461587637071 -35.4622693919557,55.3178697537514 -35.4504065754433,55.2891782700249 -35.4420550678282,55.2602248071013 -35.4372481173149,55.2311508336186 -35.4360014509317,55.2020980963355 -35.4383133491681,55.1732079288891 -35.4441648063421,55.1446205685763 -35.4535197729773,55.1164744843283 -35.4663254761286,55.0889057188812 -35.4825128133848,55.0620472479757 -35.5019968161103,55.0360283592393 -35.524677177381,55.0109740532301 -35.5504388400636,54.9870044689367 -35.5791526404379,54.9642343358562 -35.6106760028906,54.9427724545944 -35.6448536812344,54.9281635053072 -35.674116070019,55.2333333333333 -36.1666666666667))" ), ) == 0 ) ############################################################################### # Test Ring starting with ArcByCenterPoint def test_gml_Ring_starting_with_ArcByCenterPoint(): geom = ogr.CreateGeometryFromGML( """ 46.5875 0.3066666666666666 9.5 6.295729688631284 67.38797951888118 46.64833333333333 0.5194444444444445 46.43861111111111 0.33805555555555555 46.42305555555555 0.28944444444444445 46.581388888888895 0.2980555555555556 9.5 -177.84615335400528 -120.68835384474265 46.500277777777775 0.10055555555555556 46.54083333333333 0.10555555555555556 46.575 0.225 46.59444444444445 0.25833333333333336 46.65833333333333 0.2833333333333333 46.69555555555555 0.25555555555555554 46.745 0.33194444444444443 """ ) # print(g) assert ( ogrtest.check_feature_geometry( geom, ogr.CreateGeometryFromWkt( "POLYGON ((46.745 0.331944444444444,46.7432764927165 0.347962462754535,46.7409162535525 0.363717281627594,46.7378065348593 0.3791917846605,46.7339626150092 0.394310000163572,46.7294033759096 0.408997750371246,46.7241512079629 0.423183023082575,46.7182318974714 0.436796331344972,46.7116744971061 0.449771059387196,46.7045111801497 0.462043792829896,46.6967770793052 0.473554631563425,46.6885101109471 0.484247483569652,46.6797507857586 0.494070338341013,46.6705420067727 0.502975518511247,46.6609288558889 0.5109199085045,46.6509583699943 0.517865159176619,46.6483333333333 0.519444444444444,46.4386111111111 0.338055555555556,46.4230555555555 0.289444444444444,46.4239652827541 0.273432507330975,46.4255282239253 0.25756088338307,46.4278483647801 0.241884857622964,46.4309144976449 0.226480183207377,46.4347118090807 0.21142133567082,46.4392219496614 0.196781161237034,46.4444231204746 0.18263053185483,46.450290175977 0.169038008752016,46.4567947427662 0.156069515749848,46.4639053537626 0.143788023916768,46.4715875972233 0.132253248900933,46.4798042799442 0.121521362391196,46.4885156039408 0.111644719041597,46.4976793558324 0.102671600158084,46.5002777777778 0.100555555555556,46.5408333333333 0.105555555555556,46.575 0.225,46.5944444444444 0.258333333333333,46.6583333333333 0.283333333333333,46.6955555555556 0.255555555555556,46.745 0.331944444444444))" ), ) == 0 ) ############################################################################### # Test Ring ending with ArcByCenterPoint def test_gml_Ring_ending_with_ArcByCenterPoint(): geom = ogr.CreateGeometryFromGML( """ 65.921852847164544 57.491624339427801 65.994485559282040 57.381695154985898 65.994485559282040 57.381695154985898 66.005296531715544 57.370309546435649 66.005296531715544 57.370309546435649 66.016091667389503 57.358930089809121 66.016091667389503 57.358930089809121 66.098645447810924 57.305543979762817 66.015066666666669 57.356413888888888 5.183821647136702 346.133716913420812 246.770739243069897 65.980986631402914 57.162257469110280 65.960397363228381 57.184109890966802 65.994450000000001 57.378138888888891 5.183821647136512 246.790586752267330 147.427609082272085 """ ) # print(g) assert ( ogrtest.check_feature_geometry( geom, ogr.CreateGeometryFromWkt( "POLYGON ((65.9218528471645 57.4916243394278,65.994485559282 57.3816951549859,66.0052965317155 57.3703095464356,66.0160916673895 57.3589300898091,66.0986454478109 57.3055439797628,66.0972833787257 57.2909960861013,66.0952275333989 57.2770050871946,66.0927800217659 57.2634046235748,66.0899528791643 57.2502614506486,66.0867600033801 57.2376400142709,66.0832170844948 57.2256021285702,66.079341525797 57.214206668632,66.0751523561957 57.203509279214,66.0706701346179 57.1935621012919,66.0659168469146 57.1844135176486,66.0609157958339 57.1761079188393,66.0556914846553 57.1686854906152,66.0502694951079 57.1621820236802,66.0446763602204 57.1566287467641,66.0389394327704 57.1520521834553,66.033086750019 57.1484740335078,66.0271468954283 57.145911078861,66.0211488580662 57.1443751146804,66.0151218904116 57.1438729053792,66.0090953652666 57.1444061657465,66.0030986324867 57.1459715668484,65.9971608762266 57.1485607664255,65.991310973392 57.1521604634455,65.9855773539744 57.156752476156,65.9809866314029 57.1622574691103,65.9603973632284 57.1841098909668,65.9548299773474 57.1895629087476,65.9495750702849 57.1968227388142,65.9445389220664 57.2049612750665,65.9397459320329 57.2139385813473,65.935219308136 57.2237107308994,65.9309809566457 57.234230023973,65.927051378271 57.2454452217566,65.9234495711475 57.2573017957448,65.9201929411068 57.269742191149,65.9172972196136 57.2827061032052,65.914776389716 57.2961307649312,65.9126426203217 57.3099512454202,65.9109062090733 57.3241007570179,65.9095755340619 57.3385109700802,65.9086570145768 57.353112334239,65.9081550810541 57.3678344048457,65.9080721543467 57.382606172423,65.9084086344011 57.3973563949994,65.9091628983867 57.4120139317594,65.9103313082862 57.4265080751922,65.911908227915 57.4407688820673,65.9138860493003 57.4547275015333,65.9162552283127 57.468316498379,65.9190043294021 57.4814701705531,65.9218528471645 57.4916243394278))" ), ) == 0 ) ############################################################################### # Test GML Circle def test_gml_Circle(): gml = """ -1 0 0 1 -0.707106781186547 -0.707106781186548 """ geom = ogr.CreateGeometryFromGML(gml) expected_wkt = "CIRCULARSTRING (-1 0,0 1,-0.707106781186547 -0.707106781186548,-0.923879532511287 -0.38268343236509,-1 0)" assert ( ogrtest.check_feature_geometry(geom, ogr.CreateGeometryFromWkt(expected_wkt)) == 0 ) geom = ogr.CreateGeometryFromWkt("CIRCULARSTRING (0 0,2 0,0 0)") gml2 = geom.ExportToGML(["FORMAT=GML3"]) expected_gml2 = "0 0 1 1 2 0" assert gml2 == expected_gml2 geom2 = ogr.CreateGeometryFromGML(gml2) assert geom2.ExportToWkt() == "CIRCULARSTRING (0 0,1 1,2 0,1 -1,0 0)" geom = ogr.CreateGeometryFromWkt("CIRCULARSTRING (0 0 10,2 0 10,0 0 10)") gml2 = geom.ExportToGML(["FORMAT=GML3"]) expected_gml2 = '0 0 10 1 1 10 2 0 10' assert gml2 == expected_gml2 gml = """ -1 0 0 1 -0.707106781186547 -0.707106781186548 """ geom = ogr.CreateGeometryFromGML(gml) expected_wkt = "CURVEPOLYGON ( CIRCULARSTRING (-1 0,0 1,-0.707106781186547 -0.707106781186548,-0.923879532511287 -0.38268343236509,-1 0))" assert ( ogrtest.check_feature_geometry(geom, ogr.CreateGeometryFromWkt(expected_wkt)) == 0 ) ############################################################################### # Test ArcString def test_gml_ArcString(): gml = """-2 0 -1 -1 0 0""" geom = ogr.CreateGeometryFromGML(gml) assert geom.ExportToWkt() == "CIRCULARSTRING (-2 0,-1 -1,0 0)" gml = """-2 0 -1 -1 0 0 1 -1 2 0 0 2 -2 0""" geom = ogr.CreateGeometryFromGML(gml) assert geom.ExportToWkt() == "CIRCULARSTRING (-2 0,-1 -1,0 0,1 -1,2 0,0 2,-2 0)" gml2 = geom.ExportToGML(["FORMAT=GML3"]) expected_gml2 = "-2 0 -1 -1 0 0 1 -1 2 0 0 2 -2 0" assert gml2 == expected_gml2 geom2 = ogr.CreateGeometryFromGML(gml2) assert geom2.ExportToWkt() == "CIRCULARSTRING (-2 0,-1 -1,0 0,1 -1,2 0,0 2,-2 0)" ############################################################################### # Test OGRCompoundCurve def test_gml_OGRCompoundCurve(): wkt = "COMPOUNDCURVE ((0 0,1 1,2 0))" geom = ogr.CreateGeometryFromWkt(wkt) gml = geom.ExportToGML(["FORMAT=GML3"]) expected_gml = "0 0 1 1 2 0" assert gml == expected_gml # CompositeCurve of LineStringSegment gml = expected_gml geom = ogr.CreateGeometryFromGML(gml) # We simplify it in LINESTRING assert geom.ExportToWkt() == "LINESTRING (0 0,1 1,2 0)" # CompositeCurve of Arc gml = """0 0 1 1 2 0""" geom = ogr.CreateGeometryFromGML(gml) assert geom.ExportToWkt() == "COMPOUNDCURVE (CIRCULARSTRING (0 0,1 1,2 0))" gml2 = geom.ExportToGML(["FORMAT=GML3"]) assert gml2 == gml # CompositeCurve of 3 arcs gml = """ 0 0 1 1 2 0 2 0 3 1 4 0 4 0 5 1 6 0 """ geom = ogr.CreateGeometryFromGML(gml) assert ( geom.ExportToWkt() == "COMPOUNDCURVE (CIRCULARSTRING (0 0,1 1,2 0),CIRCULARSTRING (2 0,3 1,4 0),CIRCULARSTRING (4 0,5 1,6 0))" ) # Alternative syntax : Curve with 3 Arc segments gml = """ 0 0 1 1 2 0 2 0 3 1 4 0 4 0 5 1 6 0 """ geom = ogr.CreateGeometryFromGML(gml) assert ( geom.ExportToWkt() == "COMPOUNDCURVE (CIRCULARSTRING (0 0,1 1,2 0),CIRCULARSTRING (2 0,3 1,4 0),CIRCULARSTRING (4 0,5 1,6 0))" ) # Curve with LineStringSegment and Arc segments gml = """ 0 0 1 0 0 0 0 0 -1 0 0 0 """ geom = ogr.CreateGeometryFromGML(gml) assert ( geom.ExportToWkt() == "COMPOUNDCURVE (CIRCULARSTRING (0 0,1 0,0 0),(0 0,-1 0,0 0))" ) # Composite curve of a LineString and a (Composite) Curve with an Arc and a LineString gml = """ 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 0 0 0 """ geom = ogr.CreateGeometryFromGML(gml) assert ( geom.ExportToWkt() == "COMPOUNDCURVE ((0 0,1 0,0 0),CIRCULARSTRING (0 0,1 0,0 0),(0 0,-1 0,0 0))" ) ############################################################################### # Test OGRCurvePolygon def test_gml_OGRCurvePolygon_one_CircularString(): # Test one CircularString gml = """0 0 1 0 0 0""" geom = ogr.CreateGeometryFromGML(gml) assert geom.ExportToWkt() == "CURVEPOLYGON (CIRCULARSTRING (0 0,1 0,0 0))" gml_out = geom.ExportToGML(["FORMAT=GML3"]) expected_gml = "0 0 0.5 0.5 1 0" assert gml_out == expected_gml gml_out = geom.ExportToGML(["FORMAT=GML3", "GMLID=gmlid"]) expected_gml = '0 0 0.5 0.5 1 0' assert gml_out == expected_gml def test_gml_OGRCurvePolygon_one_CircularString_with_interior_CircularString(): # Test one CircularString inside one CircularString gml = """0 0 1 0 0 00.25 0 0.75 0 0.25 0""" geom = ogr.CreateGeometryFromGML(gml) assert ( geom.ExportToWkt() == "CURVEPOLYGON (CIRCULARSTRING (0 0,1 0,0 0),CIRCULARSTRING (0.25 0.0,0.75 0.0,0.25 0.0))" ) gml_out = geom.ExportToGML(["FORMAT=GML3"]) expected_gml = "0 0 0.5 0.5 1 00.25 0.0 0.5 0.25 0.75 0.0" assert gml_out == expected_gml gml_out = geom.ExportToGML(["FORMAT=GML3", "GMLID=gmlid"]) expected_gml = '0 0 0.5 0.5 1 00.25 0.0 0.5 0.25 0.75 0.0' assert gml_out == expected_gml def test_gml_OGRCurvePolygon_CompoundCurve(): # Test one CompoundCurve with one LineString and on CircularString gml = """0 -1 0 10 1 1 0 0 -1""" geom = ogr.CreateGeometryFromGML(gml) assert ( geom.ExportToWkt() == "CURVEPOLYGON (COMPOUNDCURVE ((0 -1,0 1),CIRCULARSTRING (0 1,1 0,0 -1)))" ) gml_out = geom.ExportToGML(["FORMAT=GML3"]) assert gml_out == gml gml_out = geom.ExportToGML(["FORMAT=GML3", "GMLID=gmlid"]) expected_gml = '0 -1 0 10 1 1 0 0 -1' assert gml_out == expected_gml def test_gml_OGRCurvePolygon_LinearRing_with_interior_CircularString(): # Test a LinearRing followed by a CircularString gml = """-2 -2 -2 2 2 2 2 -2 -2 -20.25 0 0.75 0 0.25 0""" geom = ogr.CreateGeometryFromGML(gml) assert ( geom.ExportToWkt() == "CURVEPOLYGON ((-2 -2,-2 2,2 2,2 -2,-2 -2),CIRCULARSTRING (0.25 0.0,0.75 0.0,0.25 0.0))" ) def test_gml_OGRCurvePolygon_CircularString_with_interior_LinearRing(): # Test a CircularString followed by a LinearRing gml = """-1 0 1 2 3 0-2 -2 -2 2 2 2 2 -2 -2 -2""" geom = ogr.CreateGeometryFromGML(gml) assert ( ogrtest.check_feature_geometry( geom, "CURVEPOLYGON (CIRCULARSTRING (-1 0,1 2,3 0,1.0 -2.0,-1 0),(-2 -2,-2 2,2 2,2 -2,-2 -2))", ) == 0 ), geom.ExportToWkt() gml2 = geom.ExportToGML(["FORMAT=GML3"]) geom2 = ogr.CreateGeometryFromGML(gml) expected_gml2 = "-1 0 1 2 3 0 1 -2 -1 0-2 -2 -2 2 2 2 2 -2 -2 -2" expected_geom2 = ogr.CreateGeometryFromGML(expected_gml2) assert ogrtest.check_feature_geometry(geom2, expected_geom2) == 0, gml2 ############################################################################### # Test OGRMultiSurface def test_gml_OGRMultiSurface(): # MultiSurface of CurvePolygon gml = """ 0 0 1 1 1 -1 """ geom = ogr.CreateGeometryFromGML(gml) assert ( geom.ExportToWkt() == "MULTISURFACE (CURVEPOLYGON (CIRCULARSTRING (0 0,1 1,1 -1,0.292893218813453 -0.707106781186548,0 0)))" ), " not correctly parsed" # MultiSurface of Polygon and CurvePolygon gml = """ 0 0 0 1 1 1 0 0 0 0 1 1 1 -1 """ geom = ogr.CreateGeometryFromGML(gml) assert ( geom.ExportToWkt() == "MULTISURFACE (((0 0,0 1,1 1,0 0)),CURVEPOLYGON (CIRCULARSTRING (0 0,1 1,1 -1,0.292893218813453 -0.707106781186548,0 0)))" ), " not correctly parsed" # MultiSurface of CurvePolygon and Polygon gml = """ 0 0 1 1 1 -1 0 0 0 1 1 1 0 0 """ geom = ogr.CreateGeometryFromGML(gml) assert ( geom.ExportToWkt() == "MULTISURFACE (CURVEPOLYGON (CIRCULARSTRING (0 0,1 1,1 -1,0.292893218813453 -0.707106781186548,0 0)),((0 0,0 1,1 1,0 0)))" ), " not correctly parsed" geom = ogr.CreateGeometryFromWkt( "MULTISURFACE (CURVEPOLYGON((0 0,0 1,1 1,1 0,0 0)))" ) gml2 = geom.ExportToGML(["FORMAT=GML3"]) expected_gml2 = "0 0 0 1 1 1 1 0 0 0" assert gml2 == expected_gml2 ############################################################################### # Test OGRMultiCurve def test_gml_OGRMultiCurve(): # MultiCurve of Arc gml = """0 0 1 1 1 -1""" geom = ogr.CreateGeometryFromGML(gml) assert ( geom.ExportToWkt() == "MULTICURVE (CIRCULARSTRING (0 0,1 1,1 -1))" ), " not correctly parsed" gml2 = geom.ExportToGML(["FORMAT=GML3"]) assert gml2 == gml # MultiCurve of LineString and Arc gml = """ 0 0 1 1 1 -1 0 0 1 1 1 -1 """ geom = ogr.CreateGeometryFromGML(gml) assert ( geom.ExportToWkt() == "MULTICURVE ((0 0,1 1,1 -1),CIRCULARSTRING (0 0,1 1,1 -1))" ), " not correctly parsed" # MultiCurve of Arc and LineString gml = """ 0 0 1 1 1 -1 0 0 1 1 1 -1 """ geom = ogr.CreateGeometryFromGML(gml) assert ( geom.ExportToWkt() == "MULTICURVE (CIRCULARSTRING (0 0,1 1,1 -1),(0 0,1 1,1 -1))" ), " not correctly parsed" # MultiCurve of CompositeCurve gml = """ 0 0 1 1 1 -1 1 -1 1 1 1 -1 """ geom = ogr.CreateGeometryFromGML(gml) assert ( geom.ExportToWkt() == "MULTICURVE (COMPOUNDCURVE (CIRCULARSTRING (0 0,1 1,1 -1),(1 -1,1 1,1 -1)))" ), " not correctly parsed" ############################################################################### # Test write support for GML namespace declaration def test_gml_write_gml_ns(): geom = ogr.CreateGeometryFromWkt("POINT(500000 4500000)") gml = geom.ExportToGML(options=["NAMESPACE_DECL=YES"]) expected_gml = '500000,4500000' assert gml == expected_gml, "got %s, instead of %s" % (gml, expected_gml) geom = ogr.CreateGeometryFromWkt("POINT(500000 4500000)") gml = geom.ExportToGML(options=["FORMAT=GML3", "NAMESPACE_DECL=YES"]) expected_gml = '500000 4500000' assert gml == expected_gml, "got %s, instead of %s" % (gml, expected_gml) geom = ogr.CreateGeometryFromWkt("POINT(500000 4500000)") gml = geom.ExportToGML(options=["FORMAT=GML32", "GMLID=foo", "NAMESPACE_DECL=YES"]) expected_gml = '500000 4500000' assert gml == expected_gml, "got %s, instead of %s" % (gml, expected_gml) ############################################################################### # Test reading geometry from https://github.com/OSGeo/gdal/issues/4155 def test_gml_read_gml_ArcByCenterPoint_projected_crs_northing_easting(): g = ogr.CreateGeometryFromGML( """ 821502.753690919 838825.332031005 821194.727830006 839043.611480001 821194.396688321 839052.616490606 9.01109709191771 177.894008505116 250.98396509322 821185.877350006 839049.680380003 821502.753690919 838825.332031005 """ ) assert g is not None