public static GisShapeBase ToShape(IGeometry geometry, IEnumerable<object> data, LayerVector layer) { if (geometry == null) throw new Exception("Cannot convert a null geometry"); GisShapeBase result; if (geometry is ScreenPoint) { var p = geometry as ScreenPoint; result = new GisShapePoint(layer); ((GisShapePoint)result).Point.X = p.X; ((GisShapePoint)result).Point.Y = p.Y; } else if (geometry is LineString) { var p = geometry as LineString; result = new GisShapeArc(layer); foreach (var c in p.Coordinates) { ((GisShapeArc)result).Points.Add(new GisPoint(c.X, c.Y)); } } else if (geometry is Polygon) { var p = geometry as Polygon; result = new GisShapePolygon(layer); foreach (var c in p.Coordinates) { ((GisShapePolygon)result).Points.Add(new GisPoint(c.X, c.Y)); } foreach (var ir0 in p.InteriorRings) { var ir1 = new Collection<GisPoint>(); ((GisShapePolygon)result).InteriorRings.Add(ir1); foreach (var c in ir0.Coordinates) { ir1.Add(new GisPoint(c.X, c.Y)); } } } else if (geometry is MultiPolygon) { var p = geometry as MultiPolygon; result = new GisShapeMultiPolygon(layer); foreach (var g in p.Geometries) { var child = new GisShapeMultiPolygon.PolygonGeometry(); ((GisShapeMultiPolygon)result).Geometries.Add(child); foreach (var c in g.Coordinates) { child.Points.Add(new GisPoint(c.X, c.Y)); } foreach (var ir0 in ((Polygon)g).InteriorRings) { var ir1 = new Collection<GisPoint>(); child.InteriorRings.Add(ir1); foreach (var c in ir0.Coordinates) { ir1.Add(new GisPoint(c.X, c.Y)); } } } } else { throw new NotImplementedException("Other geometries are not implemented"); } int i = 0; foreach(var d in data) { string key = layer.Fields[i].Name; result[key] = d; i++; } return result; }
/// <summary> /// Creates a new instance of the <see cref="GisShapePoint"/> /// </summary> public GisShapePoint(LayerVector ll) : base(ll) { _point = new GisPoint(); _point.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(_point_PropertyChanged); }
/// <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; }
public GisShapeMultiPolygon(LayerVector layer) : base(layer) { }
/// <summary> /// Creates a new instance of the <see cref="GisShapeBase"/> /// </summary> public GisShapeBase(LayerVector layer) { //PropertyChanged = (s, e) => { }; Layer = layer; }
/// <summary> /// Populates the types cache /// </summary> private void PopulateTypes(LayerVector ll) { _types = new Dictionary<string, GisFieldType>(); for (int i = 0; i < ll.Fields.Count; i++) { _types.Add(ll.Fields[i].Name, ll.Fields[i].FieldType); } }