Ejemplo n.º 1
0
        private MemoryLayer GetPoiLayer(Route route)
        {
            var layer = new MemoryLayer
            {
                DataSource = new MemoryProvider(
                    route.Waypoints
                    .OfType <PointOfInterest>()
                    .ToList()
                    .Select(poi => new Feature
                {
                    Geometry = SphericalMercator.FromLonLat(poi.Longitude, poi.Latitude)
                })
                    ),
                IsMapInfoLayer = true,
                Style          = new SymbolStyle
                {
                    BitmapId     = GetBitmapIdForEmbeddedResource("FamilieWandelPad.RouteImager.Assets.Pin.svg"),
                    SymbolScale  = 1d,
                    SymbolOffset = new Offset(0.0, 0.5, true),
                    Enabled      = true
                }
            };

            return(layer);
        }
Ejemplo n.º 2
0
    public IEnumerator SingleMemoryRequest()
    {
        int testAddress = 0;

        // create two mock layers
        MemoryLayer upperLayer = MockLayer(new Vector3(50, 0, 50));
        MemoryLayer lowerLayer = MockLayer(new Vector3(0, 0, 50));

        // release for a frame so that start can be called on the layers
        yield return(null);

        // associate the layers with eachother
        upperLayer.layerBelow = lowerLayer;
        lowerLayer.layerAbove = upperLayer;

        // set the layer latencies to 1 which will make the packets arrive in a single update
        upperLayer.layerLatency = 1;
        lowerLayer.layerLatency = 1;

        // add some memory addresses to the upper layer
        upperLayer.AddMemoryLocation(testAddress);

        // make some requests on the lower layer
        lowerLayer.MakeRequest(testAddress);

        // wait until the request has been fulfilled
        yield return(new WaitForSeconds(1));

        // Check that the lower layer now has the address in its list
        Assert.IsTrue(lowerLayer.CheckForAddress(testAddress) >= 0);
    }
Ejemplo n.º 3
0
        private static ILayer CreateMutatingTriangleLayer(BoundingBox envelope)
        {
            var layer = new MemoryLayer();

            var polygon = new Polygon(new LinearRing(GenerateRandomPoints(envelope, 3)));
            var feature = new Feature()
            {
                Geometry = polygon
            };
            var features = new Features();

            features.Add(feature);

            layer.DataSource = new MemoryProvider(features);

            PeriodicTask.Run(() =>
            {
                polygon.ExteriorRing = new LinearRing(GenerateRandomPoints(envelope, 3));
                // Clear cache for change to show
                feature.RenderedGeometry.Clear();
                // Trigger DataChanged notification
                layer.RefreshData(layer.Envelope, 1, true);
            },
                             TimeSpan.FromMilliseconds(1000));

            return(layer);
        }
Ejemplo n.º 4
0
 private static void CarsLayerUpdate(MapControl myMapControl)
 {
     if (carsLayer == null)
     {
         var feature = new Feature
         {
             Geometry = new MultiPoint(carsMapPoints)
         };
         var provider = new MemoryProvider(feature);
         carsLayer = new MemoryLayer
         {
             DataSource = provider,
             Style      = new SymbolStyle
             {
                 Fill        = new Brush(new Color(0, 0, 0)),
                 SymbolScale = 0.25
             }
         };
         myMapControl.Map.Layers.Add(carsLayer);
     }
     else
     {
         carsLayer.DataSource = new MemoryProvider(
             new Feature
         {
             Geometry = new MultiPoint(carsMapPoints)
         });
         myMapControl.Refresh();
         //carsLayer.ClearCache();
         carsLayer.RefreshData(carsLayer.Envelope, 1, true); //.ViewChanged(true, carsLayer.Envelope, 1);
     }
 }
