protected override void UpdateData() { var geometry = (RectangleGeometry)Data; if (ParentMap != null && !double.IsNaN(South) && !double.IsNaN(North) && !double.IsNaN(West) && !double.IsNaN(East) && South < North && West < East) { // Create a scaled RectangleGeometry due to inaccurate hit testing in WPF. // See http://stackoverflow.com/a/19335624/1136211 const double scale = 1e6; var p1 = ParentMap.MapTransform.Transform(new Location(South, West)); var p2 = ParentMap.MapTransform.Transform(new Location(North, East)); geometry.Rect = new Rect(p1.X * scale, p1.Y * scale, (p2.X - p1.X) * scale, (p2.Y - p1.Y) * scale); var scaleTransform = new ScaleTransform // revert scaling { ScaleX = 1d / scale, ScaleY = 1d / scale }; scaleTransform.Freeze(); var transform = new TransformGroup(); transform.Children.Add(scaleTransform); transform.Children.Add(ParentMap.ViewportTransform); RenderTransform = transform; } else { geometry.ClearValue(RectangleGeometry.RectProperty); ClearValue(RenderTransformProperty); } }