def gml_Solid(): gml = """<gml:Solid gml:id="UUID_cc5a9513-2d85-4f1a-869a-620400182e1f"> <gml:exterior> <gml:CompositeSurface gml:id="UUID_2c83341e-a9ce-4abe-9c40-b5208eed5588"> <gml:surfaceMember> <gml:Polygon gml:id="UUID_d8e4b04b-ce0a-441e-b940-5ab99fcf6112"> <gml:exterior> <gml:LinearRing gml:id="UUID_d8e4b04b-ce0a-441e-b940-5ab99fcf6112_0"> <gml:posList srsDimension="3">1 2 0 3 4 0 5 6 0 1 2 0</gml:posList> </gml:LinearRing> </gml:exterior> </gml:Polygon> </gml:surfaceMember> </gml:CompositeSurface> </gml:exterior> </gml:Solid>""" geom = ogr.CreateGeometryFromGML( gml ) if geom.ExportToWkt() != 'MULTIPOLYGON (((1 2 0,3 4 0,5 6 0,1 2 0)))': gdaltest.post_reason( '<gml:Solid> not correctly parsed' ) print(geom.ExportToWkt()) return 'fail' return 'success'
def gml_Circle(): gml = """<gml:PolygonPatch> <gml:exterior> <gml:Ring> <gml:curveMember> <gml:Curve> <gml:segments> <gml:Circle> <gml:posList>-1 0 0 1 -0.707106781186547 -0.707106781186548</gml:posList> </gml:Circle> </gml:segments> </gml:Curve> </gml:curveMember> </gml:Ring> </gml:exterior> </gml:PolygonPatch>""" gdal.SetConfigOption('OGR_ARC_STEPSIZE','45') geom = ogr.CreateGeometryFromGML( gml ) gdal.SetConfigOption('OGR_ARC_STEPSIZE',None) expected_wkt = 'POLYGON ((-1.0 0.0,-0.707106781186547 0.707106781186548,0.0 1.0,0.707106781186548 0.707106781186547,1 0,0.707106781186548 -0.707106781186547,0.0 -1.0,-0.707106781186547 -0.707106781186548,-1.0 -0.0,-1.0 -0.0))' if ogrtest.check_feature_geometry(geom, ogr.CreateGeometryFromWkt(expected_wkt)) != 0: print(geom) return 'fail' return 'success'
def gml_Arc(): poslist_list = [ ("1 0 0 1 -1 0", 'LINESTRING (1 0,0.707106781186548 0.707106781186547,0.0 1.0,-0.707106781186547 0.707106781186548,-1.0 0.0)' ), ("1 0 0 -1 -1 0", 'LINESTRING (1 0,0.707106781186548 -0.707106781186547,0.0 -1.0,-0.707106781186547 -0.707106781186548,-1.0 -0.0)' ), ("1 0 -1 0 0 -1 ", 'LINESTRING (1 0,0.707106781186548 0.707106781186547,0.0 1.0,-0.707106781186547 0.707106781186548,-1.0 0.0,-0.707106781186548 -0.707106781186547,-0.0 -1.0)' ), ("1 0 -1 0 0 1 ", 'LINESTRING (1 0,0.707106781186548 -0.707106781186547,0.0 -1.0,-0.707106781186547 -0.707106781186548,-1.0 -0.0,-0.707106781186548 0.707106781186547,-0.0 1.0)' ), ("1 0 0 0 -1 0 ", 'LINESTRING (1 0,0 0,-1 0)' ), ("0 1 1 0 0 -1", 'LINESTRING (0.0 1.0,0.707106781186548 0.707106781186547,1 0,0.707106781186548 -0.707106781186547,0.0 -1.0)' ), ("0 1 -1 0 0 -1", 'LINESTRING (0.0 1.0,-0.707106781186547 0.707106781186548,-1.0 0.0,-0.707106781186548 -0.707106781186547,-0.0 -1.0)' ), ("-1 0 0 1 1 0", 'LINESTRING (-1.0 0.0,-0.707106781186547 0.707106781186548,0.0 1.0,0.707106781186548 0.707106781186547,1 0)' ), ("-1 0 0 1 -0.707106781186547 -0.707106781186548", 'LINESTRING (-1.0 0.0,-0.707106781186547 0.707106781186548,0.0 1.0,0.707106781186548 0.707106781186547,1 0,0.707106781186548 -0.707106781186547,0.0 -1.0,-0.707106781186547 -0.707106781186548)' ) ] for (poslist, expected_wkt) in poslist_list: gml = "<gml:Arc><gml:posList>%s</gml:posList></gml:Arc>" % poslist gdal.SetConfigOption('OGR_ARC_STEPSIZE','45') geom = ogr.CreateGeometryFromGML( gml ) gdal.SetConfigOption('OGR_ARC_STEPSIZE',None) if ogrtest.check_feature_geometry(geom, ogr.CreateGeometryFromWkt(expected_wkt)) != 0: print(gml) print(geom) return 'fail' return 'success'
def gml_pos_polygon(): gml = '''<gml:Polygon> <gml:exterior> <gml:LinearRing> <gml:pos>0 0</gml:pos> <gml:pos>4 0</gml:pos> <gml:pos>4 4</gml:pos> <gml:pos>0 4</gml:pos> <gml:pos>0 0</gml:pos> </gml:LinearRing> </gml:exterior> <gml:interior> <gml:LinearRing> <gml:pos>1 1</gml:pos> <gml:pos>2 1</gml:pos> <gml:pos>2 2</gml:pos> <gml:pos>1 2</gml:pos> <gml:pos>1 1</gml:pos> </gml:LinearRing> </gml:interior> </gml:Polygon>''' geom = ogr.CreateGeometryFromGML( gml ) if geom.ExportToWkt() != 'POLYGON ((0 0,4 0,4 4,0 4,0 0),(1 1,2 1,2 2,1 2,1 1))': gdaltest.post_reason( '<gml:Polygon> not correctly parsed' ) return 'fail' return 'success'
def gml_OrientableSurface(): gml = """<gml:OrientableSurface orientation="+"> <gml:baseSurface> <gml:Polygon> <gml:exterior> <gml:LinearRing> <gml:posList srsDimension="3">-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 </gml:posList> </gml:LinearRing> </gml:exterior> </gml:Polygon> </gml:baseSurface> </gml:OrientableSurface>""" geom = ogr.CreateGeometryFromGML(gml) if 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))': gdaltest.post_reason('<gml:OrientableSurface> not correctly parsed') print(geom.ExportToWkt()) return 'fail' return 'success'
def gml_write_gml3_geometries(): gml_list = [ '<gml:Point><gml:pos>2 3</gml:pos></gml:Point>', '<gml:Point><gml:pos>2 3 4</gml:pos></gml:Point>', '<gml:LineString><gml:posList>2 3 4 5</gml:posList></gml:LineString>', '<gml:Curve><gml:segments><gml:LineStringSegment><gml:posList>2 3 4 5</gml:posList></gml:LineStringSegment></gml:segments></gml:Curve>', '<gml:LineString><gml:posList srsDimension="3">2 3 10 4 5 20</gml:posList></gml:LineString>', '<gml:Curve><gml:segments><gml:LineStringSegment><gml:posList srsDimension="3">2 3 10 4 5 20</gml:posList></gml:LineStringSegment></gml:segments></gml:Curve>', '<gml:Polygon><gml:exterior><gml:LinearRing><gml:posList>0 0 0 1 1 1 1 0 0 0</gml:posList></gml:LinearRing></gml:exterior></gml:Polygon>', '<gml:Polygon><gml:exterior><gml:LinearRing><gml:posList>0 0 0 1 1 1 1 0 0 0</gml:posList></gml:LinearRing></gml:exterior><gml:interior><gml:LinearRing><gml:posList>10 10 10 11 11 11 10 10</gml:posList></gml:LinearRing></gml:interior></gml:Polygon>', '<gml:MultiPoint><gml:pointMember><gml:Point><gml:pos>2 3</gml:pos></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:pos>4 5</gml:pos></gml:Point></gml:pointMember></gml:MultiPoint>', '<gml:MultiCurve><gml:curveMember><gml:LineString><gml:posList>0 1 2 3 4 5</gml:posList></gml:LineString></gml:curveMember><gml:curveMember><gml:LineString><gml:posList>6 7 8 9 10 11</gml:posList></gml:LineString></gml:curveMember></gml:MultiCurve>', '<gml:MultiCurve><gml:curveMember><gml:Curve><gml:segments><gml:LineStringSegment><gml:posList>0 1 2 3 4 5</gml:posList></gml:LineStringSegment></gml:segments></gml:Curve></gml:curveMember><gml:curveMember><gml:Curve><gml:segments><gml:LineStringSegment><gml:posList>6 7 8 9 10 11</gml:posList></gml:LineStringSegment></gml:segments></gml:Curve></gml:curveMember></gml:MultiCurve>', '<gml:MultiSurface><gml:surfaceMember><gml:Polygon><gml:exterior><gml:LinearRing><gml:posList>0 1 2 3 4 5 0 1</gml:posList></gml:LinearRing></gml:exterior></gml:Polygon></gml:surfaceMember><gml:surfaceMember><gml:Polygon><gml:exterior><gml:LinearRing><gml:posList>6 7 8 9 10 11 6 7</gml:posList></gml:LinearRing></gml:exterior></gml:Polygon></gml:surfaceMember></gml:MultiSurface>', '<gml:MultiGeometry><gml:geometryMember><gml:Point><gml:pos>0 1</gml:pos></gml:Point></gml:geometryMember><gml:geometryMember><gml:LineString><gml:posList>2 3 4 5</gml:posList></gml:LineString></gml:geometryMember></gml:MultiGeometry>' ] for gml_in in gml_list: geom = ogr.CreateGeometryFromGML(gml_in) if gml_in.find('<gml:Curve') != -1: gml_out = geom.ExportToGML( ['FORMAT=GML3', 'GML3_LINESTRING_ELEMENT=curve'] ) else: gml_out = geom.ExportToGML( ['FORMAT=GML3'] ) if gml_out != gml_in: gdaltest.post_reason('got %s, instead of %s' % (gml_out, gml_in)) return 'fail' return 'success'
def gml_geom( self ): raw_wkt = open('data/wkb_wkt/' + self.unit + '.wkt').read() ###################################################################### # Convert WKT to GML. geom_wkt = ogr.CreateGeometryFromWkt( raw_wkt ) gml = geom_wkt.ExportToGML() if gml is None or len(gml) == 0: gdaltest.post_reason( 'Conversion to GML failed.') return 'fail' ###################################################################### # 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() gdaltest.post_reason( 'WKT from GML (%s) does not match clean WKT (%s).\ngml was (%s)' % (gml_wkt, clean_wkt, gml) ) return 'fail' geom_wkt.Destroy() geom_gml.Destroy() return 'success'
def _create_base_map(self, ): ''' Deal with different types way to define the AOI, if none is specified, then the image bound is used. ''' if self.aoi is not None: if os.path.exists(self.aoi): try: g = gdal.Open(self.aoi) subprocess.call([ 'gdaltindex', '-f', 'GeoJSON', self.toa_dir + '/AOI.json', self.aoi ]) except: try: g = ogr.Open(self.aoi) except: raise IOError( 'AOI file cannot be opened by gdal, please check it or transform into format can be opened by gdal' ) else: try: g = ogr.CreateGeometryFromJson(aoi) except: try: g = ogr.CreateGeometryFromGML(aoi) except: try: g = ogr.CreateGeometryFromWkt(aoi) except: try: g = ogr.CreateGeometryFromWkb(aoi) except: raise IOError( 'The AOI has to be one of GeoJSON, GML, Wkt or Wkb.' ) gjson_str = '''{"type":"FeatureCollection","features":[{"type":"Feature","properties":{},"geometry":%s}]}''' % g.ExportToJson( ) with open(self.toa_dir + '/AOI.json', 'wb') as f: f.write(gjson_str) if not os.path.exists(self.toa_dir + '/AOI.json'): subprocess.call([ 'gdaltindex', '-f', 'GeoJSON', self.toa_dir + '/AOI.json', self.toa_bands[0] ]) self.logger.warning( 'AOI is not created and full band extend is used') self.aoi = self.toa_dir + '/AOI.json' else: self.aoi = self.toa_dir + '/AOI.json' if self.pixel_res is None: self.pixel_res = abs( gdal.Open(self.toa_bands[0]).GetGeoTransform()[1]) self.psf_xstd = 260 / self.pixel_res self.psf_ystd = 340 / self.pixel_res
def gml2json(self, gml): json_out = { "type": "FeatureCollection", "features": [], } geom_crs = None tree = etree.fromstring(gml) nsmap = tree.nsmap tag_name = lambda t: t.tag.split("{%s}" % nsmap[t.prefix])[-1] for feature in tree.getiterator("{%s}featureMember" % nsmap["gml"]): json_feature = { "type": "Feature", "properties": {}, "geometry": None, } for layer in feature.iterfind('{%s}*' % nsmap["ms"]): json_feature["properties"]["layer"] = tag_name(layer) wfs_id = layer.get("{%s}id" % nsmap["gml"], None) if wfs_id and self.map_name_use: wfs_id = u"{0}.{1}".format(self.map_name_use, wfs_id) json_feature["properties"]["id"] = wfs_id for prop in layer.iterfind('{%s}*' % nsmap["ms"]): get_prop = True for geom in prop.iterfind("{%s}*" % nsmap["gml"]): get_prop = False geom_crs = geom.get("srsName", None) ogr_geom = ogr.CreateGeometryFromGML( etree.tostring(geom)) if isinstance(ogr_geom, ogr.Geometry): json_feature["geometry"] = json.loads( ogr_geom.ExportToJson()) if geom_crs: json_feature["geometry"][ "crs"] = self.create_json_crs(geom_crs) if self.out_geom: ogr_geom = ogr.CreateGeometryFromJson( str( json.dumps(json_feature["geometry"], ensure_ascii=False))) if self.out_geom == "gml": json_feature[ "geometry"] = ogr_geom.ExportToGML() elif self.out_geom == "wkt": json_feature[ "geometry"] = ogr_geom.ExportToWkt() else: raise Exception( 'out_geom="{} is not valid (None,gml,wkt)use"' .format(self.out_geom)) if get_prop: json_feature["properties"][tag_name(prop)] = prop.text json_out["features"].append(json_feature) if geom_crs: json_out["crs"] = self.create_json_crs(geom_crs) if self.debug: self.echo2json(json_out) return json_out
def gml2json(gml, echo=False): json_out = { "type": "FeatureCollection", "features": [], } geom_crs = None tree = etree.fromstring(gml) nsmap = tree.nsmap tag_name = lambda t: t.tag.split("{%s}" % nsmap[t.prefix])[-1] for feature in tree.getiterator("{%s}featureMember" % nsmap["gml"]): json_feature = { "type": "Feature", "id": None, "layer": None, "properties": None, "geometry": None, } for layer in feature.iterfind('{%s}*' % nsmap["ms"]): json_feature["id"] = layer.get("{%s}id" % nsmap["gml"], None) json_feature["layer"] = tag_name(layer) for prop in layer.iterfind('{%s}*' % nsmap["ms"]): get_prop = True for geom in prop.iterfind("{%s}*" % nsmap["gml"]): get_prop = False geom_crs = geom.get("srsName", None) ogr_geom = ogr.CreateGeometryFromGML(etree.tostring(geom)) if isinstance(ogr_geom, ogr.Geometry): json_feature["geometry"] = json.loads( ogr_geom.ExportToJson()) if get_prop: if not json_feature["properties"]: json_feature["properties"] = {} json_feature["properties"][tag_name(prop)] = prop.text json_out["features"].append(json_feature) if geom_crs: geom_crs = geom_crs.split(":") if len(geom_crs) == 2: print geom_crs if geom_crs[0].lower() == "epsg": json_out["crs"] = { "type": "EPSG", "properties": { "code": geom_crs[-1], }, } if echo: print json.dumps( json_out, sort_keys=True, indent=4, separators=(',', ': '), ensure_ascii=False, ) return json_out
def gml_polygon(): gml = '<Polygon><exterior><LinearRing><posList>0 0 4 0 4 4 0 4 0 0</posList></LinearRing></exterior><interior><LinearRing><posList>1 1 2 1 2 2 1 2 1 1</posList></LinearRing></interior></Polygon>' geom = ogr.CreateGeometryFromGML( gml ) if geom.ExportToWkt() != 'POLYGON ((0 0,4 0,4 4,0 4,0 0),(1 1,2 1,2 2,1 2,1 1))': gdaltest.post_reason( '<gml:Polygon> not correctly parsed' ) return 'fail' return 'success'
def gml_pos_point(): gml = '<gml:Point><gml:pos>31 29 16</gml:pos></gml:Point>' geom = ogr.CreateGeometryFromGML( gml ) if geom.ExportToWkt() != 'POINT (31 29 16)': gdaltest.post_reason( '<gml:pos> not correctly parsed' ) return 'fail' return 'success'
def gml_posList_line3d(): gml = '<LineString><posList srsDimension="3">31 42 1 53 64 2 55 76 3</posList></LineString>' geom = ogr.CreateGeometryFromGML( gml ) if geom.ExportToWkt() != 'LINESTRING (31 42 1,53 64 2,55 76 3)': gdaltest.post_reason( '<gml:posList> not correctly parsed' ) return 'fail' return 'success'
def gml_space_test(): gml = '<gml:LineString><gml:coordinates decimal="." cs="," ts=" ">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</gml:coordinates></gml:LineString>' geom = ogr.CreateGeometryFromGML( gml ) if geom is None or geom.GetGeometryType() is not ogr.wkbLineString \ or geom.GetPointCount() != 8: gdaltest.post_reason( 'GML not correctly parsed' ) return 'fail' geom.Destroy() return 'success'
def gml_MultiSurface_surfaceMembers(): gml = """<gml:MultiSurface> <gml:surfaceMembers> <gml:Surface> <gml:patches> <gml:PolygonPatch> <gml:exterior> <gml:LinearRing> <gml:posList>1 2 3 4 5 6 1 2</gml:posList> </gml:LinearRing> </gml:exterior> <gml:interior> <gml:LinearRing> <gml:posList>2 3 4 5 6 7 2 3</gml:posList> </gml:LinearRing> </gml:interior> </gml:PolygonPatch> </gml:patches> </gml:Surface> <gml:Surface> <gml:patches> <gml:PolygonPatch> <gml:exterior> <gml:LinearRing> <gml:posList>3 4 5 6 7 8 3 4</gml:posList> </gml:LinearRing> </gml:exterior> </gml:PolygonPatch> <gml:PolygonPatch> <gml:exterior> <gml:LinearRing> <gml:posList>30 40 50 60 70 80 30 40</gml:posList> </gml:LinearRing> </gml:exterior> </gml:PolygonPatch> </gml:patches> </gml:Surface> </gml:surfaceMembers> </gml:MultiSurface>""" geom = ogr.CreateGeometryFromGML(gml) if 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)))': gdaltest.post_reason('<gml:MultiSurface> not correctly parsed') print(geom.ExportToWkt()) return 'fail' return 'success'
def gml_MultiCurve_curveMembers(): gml = """<gml:MultiCurve> <gml:curveMembers> <gml:LineString> <gml:posList srsDimension="2">0 0 1 1</gml:posList> </gml:LineString> </gml:curveMembers> </gml:MultiCurve>""" geom = ogr.CreateGeometryFromGML( gml ) if geom.ExportToWkt() != 'MULTILINESTRING ((0 0,1 1))': gdaltest.post_reason( '<gml:MultiCurve> not correctly parsed' ) print(geom.ExportToWkt()) return 'fail' return 'success'
def gml_Rectangle(): gml = """<gml:Rectangle> <gml:exterior> <gml:LinearRing> <gml:posList>0 0 0 1 1 1 1 0 0 0</gml:posList> </gml:LinearRing> </gml:exterior> </gml:Rectangle>""" geom = ogr.CreateGeometryFromGML( gml ) if geom.ExportToWkt() != 'POLYGON ((0 0,0 1,1 1,1 0,0 0))': gdaltest.post_reason( '<gml:Rectangle> not correctly parsed' ) print(geom.ExportToWkt()) return 'fail' return 'success'
def gml_Curve(): gml = """<gml:Curve xmlns:gml="http://www.opengis.net/gml" srsName="foo"> <gml:segments> <gml:LineStringSegment> <gml:posList>1 2 3 4</gml:posList> </gml:LineStringSegment> </gml:segments> </gml:Curve>""" geom = ogr.CreateGeometryFromGML( gml ) if geom.ExportToWkt() != 'LINESTRING (1 2,3 4)': gdaltest.post_reason( '<gml:Curve> not correctly parsed' ) print(geom.ExportToWkt()) return 'fail' return 'success'
def gml_Box(): gml = """<gml:Box xmlns:gml="http://www.opengis.net/gml" srsName="foo"> <gml:coord> <gml:X>1</gml:X> <gml:Y>2</gml:Y> </gml:coord> <gml:coord> <gml:X>3</gml:X> <gml:Y>4</gml:Y> </gml:coord> </gml:Box>""" geom = ogr.CreateGeometryFromGML( gml ) if geom.ExportToWkt() != 'POLYGON ((1 2 0,3 2 0,3 4 0,1 4 0,1 2 0))': gdaltest.post_reason( '<gml:Box> not correctly parsed' ) print(geom.ExportToWkt()) return 'fail' return 'success'
def gml_MultiCurve_pointMembers(): gml = """<gml:MultiPoint> <gml:pointMembers> <gml:Point> <gml:pos>0 0</gml:pos> </gml:Point> <gml:Point> <gml:pos>1 1</gml:pos> </gml:Point> </gml:pointMembers> </gml:MultiPoint>""" geom = ogr.CreateGeometryFromGML( gml ) if geom.ExportToWkt() != 'MULTIPOINT (0 0,1 1)': gdaltest.post_reason( '<gml:MultiPoint> not correctly parsed' ) print(geom.ExportToWkt()) return 'fail' return 'success'
def gml_Tin(): gml = """<gml:Tin> <gml:patches> <gml:Triangle> <gml:exterior> <gml:LinearRing> <gml:posList srsDimension="3">0 0 1 0 1 1 1 1 1 1 0 1 0 0 1 </gml:posList> </gml:LinearRing> </gml:exterior> </gml:Triangle> </gml:patches> </gml:Tin>""" geom = ogr.CreateGeometryFromGML( gml ) if geom.ExportToWkt() != 'POLYGON ((0 0 1,0 1 1,1 1 1,1 0 1,0 0 1))': gdaltest.post_reason( '<gml:Tin> not correctly parsed' ) print(geom.ExportToWkt()) return 'fail' return 'success'
def gml_MultiCurve(): gml = """<gml:MultiCurve xmlns:gml="http://www.opengis.net/gml" srsName="foo"> <gml:curveMember> <gml:LineString> <gml:posList>1 2 2 3</gml:posList> </gml:LineString> </gml:curveMember> <gml:curveMember> <gml:LineString> <gml:posList>3 4 4 5</gml:posList> </gml:LineString> </gml:curveMember> </gml:MultiCurve>""" geom = ogr.CreateGeometryFromGML( gml ) if geom.ExportToWkt() != 'MULTILINESTRING ((1 2,2 3),(3 4,4 5))': gdaltest.post_reason( '<gml:MultiCurve> not correctly parsed' ) print(geom.ExportToWkt()) return 'fail' return 'success'
def gml_invalid_geoms(): gml_expected_wkt_list = [ ('<foo/>', None), ('<gml:Point><gml:pos>31 29 16</gml:pos><gml:pos>31 29 16</gml:pos></gml:Point>', None), ('<gml:Point><gml:coordinates/></gml:Point>', None), ('<gml:Point><gml:coordinates>0</gml:Coordinates></gml:Point>', None), ('<gml:Point><gml:coordinates>0 1</gml:Coordinates></gml:Point>', 'POINT (0 1)'), # Support for uncommon formatting of coordinates ('<gml:Point><gml:coordinates>0 1 2</gml:Coordinates></gml:Point>', 'POINT (0 1 2)'), # Support for uncommon formatting of coordinates ('<gml:Point><gml:coordinates>0,1 2,3</gml:Coordinates></gml:Point>', None), ('<gml:Point><gml:pos>0</gml:pos></gml:Point>', None), ('<gml:Point><gml:pos/></gml:Point>', None), ('<gml:Point/>', None), ('<gml:Point><foo/></gml:Point>', None), ('<gml:LineString/>', None), ('<gml:LineString><foo/></gml:LineString>', None), ('<gml:LineString><gml:posList></gml:posList></gml:LineString>', None), ('<gml:LineString><gml:posList>0</gml:posList></gml:LineString>', None), ('<gml:LineString><gml:posList srsDimension="4">0 1 2 3</gml:posList></gml:LineString>', None), ('<gml:LineString><gml:posList srsDimension="3">0 1 2 3</gml:posList></gml:LineString>', None), ('<gml:Point><gml:coord></gml:coord></gml:Point>', None), ('<gml:Point><gml:coord><gml:X/><gml:Y/></gml:coord></gml:Point>', None), ('<gml:Point><gml:coord><gml:X>0</gml:X></gml:coord></gml:Point>', None), ('<gml:Polygon/>', None), ('<gml:Polygon><gml:outerBoundaryIs/></gml:Polygon>', None), ('<gml:Polygon><gml:outerBoundaryIs><foo/></gml:outerBoundaryIs></gml:Polygon>', None), ('<gml:Polygon><gml:outerBoundaryIs><gml:Point><gml:pos>31 29 16</gml:pos></gml:Point></gml:outerBoundaryIs></gml:Polygon>', None), ('<gml:Polygon><gml:outerBoundaryIs><gml:LinearRing><gml:posList>0 1 2 3 4 5 0 1</gml:posList></gml:LinearRing></gml:outerBoundaryIs><gml:innerBoundaryIs/></gml:Polygon>', None), ('<gml:Polygon><gml:outerBoundaryIs><gml:LinearRing/></gml:outerBoundaryIs><gml:innerBoundaryIs/></gml:Polygon>', None), ('<gml:Polygon><gml:outerBoundaryIs><gml:LinearRing><gml:posList>0 1 2 3 4 5 0 1</gml:posList></gml:LinearRing></gml:outerBoundaryIs><gml:innerBoundaryIs><gml:Point><gml:pos>31 29 16</gml:pos></gml:Point></gml:innerBoundaryIs></gml:Polygon>', None), ('<gml:Ring/>', 'LINEARRING EMPTY'), # Probably illegal GML ('<gml:Ring><foo/></gml:Ring>', 'LINEARRING EMPTY'), # Probably illegal GML ('<gml:Ring><gml:curveMember/></gml:Ring>', None), ('<gml:Ring><gml:curveMember><foo/></gml:curveMember></gml:Ring>', None), ('<gml:Ring><gml:curveMember><gml:Point><gml:pos>31 29 16</gml:pos></gml:Point></gml:curveMember></gml:Ring>', None), ('<gml:Box/>', None), ('<gml:Box><gml:pos>31 29 16</gml:pos></gml:Box>', None), ('<gml:MultiPolygon/>', 'MULTIPOLYGON EMPTY'), # Probably illegal GML ('<gml:MultiPolygon><foo/></gml:MultiPolygon>', 'MULTIPOLYGON EMPTY'), # Probably illegal GML ('<gml:MultiPolygon><gml:polygonMember/></gml:MultiPolygon>', None), ('<gml:MultiPolygon><gml:polygonMember><foo/></gml:polygonMember></gml:MultiPolygon>', None), ('<gml:MultiPolygon><gml:polygonMember><gml:Point><gml:pos>31 29 16</gml:pos></gml:Point></gml:polygonMember></gml:MultiPolygon>', None), ('<gml:MultiSurface><gml:surfaceMembers/></gml:MultiSurface>', 'MULTIPOLYGON EMPTY'), # Probably illegal GML ('<gml:MultiSurface><gml:surfaceMembers><foo/></gml:surfaceMembers></gml:MultiSurface>', 'MULTIPOLYGON EMPTY'), # Probably illegal GML ('<gml:MultiSurface><gml:surfaceMembers><gml:Polygon/></gml:surfaceMembers></gml:MultiSurface>', None), ('<gml:MultiPoint/>', 'MULTIPOINT EMPTY'), ('<gml:MultiPoint><foo/></gml:MultiPoint>', 'MULTIPOINT EMPTY'), ('<gml:MultiPoint><gml:pointMember/></gml:MultiPoint>', None), ('<gml:MultiPoint><gml:pointMember><gml:LineString><gml:posList>0 1 2 3</gml:posList></gml:LineString></gml:pointMember></gml:MultiPoint>', None), ('<gml:MultiPoint><gml:pointMembers></gml:pointMembers></gml:MultiPoint>', 'MULTIPOINT EMPTY'), ('<gml:MultiPoint><gml:pointMembers><foo/></gml:pointMembers></gml:MultiPoint>', 'MULTIPOINT EMPTY'), ('<gml:MultiPoint><gml:pointMembers><gml:Point/></gml:pointMembers></gml:MultiPoint>', None), ('<gml:MultiLineString/>', 'MULTILINESTRING EMPTY'), ('<gml:MultiLineString><foo/></gml:MultiLineString>', 'MULTILINESTRING EMPTY'), ('<gml:MultiLineString><gml:lineStringMember/></gml:MultiLineString>', None), ('<gml:MultiLineString><gml:lineStringMember><gml:Point><gml:pos>31 29 16</gml:pos></gml:Point></gml:lineStringMember></gml:MultiLineString>', None), ('<gml:MultiCurve/>', 'MULTILINESTRING EMPTY'), ('<gml:MultiCurve><foo/></gml:MultiCurve>', 'MULTILINESTRING EMPTY'), ('<gml:MultiCurve><gml:curveMember/></gml:MultiCurve>', None), ('<gml:MultiCurve><gml:curveMember><foo/></gml:curveMember></gml:MultiCurve>', None), ('<gml:MultiCurve><gml:curveMember><gml:Curve/></gml:curveMember></gml:MultiCurve>', None), ('<gml:MultiCurve><gml:curveMember><gml:Curve><foo/></gml:Curve></gml:curveMember></gml:MultiCurve>', None), ('<gml:MultiCurve><gml:curveMember><gml:Curve><gml:Point><gml:pos>31 29 16</gml:pos></gml:Point></gml:Curve></gml:curveMember></gml:MultiCurve>', None), ('<gml:MultiCurve><gml:curveMembers></gml:curveMembers></gml:MultiCurve>', 'MULTILINESTRING EMPTY'), ('<gml:MultiCurve><gml:curveMembers><foo/></gml:curveMembers></gml:MultiCurve>', 'MULTILINESTRING EMPTY'), ('<gml:MultiCurve><gml:curveMembers><gml:LineString/></gml:curveMembers></gml:MultiCurve>', None), ('<gml:Curve/>', None), ('<gml:Curve><foo/></gml:Curve>', None), ('<gml:Curve><gml:segments/></gml:Curve>', 'LINESTRING EMPTY'), ('<gml:Curve><gml:segments><foo/></gml:segments></gml:Curve>', 'LINESTRING EMPTY'), ('<gml:Curve><gml:segments><gml:Point><gml:pos>31 29 16</gml:pos></gml:Point></gml:segments></gml:Curve>', 'LINESTRING EMPTY'), ('<gml:Arc/>', None), ('<gml:Arc><gml:posList>0 0 0 1</gml:posList></gml:Arc>', None), ('<gml:segments/>', 'LINESTRING EMPTY'), ('<gml:segments><foo/></gml:segments>', 'LINESTRING EMPTY'), ('<gml:segments><gml:LineStringSegment/></gml:segments>', 'LINESTRING EMPTY'), ('<gml:segments><gml:LineStringSegment><foo/></gml:LineStringSegment></gml:segments>', 'LINESTRING EMPTY'), ('<gml:segments><gml:LineStringSegment><gml:Point><gml:pos>31 29 16</gml:pos></gml:Point></gml:LineStringSegment></gml:segments>', 'LINESTRING EMPTY'), ('<gml:MultiGeometry/>', 'GEOMETRYCOLLECTION EMPTY'), ('<gml:MultiGeometry><foo/></gml:MultiGeometry>', 'GEOMETRYCOLLECTION EMPTY'), ('<gml:MultiGeometry><gml:geometryMember/></gml:MultiGeometry>', None), ('<gml:MultiGeometry><gml:geometryMember><foo/></gml:geometryMember></gml:MultiGeometry>', None), ('<gml:Surface/>', None), ('<gml:Surface><foo/></gml:Surface>', None), ('<gml:Surface><gml:patches/></gml:Surface>', None), ('<gml:Surface><gml:patches><foo/></gml:patches></gml:Surface>', None), ('<gml:Surface><gml:patches><gml:PolygonPatch/></gml:patches></gml:Surface>', None), ('<gml:Solid/>', None), ('<gml:Solid><foo/></gml:Solid>', None), ('<gml:Solid><gml:exterior/></gml:Solid>', None), ('<gml:Solid><gml:exterior><foo/></gml:exterior></gml:Solid>', None), ('<gml:Solid><gml:exterior><Polygon><exterior><LinearRing><posList>0 0 4 0 4 4 0 4 0 0</posList></LinearRing></exterior></Polygon></gml:exterior><gml:interior/></gml:Solid>', 'POLYGON ((0 0,4 0,4 4,0 4,0 0))'), ('<gml:OrientableSurface/>', None), ('<gml:OrientableSurface><foo/></gml:OrientableSurface>', None), ('<gml:OrientableSurface><gml:baseSurface/></gml:OrientableSurface>', None), ('<gml:OrientableSurface><gml:baseSurface><foo/></gml:baseSurface></gml:OrientableSurface>', None), ] for (gml, expected_wkt) in gml_expected_wkt_list: gdal.PushErrorHandler('CPLQuietErrorHandler') #print gml geom = ogr.CreateGeometryFromGML(gml) gdal.PopErrorHandler() if geom is None: if expected_wkt is not None: gdaltest.post_reason('did not get expected result for %s. Got None instead of %s' % (gml, expected_wkt)) return 'fail' else: wkt = geom.ExportToWkt() if expected_wkt is None: gdaltest.post_reason('did not get expected result for %s. Got %s instead of None' % (gml, wkt)) return 'fail' else: if wkt != expected_wkt: gdaltest.post_reason('did not get expected result for %s. Got %s instead of %s' % (gml, wkt, expected_wkt)) return 'fail' return 'success'
def gml_MultiSurface(): gml = """<gml:MultiSurface xmlns:gml="http://www.opengis.net/gml" srsName="foo"> <gml:surfaceMember> <gml:Surface> <gml:patches> <gml:PolygonPatch interpolation="planar"> <gml:exterior> <gml:LinearRing> <gml:posList>1 2 3 4 5 6 1 2</gml:posList> </gml:LinearRing> </gml:exterior> <gml:interior> <gml:LinearRing> <gml:posList>2 3 4 5 6 7 2 3</gml:posList> </gml:LinearRing> </gml:interior> <gml:interior> <gml:LinearRing> <gml:posList>3 4 5 6 7 8 3 4</gml:posList> </gml:LinearRing> </gml:interior> </gml:PolygonPatch> </gml:patches> </gml:Surface> </gml:surfaceMember> <gml:surfaceMember> <gml:Surface> <gml:patches> <gml:PolygonPatch interpolation="planar"> <gml:exterior> <gml:Ring> <gml:curveMember> <gml:Curve> <gml:segments> <gml:LineStringSegment> <gml:pos>4 5</gml:pos> <gml:pos>6 7</gml:pos> </gml:LineStringSegment> </gml:segments> </gml:Curve> </gml:curveMember> <gml:curveMember> <gml:Curve> <gml:segments> <gml:LineStringSegment> <gml:pos>8 9</gml:pos> <gml:pos>4 5</gml:pos> </gml:LineStringSegment> </gml:segments> </gml:Curve> </gml:curveMember> </gml:Ring> </gml:exterior> </gml:PolygonPatch> </gml:patches> </gml:Surface> </gml:surfaceMember> </gml:MultiSurface>""" geom = ogr.CreateGeometryFromGML( gml ) if 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)))': gdaltest.post_reason( '<gml:MultiSurface> not correctly parsed' ) print(geom.ExportToWkt()) return 'fail' return 'success'