Ejemplo n.º 5
0
        private void Map1_MapClick(object sender, SlimGis.MapKit.WinForms.MapMouseEventArgs e)
        {
            // We added a ShapefileLayer in the Loaded event,
            // it's default name is the name of the shapefile.
            // so here, we could find the layer back by the shapefile name without extension.
            FeatureLayer featureLayer      = Map1.FindLayer <FeatureLayer>("countries-900913");
            Feature      identifiedFeature = IdentifyHelper.Identify(featureLayer, e.WorldCoordinate, Map1.CurrentScale, Map1.MapUnit).FirstOrDefault();

            MemoryLayer dynamicLayer = Map1.FindLayer <MemoryLayer>("Highlight Layer");

            if (dynamicLayer == null)
            {
                dynamicLayer = new MemoryLayer {
                    Name = "Highlight Layer"
                };
                dynamicLayer.UseRandomStyle();
                Map1.AddStaticLayers("HighlightOverlay", dynamicLayer);
            }

            dynamicLayer.Features.Clear();
            if (identifiedFeature != null)
            {
                dynamicLayer.Features.Add(identifiedFeature);
            }

            Map1.Overlays["HighlightOverlay"].Refresh();
        }
Ejemplo n.º 6
0
        private void Map1_Loaded(object sender, RoutedEventArgs e)
        {
            Map1.MapUnit = GeoUnit.Meter;
            Map1.UseOpenStreetMapAsBaseMap();

            GeoLine greatCircle = CreateGreatCircle();

            MemoryLayer baselineLayer = new MemoryLayer {
                Name = "BaseLineLayer"
            };

            baselineLayer.Styles.Add(new LineStyle(GeoColors.White, 8));
            baselineLayer.Styles.Add(new LineStyle(GeoColor.FromHtml("#88FAB04D"), 4));
            baselineLayer.Features.Add(new Feature(greatCircle));
            Map1.AddStaticLayers(baselineLayer);

            Stream airplaneIconStream = Application.GetResourceStream(new Uri("/SlimGis.WpfSamples;component/Images/airplane.png", UriKind.RelativeOrAbsolute)).Stream;

            MemoryLayer highlightLayer = new MemoryLayer {
                Name = "HighlightLayer"
            };

            highlightLayer.Styles.Add(new LineStyle(GeoColor.FromHtml("#9903A9F4"), 4));
            highlightLayer.Styles.Add(new IconStyle(new GeoImage(airplaneIconStream))
            {
                AspectRatio = 0.6667
            });
            Map1.AddDynamicLayers("HighlightOverlay", highlightLayer);

            GeoBound bound = baselineLayer.GetBound();

            bound.ScaleUp(25);
            Map1.ZoomTo(bound);
        }
Ejemplo n.º 7
0
        public void CopyToAfterRemovingItem()
        {
            // arrange
            var layerCollection = new LayerCollection();
            var layer1          = new MemoryLayer();
            var layer2          = new MemoryLayer();

            layerCollection.Add(layer1);
            layerCollection.Add(layer2);

            var size  = layerCollection.Count();
            var array = new ILayer[size];

            layerCollection.Remove(layer1);

            // act
            layerCollection.CopyTo(array, 0);

            // assert
            Assert.AreEqual(2, array.Length);
            Assert.NotNull(array[0], "first element not null");
            // We have no crash but the seconds element is null.
            // This might have unpleasant consequences.
            Assert.Null(array[1], "second element IS null");
        }
Ejemplo n.º 8
0
        public void IgnoringDisabledLayers()
        {
            // arrange
            var map = new Map();

            map.Viewport.Resolution = 1;
            map.Viewport.Width      = 10;
            map.Viewport.Height     = 10;
            map.Viewport.Center     = new Point(5, 5);

            var disabledLayer = new MemoryLayer
            {
                Name       = "TestLayer",
                DataSource = new MemoryProvider(CreatePolygon(1, 3)),
                Enabled    = false
            };

            map.Layers.Add(disabledLayer);
            map.InfoLayers.Add(disabledLayer);

            var screenPositionHit = map.Viewport.WorldToScreen(2, 2);

            // act
            var argsHit = InfoHelper.GetInfoEventArgs(map.Viewport, screenPositionHit, map.InfoLayers, null);

            // assert;
            Assert.IsTrue(argsHit.Feature == null);
            Assert.IsTrue(argsHit.Layer == null);
            Assert.IsTrue(argsHit.WorldPosition.Equals(new Point(2, 2)));
        }
