private void GetGraphic(PoI p, ref StaticGraphic g) { g.Layer = this; g.Poi = p; switch (p.DrawingMode) { case DrawingModes.Point: if (p.Position != null) { var m = mercator.FromGeographic(p.Position.ToMapPoint()) as MapPoint; g.SetGeometry(m); //if (p.NEffectiveStyle.FillColor.HasValue) Debug.Assert(p.NEffectiveStyle.IconHeight != null, "NEffectiveStyle.IconHeight is null, should always have default value (PoIStyle.GetBasicStyle()). "); Debug.Assert(p.NEffectiveStyle.IconWidth != null, "NEffectiveStyle.IconWidth is null, should always have default value. (PoIStyle.GetBasicStyle())"); g.Symbol = new SimpleMarkerSymbol { Style = SimpleMarkerSymbol.SimpleMarkerStyle.Circle, Size = Math.Min((double)p.NEffectiveStyle.IconHeight, (double)Math.Min((double)p.NEffectiveStyle.IconWidth, (double)26.0))+4, Color = new SolidColorBrush(p.NEffectiveStyle.FillColor.Value) { Opacity = p.NEffectiveStyle.FillOpacity.Value }, }; } break; case DrawingModes.Image: if (p.Position != null) { var m = mercator.FromGeographic(p.Position.ToMapPoint()) as MapPoint; g.SetGeometry(m); } if (p.NEffectiveStyle.IconUri.OriginalString.ToLower().StartsWith("http")) { p.NEffectiveStyle.Picture = new BitmapImage(p.NEffectiveStyle.IconUri); } else { var s = Service.MediaFolder + p.NEffectiveStyle.Icon; if (service.store.HasFile(s)) { p.NEffectiveStyle.Picture = new BitmapImage(new Uri(s)); } } // When image not found display not_found image (so poi is visible on map) /* if (p.NEffectiveStyle.Picture == null) { p.NEffectiveStyle.Picture = LoadImageFromResource("csCommon.Resources.Icons.ImageNotFound.png"); } */ if (p.NEffectiveStyle.Picture != null && p.NEffectiveStyle.IconWidth != null) { g.Symbol = new PictureMarkerSymbol { Source = p.NEffectiveStyle.Picture, Width = p.NEffectiveStyle.IconWidth.Value, Height = p.NEffectiveStyle.IconHeight.Value, OffsetX = p.NEffectiveStyle.IconWidth.Value/2, OffsetY = p.NEffectiveStyle.IconHeight.Value/2, Opacity = p.NEffectiveStyle.FillOpacity.Value }; } break; case DrawingModes.Freehand: if (p.FillColor.A == 0) ConvertPointsToPolyline(p, g); else ConvertPointsToPolygon(p, g); break; case DrawingModes.Polyline: //CreateLineSymbol(p, g); g.Symbol = new SimpleLineSymbol { Width = p.NEffectiveStyle.StrokeWidth.Value, Color = new SolidColorBrush(p.NEffectiveStyle.StrokeColor.Value) { Opacity = p.NEffectiveStyle.StrokeOpacity.Value } }; ConvertPointsToPolyline(p, g); break; case DrawingModes.Polygon: g.Symbol = new SimpleFillSymbol { BorderBrush = new SolidColorBrush(p.NEffectiveStyle.StrokeColor.Value), BorderThickness = p.NEffectiveStyle.StrokeWidth.Value, Fill = new SolidColorBrush(p.NEffectiveStyle.FillColor.Value) { Opacity = p.NEffectiveStyle.FillOpacity.Value } }; if (p.Geometry != null) ConvertGeometryToPolygon(p, g); else ConvertPointsToPolygon(p, g); break; case DrawingModes.MultiPolygon: g.Symbol = new SimpleFillSymbol { BorderBrush = new SolidColorBrush(p.NEffectiveStyle.StrokeColor.Value), BorderThickness = p.NEffectiveStyle.StrokeWidth.Value, Fill = new SolidColorBrush(p.NEffectiveStyle.FillColor.Value) { Opacity = p.NEffectiveStyle.FillOpacity.Value } }; break; case DrawingModes.Circle: ConvertPointsToPolygon(p, g); break; } }
private new void AddPoi(PoI p) { try { p.UpdateAnalysisStyle(); if (string.IsNullOrEmpty(p.Layer) && p.PoiType != null) p.Layer = p.PoiType.Layer; var l = FindPoiLayer(p); if (!string.IsNullOrEmpty(p.PoiTypeId) && p.PoiType == null) p.PoiType = Service.PoITypes.FirstOrDefault(k => (k).ContentId == p.PoiTypeId) as PoI; if (p.PoiType == null) { p.PoiType = new PoI { StrokeColor = Colors.White, Service = service, StrokeWidth = 2, DrawingMode = DrawingModes.Polygon }; } if (p.Data == null) p.Data = new Dictionary<string, object>(); p.Data["layer"] = this; var g = new StaticGraphic { Service = Service, Poi = p }; if (p.DrawingMode == DrawingModes.MultiPolygon) { var converted = p.WktText.ConvertFromWkt(); if (converted is MultiPolygon) { // NOTE Others have not been implemented, such as MultiPoint or Path var mp = converted as MultiPolygon; var gs = new List<StaticGraphic>(); foreach (var poly in mp.Polygons) { g = new StaticGraphic {Service = Service, Poi = p}; ConvertPolygonToGraphic(poly, g); g.Layer = this; g.Poi = p; g.Symbol = new SimpleFillSymbol { BorderBrush = new SolidColorBrush(p.NEffectiveStyle.StrokeColor.Value), BorderThickness = p.NEffectiveStyle.StrokeWidth.Value, Fill = new SolidColorBrush(p.NEffectiveStyle.FillColor.Value) { Opacity = p.NEffectiveStyle.FillOpacity.Value } }; l.Graphics.Add(g); gs.Add(g); } p.Data["graphics"] = gs; } else if (converted is MultiLineString) { var ml = converted as MultiLineString; var gs = new List<StaticGraphic>(); foreach (var line in ml.Lines) { g = new StaticGraphic { Service = Service, Poi = p }; ConvertPolylineToGraphic(line, g); g.Layer = this; g.Poi = p; g.Symbol = new SimpleFillSymbol { BorderBrush = new SolidColorBrush(p.NEffectiveStyle.StrokeColor.Value), BorderThickness = p.NEffectiveStyle.StrokeWidth.Value, Fill = new SolidColorBrush(p.NEffectiveStyle.FillColor.Value) { Opacity = p.NEffectiveStyle.FillOpacity.Value } }; l.Graphics.Add(g); gs.Add(g); } p.Data["graphics"] = gs; } } else { g = new StaticGraphic { Service = Service, Poi = p }; g.SetZIndex(p.ZIndex); GetGraphic(p, ref g); l.Graphics.Add(g); p.Data["graphic"] = g; } p.PositionChanged += p_PositionChanged; var height = p.NEffectiveStyle.IconHeight == null ? 32 : p.NEffectiveStyle.IconHeight.Value; var width = p.NEffectiveStyle.IconWidth == null ? 32 : p.NEffectiveStyle.IconWidth.Value; if (p.NEffectiveStyle.DrawingMode.Value == DrawingModes.Point) { if (!string.IsNullOrEmpty(p.NEffectiveStyle.Icon)) { //var ig = new StaticGraphic {Poi = p, Geometry = g.Geometry, Service = Service}; var ig = new Graphic { Geometry = g.Geometry }; if (p.NEffectiveStyle.IconUri.OriginalString.StartsWith("http", StringComparison.InvariantCultureIgnoreCase)) { p.NEffectiveStyle.Picture = new BitmapImage(p.NEffectiveStyle.IconUri); } else { var s = Service.MediaFolder + p.NEffectiveStyle.Icon; ig.Attributes["staticgraphic"] = g; if (service.store.HasFile(s)) { p.NEffectiveStyle.Picture = new BitmapImage(new Uri(s)); } } // When image not found display not_found image (so poi is visible on map) /* if (p.NEffectiveStyle.Picture == null) { p.NEffectiveStyle.Picture = LoadImageFromResource("csCommon.Resources.Icons.ImageNotFound.png"); } */ //Fix by Jeroen: Invalid bitmap, don't add if (p.NEffectiveStyle.Picture == null) return; var sym = new PictureMarkerSymbol { Source = p.NEffectiveStyle.Picture, Width = width, Height = height, OffsetX = width / 2, OffsetY = height / 2, }; if (p.Position != null ) sym.Angle = p.Position.Course; ig.Symbol = sym; l.Graphics.Add(ig); ig.MouseLeftButtonDown += (e, st) => g.PoiGraphic_MouseLeftButtonDown(e, st); ig.MouseLeftButtonUp += (e, st) => g.PoiGraphic_MouseLeftButtonUp(e, st); g.ImageGraphic = ig; } } if (p.NEffectiveStyle.TitleMode.HasValue && p.NEffectiveStyle.TitleMode.Value != TitleModes.None) { var sym = new TextSymbol { Text = p.Labels.ContainsKey(p.NEffectiveStyle.NameLabel) ? p.Labels[p.NEffectiveStyle.NameLabel] : string.Empty, FontSize = 12, Foreground = Brushes.Black, //OffsetX = -p.Name.Length * 24, OffsetY = height / -2 }; var tg = new Graphic { Geometry = g.BaseGeometry, Symbol = sym }; tg.Attributes["staticgraphic"] = g; l.Graphics.Add(tg); g.LabelGraphic = tg; } if (!string.IsNullOrEmpty(p.InnerText)) { var sym = new TextSymbol { Text = p.InnerText, FontSize = 16, Foreground = new SolidColorBrush(p.NEffectiveStyle.InnerTextColor.Value), OffsetX = (p.InnerText.Length * 5.0), OffsetY = 8, FontWeight = FontWeights.ExtraBold }; if (p.DrawingMode == DrawingModes.Line || p.DrawingMode == DrawingModes.Polyline) { var p0 = p.Points[0]; var p1 = p.Points[1]; var xdelta = (p1.X - p0.X); var ydelta = (p1.Y - p0.Y); const double rad2Deg = 180.0 / Math.PI; var angle = rad2Deg * Math.Atan2(xdelta, ydelta); sym.OffsetX -= 10 * Math.Cos(angle / rad2Deg); sym.OffsetY -= 10 * Math.Sin(angle / rad2Deg); //angle = (angle + 360.0)%360.0; ////Item is either N or S //if ((angle < 20 || angle > 340) || (angle > 160 && angle < 200)) // sym.OffsetY += 10; ////Item is either NW or SW or NE or SE //else if ((angle > 20 && angle < 70) || (angle > 200 && angle < 250)) //{ // sym.OffsetX += 10; // sym.OffsetY += 10; //} ////Item is either W or E //else if ((angle > 70 && angle < 110) || (angle > 250 && angle < 290)) // sym.OffsetX += 10; ////Item is either NW or SW or NE or SE //else if ((angle > 110 && angle < 160) || (angle > 290 && angle < 340)) //{ // sym.OffsetX += 10; // sym.OffsetY += 10; //} //// else glabel = "dunno!"; } var tg = new Graphic { Geometry = g.BaseGeometry, Symbol = sym }; tg.MouseLeftButtonDown += (e, st) => g.PoiGraphic_MouseLeftButtonDown(e, st); l.Graphics.Add(tg); g.InnerTextGraphic = tg; } g.UpdateScale(); base.AddPoi(p); //p.UpdateAnalysisStyle(); } catch (Exception e) { LogCs.LogException("dsStaticLayer.AddPoi: Exception adding poi icon on map (causes strange behaviour of poi icon (missing eventhandler etc.)) ", e); Logger.Log("dsStaticLayer.AddPoi", "Error adding graphic", e.Message, Logger.Level.Error); } }