/// <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; }
/// <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; }
void GetFeaturesCompleted(object sender, DownloadStringCompletedEventArgs e) { GisShapeCollection features = new GisShapeCollection(); try { XDocument doc; var settings = new XmlReaderSettings(); settings.DtdProcessing = DtdProcessing.Ignore; using (XmlReader reader = XmlReader.Create(new StringReader(e.Result), settings)) { doc = XDocument.Load(reader); } var docRoot = doc.Element("rss"); if (docRoot == null) return; var xchannel = docRoot.Element("channel"); if (xchannel == null) return; Title = xchannel.Element("title") != null ? xchannel.Element("title").Value : ""; Link = xchannel.Element("link") != null ? xchannel.Element("link").Value : ""; Description = xchannel.Element("description") != null ? xchannel.Element("description").Value : ""; Author = xchannel.Element("author") != null ? xchannel.Element("author").Value : ""; Updated = xchannel.Element("updated") != null ? Parser.StringAsDateTime(xchannel.Element("updated").Value) : DateTime.MinValue; var ximage = xchannel.Element("image"); if (ximage != null) { ImageUrl = ximage.Element("url") != null ? ximage.Element("url").Value : ""; ImageLink = ximage.Element("link") != null ? ximage.Element("link").Value : ""; ImageTitle = ximage.Element("title") != null ? ximage.Element("title").Value : ""; ImageHeight = ximage.Element("height") != null ? Parser.StringAsInteger(ximage.Element("height").Value, 0) : 0; ImageWidth = ximage.Element("width") != null ? Parser.StringAsInteger(ximage.Element("width").Value, 0) : 0; } var xitems = xchannel.Descendants("item"); if (xitems == null) return; foreach (XElement xitem in xitems) { GisShapePoint p = new GisShapePoint(null); var keys = new Collection<string>(); keys.Add("magnitudo"); keys.Add("date"); keys.Add("link"); keys.Add("depth"); keys.Add("title"); keys.Add("description"); p.PopulateTypes(keys); string title = xitem.Element("title") != null ? xitem.Element("title").Value : ""; p["title"] = title; string link = xitem.Element("link") != null ? xitem.Element("link").Value : ""; p["link"] = link; string description = xitem.Element("description") != null ? xitem.Element("description").Value : ""; p["description"] = description; /*Esempio description: <a href='http://cnt.rm.ingv.it/data_id/7232002670/event.html'><img width='225' height='225' border='0' src='http://cnt.rm.ingv.it/data_id/7232002670/map_loc_t.jpg' alt='epicentro evento' align='left' /></a><p style='color: #333333;font: 14;line-height: 28'> ID: 7232002670<br /> Data: 10/02/2014 07.07.40<br /> Magnitudo: 2.0<br /> Distretto: France<br /> Lat: 45.336 - Lon: 6.543<br /> Profondità: 10.0 km</p> */ if ((description.Contains("Lon: ")) && (description.Contains("Lat: "))) { int indexId0 = description.IndexOf(@"http://cnt.rm.ingv.it/data_id/"); int indexId1 = description.IndexOf(@"/event", indexId0); String sid = description.Substring(indexId0 + 30, indexId1 - indexId0 - 30); Int64 id; Int64.TryParse(sid, out id); p.UID = id; int indexLon0 = description.IndexOf("Lon: "); int indexLon1 = description.IndexOf("<br", indexLon0); String sLon = description.Substring(indexLon0 + 10, indexLon1-indexLon0 - 10); int indexLat0 = description.IndexOf("Lat: "); int indexLat1 = description.IndexOf(" -", indexLat0); String sLat = description.Substring(indexLat0 + 10, indexLat1-indexLat0-10); p.Point.Y = Parser.StringAsDouble(sLat, -1); p.Point.X = Parser.StringAsDouble(sLon, -1); int indexMagnitudo0 = description.IndexOf("Magnitudo: "); int indexMagnitudo1 = description.IndexOf("<br", indexMagnitudo0); String magnitudo = description.Substring(indexMagnitudo0 + 16, indexMagnitudo1-indexMagnitudo0-16); p["magnitudo"] = magnitudo; int indexData0 = description.IndexOf("Data: "); int indexData1 = description.IndexOf("<br", indexData0); String date = description.Substring(indexData0 + 11, indexData1 -indexData0 -11); p["date"] = date; } features.Add(p); } } catch (Exception ex) { throw; } finally { BusyState = false; if (OnGetFeaturesCompleted != null) OnGetFeaturesCompleted(sender, new FeaturesEventArgs(features)); } }