Ejemplo n.º 9
0
        public void MoveAfterIndex()
        {
            // arrange
            var layerCollection = new LayerCollection();
            var layer1          = new MemoryLayer()
            {
                Name = "Layer1"
            };
            var layer2 = new MemoryLayer()
            {
                Name = "Layer2"
            };
            var layer3 = new MemoryLayer()
            {
                Name = "Layer3"
            };

            layerCollection.Add(layer1);
            layerCollection.Add(layer2);
            layerCollection.Add(layer3);

            // act
            layerCollection.Move(3, layer1);

            // assert
            var list = layerCollection.ToList();

            Assert.AreEqual(3, list.Count());
            Assert.NotNull(list[0]);
            Assert.AreEqual("Layer2", list[0].Name);
            Assert.NotNull(list[1]);
            Assert.AreEqual("Layer3", list[1].Name);
            Assert.NotNull(list[2]);
            Assert.AreEqual("Layer1", list[2].Name);
        }
Ejemplo n.º 10
0
        public void InsertAfterRemoving()
        {
            // arrange
            var layerCollection = new LayerCollection();
            var layer1          = new MemoryLayer()
            {
                Name = "Layer1"
            };
            var layer2 = new MemoryLayer()
            {
                Name = "Layer2"
            };
            var layer3 = new MemoryLayer()
            {
                Name = "Layer3"
            };

            layerCollection.Add(layer1);
            layerCollection.Add(layer2);

            layerCollection.Remove(layer1);

            // act
            layerCollection.Insert(1, layer3);

            // assert
            var list = layerCollection.ToList();

            Assert.AreEqual(2, list.Count());
            Assert.NotNull(list[0]);
            Assert.AreEqual("Layer2", list[0].Name);
            Assert.NotNull(list[1]);
            Assert.AreEqual("Layer3", list[1].Name);
        }
Ejemplo n.º 11
0
        private void Map1_Loaded(object sender, RoutedEventArgs e)
        {
            Map1.MapUnit = GeoUnit.Meter;
            Map1.UseOpenStreetMapAsBaseMap();

            ShapefileLayer sectionLayer = new ShapefileLayer("SampleData/sections-900913.shp");

            sectionLayer.Styles.Add(new FillStyle(GeoColors.Transparent, GeoColor.FromHtml("#99FAB04D"), 1));
            Map1.AddStaticLayers("SectionOverlay", sectionLayer);

            GeoBound sectionBound = sectionLayer.GetBound();
            GeoBound queryArea    = (GeoBound)sectionBound.Clone();

            queryArea.ScaleDown(60);

            MemoryLayer queryAreaLayer = new MemoryLayer {
                Name = "QueryAreaLayer"
            };

            queryAreaLayer.Styles.Add(new FillStyle(GeoColors.Transparent, GeoColor.FromHtml("#9900BCD4"), 4));
            queryAreaLayer.Features.Add(new Feature(queryArea));
            Map1.AddStaticLayers("SectionOverlay", queryAreaLayer);

            MemoryLayer highlightLayer = new MemoryLayer {
                Name = "HighlightLayer"
            };

            highlightLayer.Styles.Add(new FillStyle(GeoColor.FromHtml("#66FFFF00"), GeoColors.White));
            Map1.AddDynamicLayers("HighlightOverlay", highlightLayer);

            Map1.ZoomTo(sectionLayer.GetBound());
        }
        private void Map1_Loaded(object sender, RoutedEventArgs e)
        {
            Map1.MapUnit = GeoUnit.Meter;
            Map1.UseOpenStreetMapAsBaseMap();

            ShapefileSource dataSource = new ShapefileSource("SampleData/countries-900913.shp");

            dataSource.Open();
            highlightFeature = dataSource.GetFeatureById("1", RequireColumnsType.None);

            GeoBound highlightBound = highlightFeature.GetBound();

            highlightBoundFeature = new Feature(highlightBound);

            MemoryLayer highlightLayer = new MemoryLayer()
            {
                Name = "HighlightLayer"
            };

            highlightLayer.Features.Add(highlightFeature);
            highlightLayer.Features.Add(highlightBoundFeature);
            highlightLayer.Styles.Add(new FillStyle(GeoColor.FromHtml("#55FAB04D")));
            highlightLayer.Styles.Add(new LineStyle(GeoColor.FromHtml("#00BCD4"), 4));
            Map1.AddStaticLayers("HighlightOverlay", highlightLayer);

            MemoryLayer resultLayer = new MemoryLayer {
                Name = "ResultLayer"
            };

            resultLayer.Styles.Add(new FillStyle(GeoColor.FromHtml("#55FAB04D"), GeoColors.White));
            Map1.AddDynamicLayers("ResultOverlay", resultLayer);

            Map1.ZoomTo(highlightFeature);
        }
