public void ParseGetFeaturesTest() { var assembly = Assembly.GetExecutingAssembly(); var resourceName = "SharpMap.Pcl.Tests.SampleData.getfeatures_sample.xml"; string gml; using (Stream stream = assembly.GetManifestResourceStream(resourceName)) using (var reader = new StreamReader(stream)) { gml = reader.ReadToEnd(); } var provider = new SharpMap.GmlUtils.GmlProvider(gml); var geometries = provider.Shapes; Assert.AreEqual(87, geometries.Count); }
/// <summary> /// Returns a list of shapes contained in the passed GML string /// </summary> /// <param name="gml">GML string</param> /// <param name="layer">Layer where to load features</param> /// <param name="extent">extent of the shapes</param> /// <returns>List of shapes</returns> public static GisShapeCollection GetShapes(string gml, LayerVector layer, out Extent extent) { var res = new GisShapeCollection(); res.Name = layer.Name; var slayer = new List<string>(); foreach (LayerField t in layer.Fields) { slayer.Add(t.Name); } var provider = new SharpMap.GmlUtils.GmlProvider(gml, slayer); if (provider.Shapes == null) { extent = new Extent(provider.Extent.MinX,provider.Extent.MinY,provider.Extent.MaxX,provider.Extent.MaxY); return res; } for (int i = 0; i < provider.Shapes.Count; i++) { var shpOrig = provider.Shapes[i]; GisShapeBase shpDest = layer.CreateShape(); if (shpDest is GisShapePoint) { (shpDest as GisShapePoint).Point.X = (shpOrig.Geometry as Point).X; (shpDest as GisShapePoint).Point.Y = (shpOrig.Geometry as Point).Y; } else if (shpDest is GisShapeArc) { for (int j=0; j<(shpOrig.Geometry as LineString).Coordinates.Length; j++) { var p = new GisPoint(); p.X = (shpOrig.Geometry as LineString).Coordinates[j].X; p.Y = (shpOrig.Geometry as LineString).Coordinates[j].Y; (shpDest as GisShapeArc).Points.Add(p); } } else if (shpDest is GisShapeMultiPoint) { for (int j = 0; j < (shpOrig.Geometry as MultiPoint).Geometries.Length; j++) { var p = new GisPoint(); p.X = ((shpOrig.Geometry as MultiPoint).Geometries[j] as IPoint).X; p.Y = ((shpOrig.Geometry as MultiPoint).Geometries[j] as IPoint).Y; (shpDest as GisShapeMultiPoint).Points.Add(p); } } else if (shpDest is GisShapePolygon) { for (int j = 0; j < (shpOrig.Geometry as Polygon).ExteriorRing.Coordinates.Length; j++) { var p = new GisPoint(); p.X = (shpOrig.Geometry as Polygon).ExteriorRing.Coordinates[j].X; p.Y = (shpOrig.Geometry as Polygon).ExteriorRing.Coordinates[j].Y; (shpDest as GisShapePolygon).Points.Add(p); } } shpDest.UID = shpOrig.UID; shpDest.IsSelected = shpOrig.IsSelected; IEnumerable<string> keys = shpOrig.Keys; foreach(string key in keys) { shpDest[key] = shpOrig[key]; } if (shpDest != null) res.Add(shpDest); } if (provider.Extent != null) extent = new Extent(provider.Extent.MinX, provider.Extent.MinY, provider.Extent.MaxX, provider.Extent.MaxY); else extent = new Extent(); return res; }
/// <summary> /// Returns a list of features contained in the passed GML string /// </summary> /// <param name="gml">GML string</param> /// <param name="extent">extent of the shapes</param> /// <returns>List of features</returns> /// <remarks>Because the layer is not passed, all fields are treated as strings</remarks> public static GisShapeCollection GetShapes(string gml, out Extent extent) { var res = new GisShapeCollection(); res.Name = ""; var provider = new SharpMap.GmlUtils.GmlProvider(gml); if (provider.Shapes == null) { extent = new Extent(provider.Extent.MinX, provider.Extent.MinY, provider.Extent.MaxX, provider.Extent.MaxY); return res; } for (int i = 0; i < provider.Shapes.Count; i++) { var shpOrig = provider.Shapes[i]; GisShapeBase shpDest = null; if (shpOrig.Geometry is IPoint) { shpDest = CreateShape(GisShapeType.GisShapeTypePoint); (shpDest as GisShapePoint).Point.X = (shpOrig.Geometry as Point).X; (shpDest as GisShapePoint).Point.Y = (shpOrig.Geometry as Point).Y; } else if (shpOrig.Geometry is ILineString) { shpDest = CreateShape(GisShapeType.GisShapeTypeArc); for (int j = 0; j < (shpOrig.Geometry as LineString).Coordinates.Length; j++) { var p = new GisPoint(); p.X = (shpOrig.Geometry as LineString).Coordinates[j].X; p.Y = (shpOrig.Geometry as LineString).Coordinates[j].Y; (shpDest as GisShapeArc).Points.Add(p); } } else if (shpOrig.Geometry is IMultiPoint) { shpDest = CreateShape(GisShapeType.GisShapeTypeMultiPoint); for (int j = 0; j < (shpOrig.Geometry as MultiPoint).Geometries.Length; j++) { var p = new GisPoint(); p.X = ((shpOrig.Geometry as MultiPoint).Geometries[j] as IPoint).X; p.Y = ((shpOrig.Geometry as MultiPoint).Geometries[j] as IPoint).Y; (shpDest as GisShapeMultiPoint).Points.Add(p); } } else if (shpOrig.Geometry is IPolygon) { shpDest = CreateShape(GisShapeType.GisShapeTypePolygon); for (int j = 0; j < (shpOrig.Geometry as Polygon).ExteriorRing.Coordinates.Length; j++) { var p = new GisPoint(); p.X = (shpOrig.Geometry as Polygon).ExteriorRing.Coordinates[j].X; p.Y = (shpOrig.Geometry as Polygon).ExteriorRing.Coordinates[j].Y; (shpDest as GisShapePolygon).Points.Add(p); } } shpDest.UID = shpOrig.UID; shpDest.IsSelected = shpOrig.IsSelected; var keys = shpOrig.Keys; shpDest.PopulateTypes(keys); foreach (string key in keys) { shpDest[key] = shpOrig[key]; } if (shpDest != null) res.Add(shpDest); } if (provider.Extent != null) extent = new Extent(provider.Extent.MinX, provider.Extent.MinY, provider.Extent.MaxX, provider.Extent.MaxY); else extent = new Extent(); return res; }