Ejemplo n.º 13
0
        public static Map CreateMap()
        {
            var assembly = typeof(PolygonSample).GetTypeInfo().Assembly;
            var image    = assembly.GetManifestResourceStream("Mapsui.Tests.Common.Resources.Images.avion_silhouette.png");

            _bitmapId = BitmapRegistry.Instance.Register(image);

            var map = new Map
            {
                BackColor = Color.Transparent,
                Viewport  =
                {
                    Center     = new Point(0, 0),
                    Width      =         600,
                    Height     =         400,
                    Resolution = 63000
                }
            };

            var layer = new MemoryLayer
            {
                DataSource = CreatePolygonProvider(),
                Name       = "Polygon"
            };

            map.Layers.Add(layer);
            return(map);
        }
Ejemplo n.º 14
0
        private async Task MoveLine(MemoryLayer highlightLayer, GeoLine baseline, double percentageRatio, int i, bool reverse = false)
        {
            GeoLine line = await Task.Run(() => (GeoLine)baseline.GetSegmentation((float)percentageRatio *i));

            highlightLayer.Features.Clear();

            if (line != null)
            {
                highlightLayer.Features.Add(new Feature(line));

                GeoCoordinate currentPoint = line.Coordinates.Last();
                highlightLayer.Features.Add(new Feature(new GeoPoint(currentPoint)));
                if (line.Coordinates.Count > 1)
                {
                    GeoCoordinate previousPoint = line.Coordinates.ElementAt(line.Coordinates.Count - 2);
                    double        angle         = Math.Atan2(currentPoint.Y - previousPoint.Y, currentPoint.X - previousPoint.X);
                    float         degree        = (float)(angle * 180 / Math.PI);
                    if (reverse)
                    {
                        degree = degree + 180;
                    }
                    highlightLayer.Styles.OfType <IconStyle>().First().Rotation = degree;
                }
            }
            Map1.Refresh("HighlightOverlay");

            await Task.Run(() => Thread.Sleep(50));
        }
        private void Map1_Loaded(object sender, RoutedEventArgs e)
        {
            Map1.MapUnit = GeoUnit.Meter;
            Map1.UseOpenStreetMapAsBaseMap();

            ShapefileSource dataSource = new ShapefileSource("SampleData/countries-900913.shp");

            dataSource.Open();
            feature1 = dataSource.GetFeatureById("1", RequireColumnsType.None);
            feature2 = dataSource.GetFeatureById("10", RequireColumnsType.None);

            MemoryLayer highlightLayer = new MemoryLayer();

            highlightLayer.Features.Add(feature1);
            highlightLayer.Features.Add(feature2);
            highlightLayer.Styles.Add(new FillStyle(GeoColor.FromHtml("#55FAB04D")));
            Map1.AddStaticLayers("HighlightOverlay", highlightLayer);

            MemoryLayer resultLayer = new MemoryLayer {
                Name = "ResultLayer"
            };

            resultLayer.Styles.Add(new SymbolStyle(SymbolType.Circle, GeoColor.FromHtml("#99FF5722"), GeoColors.White));
            resultLayer.Styles.Add(new LineStyle(GeoColor.FromHtml("#00BCD4"), 4));
            Map1.AddDynamicLayers("ResultOverlay", resultLayer);

            Map1.ZoomTo(GeoBound.CreateToInclude(new[] { feature1, feature2 }));
        }
Ejemplo n.º 16
0
        private void Map1_Loaded(object sender, RoutedEventArgs e)
        {
            Map1.MapUnit = GeoUnit.Meter;
            Map1.UseOpenStreetMapAsBaseMap();

            GeoBound bound  = new GeoBound(2171997.6512, 8356849.2669, 3515687.9933, 11097616.86);
            GeoPoint center = bound.GetCentroid();
            double   x1     = bound.MinX + bound.Width * .25;
            double   y      = center.Y;
            double   x2     = bound.MaxX - bound.Width * .25;
            double   radius = bound.Width * 3 / 8;

            feature1 = new Feature(new GeoEllipse(new GeoPoint(x1, y), radius));
            feature2 = new Feature(new GeoEllipse(new GeoPoint(x2, y), radius));

            MemoryLayer highlightLayer = new MemoryLayer {
                Name = "HighlightLayer"
            };

            highlightLayer.Features.Add(feature1);
            highlightLayer.Features.Add(feature2);
            highlightLayer.Styles.Add(new FillStyle(GeoColor.FromHtml("#55FAB04D"), GeoColors.White));
            Map1.AddStaticLayers("HighlightOverlay", highlightLayer);

            MemoryLayer resultLayer = new MemoryLayer {
                Name = "ResultLayer"
            };

            resultLayer.Styles.Add(new FillStyle(GeoColor.FromHtml("#99FF5722"), GeoColors.White));
            Map1.AddDynamicLayers("ResultOverlay", resultLayer);

            Map1.ZoomTo(bound);
        }
Ejemplo n.º 17
0
        public static Map PointsWithDifferentSymbolTypes()
        {
            var map = new Map {
                Viewport = { Center = new Point(0, 0), Width = 200, Height = 100, Resolution = 0.5 }
            };
            var features = new Features
            {
                Utilities.CreateSimplePointFeature(-20, 0, new SymbolStyle {
                    Fill = new Brush {
                        Color = Color.Gray
                    }, Outline = new Pen(Color.Black), SymbolType = SymbolType.Ellipse
                }),
                Utilities.CreateSimplePointFeature(20, 0, new SymbolStyle {
                    Fill = new Brush {
                        Color = Color.Gray
                    }, Outline = new Pen(Color.Black), SymbolType = SymbolType.Rectangle
                })
            };
            var layer = new MemoryLayer
            {
                DataSource = new MemoryProvider(features),
                LayerName  = "Points with different symbol types"
            };

            map.Layers.Add(layer);
            return(map);
        }
Ejemplo n.º 18
0
        public void InsertWithNormalConditions()
        {
            // arrange
            var layerCollection = new LayerCollection();
            var layer1          = new MemoryLayer()
            {
                Name = "Layer1"
            };
            var layer2 = new MemoryLayer()
            {
                Name = "Layer2"
            };
            var layer3 = new MemoryLayer()
            {
                Name = "Layer3"
            };

            layerCollection.Add(layer1);
            layerCollection.Add(layer2);

            // act
            layerCollection.Insert(1, layer3);

            // assert
            var list = layerCollection.ToList();

            Assert.AreEqual(3, list.Count());
            Assert.NotNull(list[0]);
            Assert.AreEqual("Layer1", list[0].Name);
            Assert.NotNull(list[1]);
            Assert.AreEqual("Layer3", list[1].Name);
            Assert.NotNull(list[2]);
            Assert.AreEqual("Layer2", list[2].Name);
        }
Ejemplo n.º 19
0
    private void UpdateUI()
    {
        MemoryLayer layer = selectedObject.transform.root.GetComponent <MemoryLayer>();

        GameObject.FindGameObjectWithTag("SelectedLayerText").GetComponent <Text>().text = layer.name;
        layer.UpdateSizeLabel();
        layer.SetSizeSliderPosition();
    }
Ejemplo n.º 20
0
        private async Task MovePoint(MemoryLayer highlightLayer, GeoLine baseline, double percentageRatio, int i)
        {
            GeoPoint point = await Task.Run(() => baseline.GetPoint((float)percentageRatio *i));

            highlightLayer.Features.Clear();
            highlightLayer.Features.Add(new Feature(point));
            Map1.Refresh("HighlightOverlay");

            await Task.Run(() => Thread.Sleep(50));
        }
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            MemoryLayer bufferResultLayer = Map1.FindLayer <MemoryLayer>("BufferResultLayer");

            if (bufferResultLayer.Features.Count == 0)
            {
                Feature bufferedFeature = new Feature(highlightFeature.Geometry.GetConvexHull());
                bufferResultLayer.Features.Add(bufferedFeature);
                Map1.Refresh("BufferedOverlay");
            }
        }
Ejemplo n.º 22
0
    public IEnumerator CreateLayer()
    {
        // get a mock layer
        MemoryLayer layer = MockLayer(new Vector3(0, 0, 50));

        // release for a frame so that start can be called on the layer
        yield return(null);

        // check that the memory locations list exists and is empty
        Assert.AreEqual(0, layer.memoryLocations.Count);
    }
Ejemplo n.º 23
0
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            MemoryLayer resultLayer = Map1.FindLayer <MemoryLayer>("ResultLayer");

            if (resultLayer.Features.Count == 0)
            {
                Collection <GeoPoint> crossingPoints = highlightFeature.Geometry.GetCrossing(crossLineFeature.Geometry);
                resultLayer.Features.AddRange(crossingPoints.Select(p => new Feature(p)));
                Map1.Refresh("ResultOverlay");
            }
        }
Ejemplo n.º 24
0
        private void UpdatePinLayer(Mapsui.Geometries.Point currentNodePoint)
        {
            LayerCollection layers = MyMapControl.Map.Layers;

            if (layers.Count > 1)
            {
                layers.Remove(pinLayer);
            }

            pinLayer = WalkerPin.CreateWalkerLayer(currentNodePoint);
            layers.Add(pinLayer);
        }
Ejemplo n.º 25
0
        public static Map PointsWithBitmapRotatedAndOffset()
        {
            var map = new Map {
                Viewport = { Center = new Point(80, 80), Width = 200, Height = 200, Resolution = 1 }
            };
            var layer = new MemoryLayer {
                DataSource = Utilities.CreateProviderWithRotatedBitmapSymbols()
            };

            map.Layers.Add(layer);
            return(map);
        }
Ejemplo n.º 26
0
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            MemoryLayer resultLayer = Map1.FindLayer <MemoryLayer>("ResultLayer");

            if (resultLayer.Features.Count == 0)
            {
                Geometry intersection = feature1.Geometry.GetIntersection(feature2.Geometry);
                resultLayer.Features.Add(new Feature(intersection));

                Map1.Refresh("ResultOverlay");
            }
        }
Ejemplo n.º 27
0
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            MemoryLayer highlightLayer = Map1.FindLayer <MemoryLayer>("HighlightLayer");

            highlightLayer.Features.Clear();

            Button button = (Button)sender;

            switch (button.Content.ToString())
            {
            case "Polygon":
                highlightLayer.Features.Add(new Feature(CreatePolygon()));
                break;

            case "Polygon with Hole":
                highlightLayer.Features.Add(new Feature(CreatePolygonWithHole()));
                break;

            case "Ellipse":
                highlightLayer.Features.Add(new Feature(CreateEllipse()));
                break;

            case "Multi-Polygon":
                highlightLayer.Features.Add(new Feature(CreateMultiPolygon()));
                break;

            case "Rectangle":
                highlightLayer.Features.Add(new Feature(CreateRectangle()));
                break;

            case "Point":
                highlightLayer.Features.Add(new Feature(CreatePoint()));
                break;

            case "Multi-Point":
                highlightLayer.Features.Add(new Feature(CreateMultiPoint()));
                break;

            case "Line":
                highlightLayer.Features.Add(new Feature(CreateLine()));
                break;

            case "Multi-Line":
                highlightLayer.Features.Add(new Feature(CreateMultiLine()));
                break;

            default:
                break;
            }

            Map1.Refresh("HighlightOverlay");
        }
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            MemoryLayer resultLayer = Map1.FindLayer <MemoryLayer>("ResultLayer");

            if (resultLayer.Features.Count == 0)
            {
                Map1.FindLayer <MemoryLayer>("HighlightLayer").Features.Clear();

                Geometry difference = highlightBoundFeature.Geometry.GetDifference(highlightFeature.Geometry);
                resultLayer.Features.Add(new Feature(difference));
                Map1.Refresh("HighlightOverlay", "ResultOverlay");
            }
        }
Ejemplo n.º 29
0
        private static ILayer CreatePolygonLayer()
        {
            var layer = new MemoryLayer {
                Name = PolygonLayerName
            };
            var provider = new MemoryProvider();

            provider.Features.Add(CreatePolygonFeature());
            provider.Features.Add(CreateMultiPolygonFeature());
            layer.DataSource = provider;
            layer.Style      = null;
            return(layer);
        }
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            MemoryLayer resultLayer = Map1.FindLayer <MemoryLayer>("ResultLayer");

            if (resultLayer.Features.Count == 0)
            {
                Map1.FindLayer <MemoryLayer>("HighlightLayer").Features.Clear();

                GeoAreaBase unionResult = ((GeoAreaBase)feature1.Geometry).Union((GeoAreaBase)feature2.Geometry);
                resultLayer.Features.Add(new Feature(unionResult));
                Map1.Refresh("HighlightOverlay", "ResultOverlay");
            }
        }