====== Source Code XamarinFormsEditionSample GeometricFunctions.zip ====== ====App.cs==== using System; using Xamarin.Forms; namespace GeometricFunc { public class App : Application { private MasterDetailPage mainPage; public App() { InitializeStyles(); mainPage = new MasterDetailPage(); SampleListPage sampleListPage = new SampleListPage(); sampleListPage.SelectedSampleChanged += SampleListViewModel_SelectedSampleChanged; sampleListPage.SelectedSample = sampleListPage.Samples[0]; mainPage.Master = sampleListPage; MainPage = mainPage; } private void SampleListViewModel_SelectedSampleChanged(object sender, EventArgs e) { ContentPage mainContentPage = null; SampleListPage sampleListViewModel = (SampleListPage)sender; BaseSampleView newSample = (BaseSampleView)Activator.CreateInstance(sampleListViewModel.SelectedSample.ClassType); if (mainPage.Detail == null) { mainContentPage = new ContentPage(); mainPage.Detail = new NavigationPage(mainContentPage); } NavigationPage navigationPage = (NavigationPage)mainPage.Detail; mainContentPage = (ContentPage)navigationPage.CurrentPage; BaseSampleView oldSample = mainContentPage.Content as BaseSampleView; if (oldSample != null && !newSample.Equals(oldSample)) { oldSample.Dispose(); } mainContentPage.Content = newSample; mainContentPage.Title = newSample.Name; mainContentPage.ToolbarItems.Clear(); mainContentPage.ToolbarItems.Add(newSample.SampleToolbarItem); mainPage.IsPresented = false; } private void InitializeStyles() { Application.Current.Resources = new ResourceDictionary(); Style headerStyle = new Style(typeof(ContentView)); headerStyle.Setters.Add(new Setter { Property = ContentView.PaddingProperty, Value = new Thickness(5, Device.OnPlatform(38, 5, 0), 5, 0) }); Application.Current.Resources.Add("ListHeaderStyle", headerStyle); Style settingsTitleStyle = new Style(typeof(Label)); settingsTitleStyle.Setters.Add(new Setter { Property = Label.TextColorProperty, Value = Color.Black }); settingsTitleStyle.Setters.Add(new Setter { Property = Label.FontSizeProperty, Value = 21 }); settingsTitleStyle.Setters.Add(new Setter { Property = Label.FontAttributesProperty, Value = FontAttributes.Bold }); Application.Current.Resources.Add("SettingsTitleStyle", settingsTitleStyle); } } } ====AssemblyInfo.cs==== using System.Resources; using System.Reflection; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly:|AssemblyTitle("GeometricFunc")] [assembly: AssemblyDescription("")] [assembly:|AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly:|AssemblyProduct("GeometricFunc")] [assembly: AssemblyCopyright("Copyright © 2015")] [assembly:|AssemblyTrademark("")] [assembly: AssemblyCulture("")] [assembly:|NeutralResourcesLanguage("en")] // Version information for an assembly consists of the following four values: // // Major Version // Minor Version // Build Number // Revision // // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly:|AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] [assembly:|AssemblyFileVersion("1.0.0.0")] ====BufferSample.cs==== using System.Linq; using ThinkGeo.MapSuite.Core; using ThinkGeo.MapSuite.FormsEdition; namespace GeometricFunc { public class BufferSample : BaseSampleView { public const string SampleName = "Buffer"; private int bufferSize; public override string Name { get { return SampleName; } } protected override void LoadMap() { bufferSize = 0; MapView.MapUnit = GeographyUnit.Meter; MapView.CurrentExtent = GetBoundingBox(); InMemoryFeatureLayer bufferedLayer = new InMemoryFeatureLayer(); bufferedLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = new AreaStyle(new GeoSolidBrush(GeoColor.FromArgb(140, 255, 155, 13))); bufferedLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; InMemoryFeatureLayer sourceLayer = new InMemoryFeatureLayer(); sourceLayer.InternalFeatures.Add(GeometrySource.FirstOrDefault()); sourceLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = new AreaStyle(new GeoSolidBrush(BrushColor)); sourceLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle.OutlinePen.Width = 3; sourceLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle.OutlinePen.Color = GeoColor.StandardColors.Black; sourceLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; LayerOverlay layerOverlay = new LayerOverlay(); layerOverlay.Layers.Add("BufferedLayer", bufferedLayer); layerOverlay.Layers.Add("SourceLayer", sourceLayer); MapView.Overlays.Add("LayerOverlay", layerOverlay); } protected override void ExecuteSample() { LayerOverlay layerOverlay = (LayerOverlay)MapView.Overlays["LayerOverlay"]; InMemoryFeatureLayer sourceLayer = (InMemoryFeatureLayer)layerOverlay.Layers["SourceLayer"]; InMemoryFeatureLayer bufferedLayer = (InMemoryFeatureLayer)layerOverlay.Layers["BufferedLayer"]; bufferSize += 15; Feature bufferSourceFeature = sourceLayer.InternalFeatures[0].CloneDeep(); Feature bufferedFeature = bufferSourceFeature.Buffer(bufferSize, 8, BufferCapType.Butt, GeographyUnit.Meter, DistanceUnit.Meter); bufferedLayer.InternalFeatures.Clear(); bufferedLayer.InternalFeatures.Add(bufferedFeature); layerOverlay.Refresh(); } } } ====CenterPointSample.cs==== using System.Linq; using ThinkGeo.MapSuite.Core; using ThinkGeo.MapSuite.FormsEdition; namespace GeometricFunc { public class CenterPointSample : BaseSampleView { public const string SampleName = "CenterPoint"; private ManagedProj4Projection projection; public override string Name { get { return SampleName; } } protected override void LoadMap() { MapView.MapUnit = GeographyUnit.Meter; RectangleShape mapExtent = (RectangleShape)ExtentHelper.GetBoundingBoxOfItems(GeometrySource).CloneDeep(); mapExtent.ScaleUp(20); MapView.CurrentExtent = mapExtent; projection = new ManagedProj4Projection(); projection.InternalProjectionParametersString = ManagedProj4Projection.GetSphericalMercatorParametersString(); projection.ExternalProjectionParametersString = ManagedProj4Projection.GetLatLongParametersString(); projection.Open(); InMemoryFeatureLayer sourceLayer = new InMemoryFeatureLayer(); sourceLayer.InternalFeatures.Add(GeometrySource.FirstOrDefault()); sourceLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = new AreaStyle(new GeoSolidBrush(BrushColor)); sourceLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle.OutlinePen.Width = 3; sourceLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle.OutlinePen.Color = GeoColor.StandardColors.Black; sourceLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; InMemoryFeatureLayer pointLayer = new InMemoryFeatureLayer(); pointLayer.Open(); pointLayer.Columns.Add(new FeatureSourceColumn("Type")); pointLayer.Close(); pointLayer.ZoomLevelSet.ZoomLevel01.DefaultPointStyle.SymbolSize = 12; pointLayer.ZoomLevelSet.ZoomLevel01.DefaultPointStyle.SymbolPen = new GeoPen(GeoColor.FromArgb(255, 255, 155, 13), 2); pointLayer.ZoomLevelSet.ZoomLevel01.DefaultPointStyle.SymbolSolidBrush = new GeoSolidBrush(GeoColor.FromArgb(255, 255, 248, 172)); pointLayer.DrawingMarginPercentage = 100; TextStyle textStyle = new TextStyle(); textStyle.TextColumnName = "Type"; textStyle.Font = new GeoFont("Arial", 15); textStyle.DuplicateRule = LabelDuplicateRule.UnlimitedDuplicateLabels; textStyle.OverlappingRule = LabelOverlappingRule.AllowOverlapping; textStyle.TextSolidBrush = new GeoSolidBrush(GeoColor.StandardColors.Black); textStyle.HaloPen = new GeoPen(new GeoSolidBrush(GeoColor.StandardColors.White), 1); textStyle.PointPlacement = PointPlacement.LowerCenter; textStyle.YOffsetInPixel = -8; pointLayer.ZoomLevelSet.ZoomLevel01.DefaultTextStyle = textStyle; pointLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; LayerOverlay layerOverlay = new LayerOverlay(); layerOverlay.Layers.Add("SourceLayer", sourceLayer); layerOverlay.Layers.Add("PointLayer", pointLayer); MapView.Overlays.Add("LayerOverlay", layerOverlay); } protected override void ExecuteSample() { LayerOverlay layerOverlay = (LayerOverlay)MapView.Overlays["LayerOverlay"]; InMemoryFeatureLayer pointLayer = (InMemoryFeatureLayer)layerOverlay.Layers["PointLayer"]; InMemoryFeatureLayer sourceLayer = (InMemoryFeatureLayer)layerOverlay.Layers["SourceLayer"]; Feature feature = sourceLayer.InternalFeatures.FirstOrDefault(); pointLayer.Clear(); Feature centerFeature = new Feature(feature.GetBoundingBox().GetCenterPoint()); PointShape centerPoint = (PointShape)projection.ConvertToExternalProjection(centerFeature.CloneDeep()).GetShape(); centerFeature.ColumnValues["Type"] = string.Format("Center at Lon: {0:N4}, Lat: {1:N4}", centerPoint.X, centerPoint.Y); pointLayer.InternalFeatures.Add(centerFeature); Feature centroidFeature = new Feature(feature.GetShape().GetCenterPoint()); PointShape centroidPoint = (PointShape)projection.ConvertToExternalProjection(centroidFeature.CloneDeep()).GetShape(); centroidFeature.ColumnValues["Type"] = string.Format("Centroid at Lon: {0:N4}, Lat: {1:N4}", centroidPoint.X, centroidPoint.Y); pointLayer.InternalFeatures.Add(centroidFeature); layerOverlay.Refresh(); } } } ====ClipSample.cs==== using System.Collections.ObjectModel; using System.Linq; using ThinkGeo.MapSuite.Core; using ThinkGeo.MapSuite.FormsEdition; namespace GeometricFunc { public class ClipSample : BaseSampleView { public const string SampleName = "Clip"; public override string Name { get { return SampleName; } } protected override void LoadMap() { MapView.MapUnit = GeographyUnit.Meter; MapView.CurrentExtent = GetBoundingBox(); InMemoryFeatureLayer sourceLayer = new InMemoryFeatureLayer(); sourceLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = new AreaStyle(new GeoSolidBrush(new GeoColor(160, 255, 248, 172))); sourceLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle.OutlinePen.Width = 1; sourceLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle.OutlinePen.Color = GeoColor.StandardColors.Black; sourceLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; foreach (Feature feature in GeometrySource.Skip(1)) { sourceLayer.InternalFeatures.Add(feature); } InMemoryFeatureLayer clippingLayer = new InMemoryFeatureLayer(); clippingLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = new AreaStyle(new GeoSolidBrush(BrushColor)); clippingLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle.OutlinePen.Width = 3; clippingLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle.OutlinePen.Color = GeoColor.FromArgb(255, 255, 155, 13); clippingLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; clippingLayer.InternalFeatures.Add(GeometrySource.FirstOrDefault()); LayerOverlay layerOverlay = new LayerOverlay(); layerOverlay.Layers.Add("SourceLayer", sourceLayer); layerOverlay.Layers.Add("ClippingLayer", clippingLayer); MapView.Overlays.Add("LayerOverlay", layerOverlay); } protected override void ExecuteSample() { LayerOverlay layerOverlay = (LayerOverlay)MapView.Overlays["LayerOverlay"]; InMemoryFeatureLayer sourceLayer = (InMemoryFeatureLayer)layerOverlay.Layers["SourceLayer"]; InMemoryFeatureLayer clipLayer = (InMemoryFeatureLayer)layerOverlay.Layers["ClippingLayer"]; Feature clippingFeature = clipLayer.InternalFeatures.FirstOrDefault(); if (clippingFeature != null) { sourceLayer.Open(); Collection features = sourceLayer.QueryTools.GetFeaturesIntersecting(clippingFeature.GetShape(), ReturningColumnsType.AllColumns); sourceLayer.InternalFeatures.Clear(); clipLayer.InternalFeatures.Clear(); foreach (Feature feature in features) { sourceLayer.InternalFeatures.Add(feature.GetIntersection(clippingFeature)); } } layerOverlay.Refresh(); } } } ====ConvexHullSample.cs==== using System.Collections.ObjectModel; using System.Linq; using ThinkGeo.MapSuite.Core; using ThinkGeo.MapSuite.FormsEdition; namespace GeometricFunc { public class ConvexHullSample : BaseSampleView { public const string SampleName = "Convex Hull"; public override string Name { get { return SampleName; } } protected override void LoadMap() { MapView.MapUnit = GeographyUnit.Meter; MapView.CurrentExtent = GetBoundingBox(); InMemoryFeatureLayer sourceLayer = new InMemoryFeatureLayer(); sourceLayer.ZoomLevelSet.ZoomLevel01.DefaultPointStyle.PointType = PointType.Bitmap; sourceLayer.ZoomLevelSet.ZoomLevel01.DefaultPointStyle.Image = new GeoImage(SampleHelper.GetDataPath(@"fire.png")); sourceLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = new AreaStyle(new GeoSolidBrush(BrushColor)); sourceLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle.OutlinePen.Width = 3; sourceLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle.OutlinePen.Color = GeoColor.StandardColors.Black; sourceLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; foreach (Feature feature in GeometrySource) { sourceLayer.InternalFeatures.Add(feature); } InMemoryFeatureLayer convexHullLayer = new InMemoryFeatureLayer(); convexHullLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = new AreaStyle(new GeoSolidBrush(BrushColor)); convexHullLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle.OutlinePen.Width = 3; convexHullLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle.OutlinePen.Color = GeoColor.StandardColors.Black; convexHullLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; LayerOverlay layerOverlay = new LayerOverlay(); layerOverlay.Layers.Add("SourceLayer", sourceLayer); layerOverlay.Layers.Add("ConvexHullLayer", convexHullLayer); MapView.Overlays.Add("LayerOverlay", layerOverlay); } protected override void ExecuteSample() { LayerOverlay layerOverlay = (LayerOverlay)MapView.Overlays["LayerOverlay"]; InMemoryFeatureLayer sourceLayer = (InMemoryFeatureLayer)layerOverlay.Layers["SourceLayer"]; InMemoryFeatureLayer convexHullLayer = (InMemoryFeatureLayer)layerOverlay.Layers["ConvexHullLayer"]; sourceLayer.Open(); Collection features = sourceLayer.FeatureSource.GetAllFeatures(ReturningColumnsType.NoColumns); convexHullLayer.Clear(); MultipointShape multipointShape = new MultipointShape(); foreach (Feature feature in features.Skip(1)) { PointShape pointShape = (PointShape)feature.GetShape(); multipointShape.Points.Add(pointShape); } RingShape convexHull = multipointShape.ConvexHull(); PolygonShape polygonShape = new PolygonShape(convexHull); convexHullLayer.InternalFeatures.Add(new Feature(polygonShape)); convexHullLayer.InternalFeatures.Add(features.FirstOrDefault().GetConvexHull()); layerOverlay.Refresh(); } } } ====DifferenceSample.cs==== using ThinkGeo.MapSuite.Core; using ThinkGeo.MapSuite.FormsEdition; namespace GeometricFunc { public class DifferenceSample : BaseSampleView { public const string SampleName = "Difference"; public override string Name { get { return SampleName; } } protected override void LoadMap() { MapView.MapUnit = GeographyUnit.Meter; MapView.CurrentExtent = GetBoundingBox(); InMemoryFeatureLayer sourceLayer = new InMemoryFeatureLayer(); sourceLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = new AreaStyle(new GeoSolidBrush(BrushColor)); sourceLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle.OutlinePen.Width = 3; sourceLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle.OutlinePen.Color = GeoColor.StandardColors.Black; sourceLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; sourceLayer.InternalFeatures.Add("AreaShape1", GeometrySource[0]); sourceLayer.InternalFeatures.Add("AreaShape2", GeometrySource[1]); LayerOverlay layerOverlay = new LayerOverlay(); layerOverlay.Layers.Add("SourceLayer", sourceLayer); MapView.Overlays.Add("LayerOverlay", layerOverlay); } protected override void ExecuteSample() { LayerOverlay layerOverlay = (LayerOverlay)MapView.Overlays["LayerOverlay"]; InMemoryFeatureLayer sourceLayer = (InMemoryFeatureLayer)layerOverlay.Layers["SourceLayer"]; if (sourceLayer.InternalFeatures.Count > 1) { AreaBaseShape sourceShape = (AreaBaseShape)sourceLayer.InternalFeatures["AreaShape2"].GetShape(); AreaBaseShape targetShape = (AreaBaseShape)sourceLayer.InternalFeatures["AreaShape1"].GetShape(); AreaBaseShape resultShape = sourceShape.GetDifference(targetShape); sourceLayer.InternalFeatures.Clear(); sourceLayer.InternalFeatures.Add(new Feature(resultShape.GetWellKnownBinary())); layerOverlay.Refresh(); } } } } ====EnvelopSample.cs==== using System.Linq; using ThinkGeo.MapSuite.Core; using ThinkGeo.MapSuite.FormsEdition; namespace GeometricFunc { public class EnvelopSample : BaseSampleView { public const string SampleName = "Envelop Boundingbox"; public override string Name { get { return SampleName; } } protected override void LoadMap() { MapView.MapUnit = GeographyUnit.Meter; MapView.CurrentExtent = GetBoundingBox(); InMemoryFeatureLayer sourceLayer = new InMemoryFeatureLayer(); sourceLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = new AreaStyle(new GeoSolidBrush(BrushColor)); sourceLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle.OutlinePen.Width = 3; sourceLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle.OutlinePen.Color = GeoColor.StandardColors.Black; sourceLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; sourceLayer.InternalFeatures.Add(GeometrySource.First()); InMemoryFeatureLayer boundingboxLayer = new InMemoryFeatureLayer(); boundingboxLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = new AreaStyle(new GeoSolidBrush(new GeoColor(160, 255, 248, 172))); boundingboxLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle.OutlinePen.Width = 3; boundingboxLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle.OutlinePen.Color = GeoColor.FromArgb(255, 255, 155, 13); boundingboxLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; LayerOverlay layerOverlay = new LayerOverlay(); layerOverlay.Layers.Add("SourceLayer", sourceLayer); layerOverlay.Layers.Add("BoundingboxLayer", boundingboxLayer); MapView.Overlays.Add("LayerOverlay", layerOverlay); } protected override void ExecuteSample() { LayerOverlay layerOverlay = (LayerOverlay)MapView.Overlays["LayerOverlay"]; InMemoryFeatureLayer boundingboxLayer = (InMemoryFeatureLayer)layerOverlay.Layers["BoundingboxLayer"]; InMemoryFeatureLayer sourceLayer = (InMemoryFeatureLayer)layerOverlay.Layers["SourceLayer"]; Feature sourceFeature = sourceLayer.InternalFeatures.First(); boundingboxLayer.InternalFeatures.Clear(); boundingboxLayer.InternalFeatures.Add(new Feature(sourceFeature.GetBoundingBox())); layerOverlay.Refresh(); } } } ====GetAreaSample.cs==== using System.Globalization; using System.Linq; using ThinkGeo.MapSuite.Core; using ThinkGeo.MapSuite.FormsEdition; using Xamarin.Forms; namespace GeometricFunc { public class GetAreaSample : BaseSampleView { public const string SampleName = "GetArea"; public override string Name { get { return SampleName; } } protected override void LoadMap() { MapView.MapUnit = GeographyUnit.Meter; MapView.CurrentExtent = GetBoundingBox(); InMemoryFeatureLayer sourceLayer = new InMemoryFeatureLayer(); sourceLayer.Open(); sourceLayer.Columns.Add(new FeatureSourceColumn("Area")); sourceLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = new AreaStyle(new GeoSolidBrush(BrushColor)); sourceLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle.OutlinePen.Width = 3; sourceLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle.OutlinePen.Color = GeoColor.StandardColors.Black; TextStyle textStyle = new TextStyle(); textStyle.TextColumnName = "Area"; textStyle.Font = new GeoFont("Arial", 15); textStyle.DuplicateRule = LabelDuplicateRule.UnlimitedDuplicateLabels; textStyle.OverlappingRule = LabelOverlappingRule.AllowOverlapping; textStyle.TextSolidBrush = new GeoSolidBrush(GeoColor.StandardColors.Black); textStyle.HaloPen = new GeoPen(new GeoSolidBrush(GeoColor.StandardColors.White), 1); textStyle.PointPlacement = PointPlacement.LowerCenter; textStyle.YOffsetInPixel = -8; sourceLayer.ZoomLevelSet.ZoomLevel01.DefaultTextStyle = textStyle; sourceLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; sourceLayer.InternalFeatures.Add(GeometrySource.First()); LayerOverlay layerOverlay = new LayerOverlay(); layerOverlay.Layers.Add("SourceLayer", sourceLayer); MapView.Overlays.Add("LayerOverlay", layerOverlay); } protected override void ExecuteSample() { LayerOverlay layerOverlay = (LayerOverlay)MapView.Overlays["LayerOverlay"]; InMemoryFeatureLayer sourceLayer = (InMemoryFeatureLayer)layerOverlay.Layers["SourceLayer"]; Feature feature = sourceLayer.InternalFeatures.FirstOrDefault(); if (feature != null) { AreaBaseShape areaShape = (AreaBaseShape)feature.GetShape(); double metersArea = areaShape.GetArea(GeographyUnit.Meter, AreaUnit.SquareMeters); double hectaresArea = areaShape.GetArea(GeographyUnit.Meter, AreaUnit.Hectares); string areaMessage = string.Format(CultureInfo.InvariantCulture, "{0:N2} Hectares, \r\n {1:N2} Acres", metersArea, hectaresArea); feature.ColumnValues["Area"] = areaMessage; //Toast.MakeText(context, areaMessage, ToastLength.Long).Show(); //MessagingCenter.Send(this, "Alert", areaMessage); Application.Current.MainPage.DisplayAlert("Message", areaMessage, "OK"); layerOverlay.Refresh(); } } } } ====GetLengthSample.cs==== using System.Globalization; using System.Linq; using ThinkGeo.MapSuite.Core; using ThinkGeo.MapSuite.FormsEdition; using Xamarin.Forms; namespace GeometricFunc { public class GetLengthSample : BaseSampleView { public const string SampleName = "Get Length"; public override string Name { get { return SampleName; } } protected override void LoadMap() { MapView.MapUnit = GeographyUnit.Meter; MapView.CurrentExtent = GetBoundingBox(); InMemoryFeatureLayer sourceLayer = new InMemoryFeatureLayer(); sourceLayer.Open(); sourceLayer.Columns.Add(new FeatureSourceColumn("Length")); sourceLayer.Close(); TextStyle textStyle = new TextStyle(); textStyle.TextColumnName = "Length"; textStyle.Font = new GeoFont("Arial", 15); textStyle.DuplicateRule = LabelDuplicateRule.UnlimitedDuplicateLabels; textStyle.OverlappingRule = LabelOverlappingRule.AllowOverlapping; textStyle.TextSolidBrush = new GeoSolidBrush(GeoColor.StandardColors.Black); textStyle.HaloPen = new GeoPen(new GeoSolidBrush(GeoColor.StandardColors.White), 1); sourceLayer.ZoomLevelSet.ZoomLevel01.DefaultTextStyle = textStyle; sourceLayer.ZoomLevelSet.ZoomLevel01.DefaultLineStyle = LineStyles.LocalRoad1; sourceLayer.ZoomLevelSet.ZoomLevel01.DefaultLineStyle.InnerPen.Brush = new GeoSolidBrush(GeoColor.FromArgb(180, 255, 155, 13)); sourceLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; sourceLayer.InternalFeatures.Add(GeometrySource.First()); LayerOverlay layerOverlay = new LayerOverlay(); layerOverlay.TileType = TileType.SingleTile; layerOverlay.Layers.Add("SourceLayer", sourceLayer); MapView.Overlays.Add("LayerOverlay", layerOverlay); } protected override void ExecuteSample() { LayerOverlay layerOverlay = (LayerOverlay)MapView.Overlays["LayerOverlay"]; InMemoryFeatureLayer sourceLayer = (InMemoryFeatureLayer)layerOverlay.Layers["SourceLayer"]; Feature firstFeature = sourceLayer.InternalFeatures.FirstOrDefault(); if (firstFeature != null) { Feature feature = firstFeature.CloneDeep(); LineBaseShape lineShape = (LineBaseShape)feature.GetShape(); double length = lineShape.GetLength(GeographyUnit.Meter, DistanceUnit.Mile); string lengthContent = string.Format(CultureInfo.InvariantCulture, "Length is {0:N2} miles.", length); feature.ColumnValues["Length"] = lengthContent; sourceLayer.InternalFeatures.Clear(); sourceLayer.InternalFeatures.Add(feature); Application.Current.MainPage.DisplayAlert("Message", lengthContent, "OK"); layerOverlay.Refresh(); } } } } ====GetShortestLineSample.cs==== using System.Globalization; using ThinkGeo.MapSuite.Core; using ThinkGeo.MapSuite.FormsEdition; namespace GeometricFunc { public class GetShortestLineSample : BaseSampleView { public const string SampleName = "GetShortestLine To"; public override string Name { get { return SampleName; } } protected override void LoadMap() { MapView.MapUnit = GeographyUnit.Meter; RectangleShape mapExtent = (RectangleShape)ExtentHelper.GetBoundingBoxOfItems(GeometrySource).CloneDeep(); mapExtent.ScaleUp(20); MapView.CurrentExtent = mapExtent; InMemoryFeatureLayer sourceLayer = new InMemoryFeatureLayer(); sourceLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = new AreaStyle(new GeoSolidBrush(BrushColor)); sourceLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle.OutlinePen.Width = 3; sourceLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle.OutlinePen.Color = GeoColor.StandardColors.Black; sourceLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; sourceLayer.InternalFeatures.Add("AreaShape1", GeometrySource[0]); sourceLayer.InternalFeatures.Add("AreaShape2", GeometrySource[1]); InMemoryFeatureLayer shortestLineLayer = new InMemoryFeatureLayer(); shortestLineLayer.Open(); shortestLineLayer.Columns.Add(new FeatureSourceColumn("Distance")); TextStyle textStyle = new TextStyle(); textStyle.TextColumnName = "Distance"; textStyle.Font = new GeoFont("Arial", 15); textStyle.DuplicateRule = LabelDuplicateRule.UnlimitedDuplicateLabels; textStyle.OverlappingRule = LabelOverlappingRule.AllowOverlapping; textStyle.TextSolidBrush = new GeoSolidBrush(GeoColor.StandardColors.Black); textStyle.HaloPen = new GeoPen(new GeoSolidBrush(GeoColor.StandardColors.White), 1); textStyle.PointPlacement = PointPlacement.LowerCenter; textStyle.YOffsetInPixel = -8; shortestLineLayer.ZoomLevelSet.ZoomLevel01.DefaultTextStyle = textStyle; shortestLineLayer.ZoomLevelSet.ZoomLevel01.DefaultLineStyle.OuterPen.Width = 5; shortestLineLayer.ZoomLevelSet.ZoomLevel01.DefaultLineStyle.OuterPen.Color = GeoColor.FromArgb(180, 255, 155, 13); shortestLineLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; LayerOverlay layerOverlay = new LayerOverlay(); layerOverlay.Layers.Add("SourceLayer", sourceLayer); layerOverlay.Layers.Add("ShortestLineLayer", shortestLineLayer); MapView.Overlays.Add("LayerOverlay", layerOverlay); } protected override void ExecuteSample() { LayerOverlay layerOverlay = (LayerOverlay)MapView.Overlays["LayerOverlay"]; InMemoryFeatureLayer sourceLayer = (InMemoryFeatureLayer)layerOverlay.Layers["SourceLayer"]; InMemoryFeatureLayer shortestLineLayer = (InMemoryFeatureLayer)layerOverlay.Layers["ShortestLineLayer"]; BaseShape areaShape1 = sourceLayer.InternalFeatures["AreaShape1"].GetShape(); BaseShape areaShape2 = sourceLayer.InternalFeatures["AreaShape2"].GetShape(); MultilineShape multiLineShape = areaShape1.GetShortestLineTo(areaShape2, GeographyUnit.Meter); Feature feature = new Feature(multiLineShape.GetWellKnownBinary()); feature.ColumnValues["Distance"] = string.Format(CultureInfo.InvariantCulture, "Distance is {0:N2} miles.", multiLineShape.GetLength(GeographyUnit.Meter, DistanceUnit.Mile)); shortestLineLayer.InternalFeatures.Clear(); shortestLineLayer.InternalFeatures.Add(feature); layerOverlay.Refresh(); } } } ====LineOnLineSample.cs==== using System.Linq; using ThinkGeo.MapSuite.Core; using ThinkGeo.MapSuite.FormsEdition; namespace GeometricFunc { public class LineOnLineSample : BaseSampleView { public const string SampleName = "Line on Line"; public override string Name { get { return SampleName; } } protected override void LoadMap() { MapView.MapUnit = GeographyUnit.Meter; MapView.CurrentExtent = GetBoundingBox(); InMemoryFeatureLayer sourceLayer = new InMemoryFeatureLayer(); sourceLayer.ZoomLevelSet.ZoomLevel01.DefaultLineStyle = LineStyles.LocalRoad1; sourceLayer.ZoomLevelSet.ZoomLevel01.DefaultLineStyle.InnerPen.Brush = new GeoSolidBrush(GeoColor.FromArgb(180, 255, 155, 13)); sourceLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; sourceLayer.ZoomLevelSet.ZoomLevel01.DefaultPointStyle = PointStyles.CreateSimplePointStyle(PointSymbolType.Circle, GeoColor.StandardColors.Transparent, GeoColor.StandardColors.Black, 18); foreach (var feature in GeometrySource) { sourceLayer.InternalFeatures.Add(feature); } InMemoryFeatureLayer lineOnLineLayer = new InMemoryFeatureLayer(); lineOnLineLayer.ZoomLevelSet.ZoomLevel01.DefaultLineStyle = LineStyles.LocalRoad1; lineOnLineLayer.ZoomLevelSet.ZoomLevel01.DefaultLineStyle.InnerPen.Brush = new GeoSolidBrush(GeoColor.StandardColors.Blue); lineOnLineLayer.ZoomLevelSet.ZoomLevel01.DefaultLineStyle.OuterPen.Brush = new GeoSolidBrush(GeoColor.StandardColors.Red); lineOnLineLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; LayerOverlay layerOverlay = new LayerOverlay(); layerOverlay.Layers.Add("SourceLayer", sourceLayer); layerOverlay.Layers.Add("LineOnLineLayer", lineOnLineLayer); MapView.Overlays.Add("LayerOverlay", layerOverlay); } protected override void ExecuteSample() { LayerOverlay layerOverlay = (LayerOverlay)MapView.Overlays["LayerOverlay"]; InMemoryFeatureLayer lineOnLineLayer = (InMemoryFeatureLayer)layerOverlay.Layers["LineOnLineLayer"]; InMemoryFeatureLayer sourceLayer = (InMemoryFeatureLayer)layerOverlay.Layers["SourceLayer"]; Feature firstFeature = sourceLayer.InternalFeatures.FirstOrDefault(); if (firstFeature != null) { LineShape lineShape = (LineShape)firstFeature.GetShape(); lineOnLineLayer.InternalFeatures.Clear(); LineBaseShape resultLine = lineShape.GetLineOnALine(StartingPoint.FirstPoint, 80, 450, GeographyUnit.Meter, DistanceUnit.Meter); lineOnLineLayer.InternalFeatures.Add(new Feature(resultLine)); layerOverlay.Refresh(); } } } } ====RotateSample.cs==== using System.Linq; using ThinkGeo.MapSuite.Core; using ThinkGeo.MapSuite.FormsEdition; namespace GeometricFunc { public class RotateSample : BaseSampleView { public const string SampleName = "Rotate"; public override string Name { get { return SampleName; } } protected override void LoadMap() { MapView.MapUnit = GeographyUnit.Meter; MapView.CurrentExtent = GetBoundingBox(); InMemoryFeatureLayer sourceLayer = new InMemoryFeatureLayer(); sourceLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = new AreaStyle(new GeoSolidBrush(BrushColor)); sourceLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle.OutlinePen.Width = 3; sourceLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle.OutlinePen.Color = GeoColor.StandardColors.Black; sourceLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; sourceLayer.InternalFeatures.Add(GeometrySource.FirstOrDefault()); LayerOverlay layerOverlay = new LayerOverlay(); layerOverlay.Layers.Add("SourceLayer", sourceLayer); MapView.Overlays.Add("LayerOverlay", layerOverlay); } protected override void ExecuteSample() { LayerOverlay layerOverlay = (LayerOverlay)MapView.Overlays["LayerOverlay"]; InMemoryFeatureLayer sourceLayer = (InMemoryFeatureLayer)layerOverlay.Layers["SourceLayer"]; Feature sourceFeature = sourceLayer.InternalFeatures.FirstOrDefault(); if (sourceFeature != null && sourceFeature.GetShape().CanRotate) { PointShape center = sourceFeature.GetBoundingBox().GetCenterPoint(); BaseShape rotatedShape = BaseShape.Rotate(sourceFeature.GetShape(), center, 22.5f); sourceLayer.InternalFeatures.Clear(); sourceLayer.InternalFeatures.Add(new Feature(rotatedShape)); layerOverlay.Refresh(); } } } } ====SampleListPage.xaml.cs==== using System; using System.Collections.ObjectModel; using Xamarin.Forms; namespace GeometricFunc { public partial class SampleListPage : ContentPage { private string title; private SampleItem selectedSample; private ObservableCollection samples; private Command openHelpUriCommand; public event EventHandler SelectedSampleChanged; public SampleListPage() { InitializeComponent(); samples = new ObservableCollection(); samples.Add(new SampleItem("Union", "union", typeof(UnionSample))); samples.Add(new SampleItem("Difference", "difference", typeof(DifferenceSample))); samples.Add(new SampleItem("Buffer", "buffer", typeof(BufferSample))); samples.Add(new SampleItem("Scale", "scale", typeof(ScaleSample))); samples.Add(new SampleItem("Rotate", "rotate", typeof(RotateSample))); samples.Add(new SampleItem("CenterPoint", "centerPoint", typeof(CenterPointSample))); samples.Add(new SampleItem("GetArea", "getArea", typeof(GetAreaSample))); samples.Add(new SampleItem("Simplify", "simplify", typeof(SimplifySample))); samples.Add(new SampleItem("GetShortestLine To", "shortestLine", typeof(GetShortestLineSample))); samples.Add(new SampleItem("Get Length", "getLength", typeof(GetLengthSample))); samples.Add(new SampleItem("Line on Line", "lineOnLine", typeof(LineOnLineSample))); samples.Add(new SampleItem("Clip", "clip", typeof(ClipSample))); samples.Add(new SampleItem("Convex Hull", "convexHull", typeof(ConvexHullSample))); samples.Add(new SampleItem("Envelop Boundingbox", "bbox", typeof(EnvelopSample))); samples.Add(new SampleItem("Snapping", "snapGps", typeof(SnapGPSSample))); BindingContext = this; } public SampleItem SelectedSample { get { return selectedSample; } set { if (selectedSample != value) { selectedSample = value; OnPropertyChanged("SelectedSample"); OnSelectedSampleChanged(); } } } public ObservableCollection Samples { get { return samples; } } public Command OpenHelpUriCommand { get { openHelpUriCommand = openHelpUriCommand ?? new Command(() => Device.OpenUri(new Uri("http://www.thinkgeo.com"))); return openHelpUriCommand; } } protected virtual void OnSelectedSampleChanged() { EventHandler handler = SelectedSampleChanged; if (handler != null) { handler(this, new EventArgs()); } } } } ====ScaleSample.cs==== using System.Linq; using ThinkGeo.MapSuite.Core; using ThinkGeo.MapSuite.FormsEdition; namespace GeometricFunc { public class ScaleSample : BaseSampleView { public const string SampleName = "Scale"; public override string Name { get { return SampleName; } } protected override void LoadMap() { MapView.MapUnit = GeographyUnit.Meter; MapView.CurrentExtent = GetBoundingBox(); InMemoryFeatureLayer sourceLayer = new InMemoryFeatureLayer(); sourceLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = new AreaStyle(new GeoSolidBrush(BrushColor)); sourceLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle.OutlinePen.Width = 3; sourceLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle.OutlinePen.Color = GeoColor.StandardColors.Black; sourceLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; Feature sourceFeature = GeometrySource.First(); sourceLayer.InternalFeatures.Add(sourceFeature.Id, sourceFeature); LayerOverlay layerOverlay = new LayerOverlay(); layerOverlay.Layers.Add("SourceLayer", sourceLayer); MapView.Overlays.Add("LayerOverlay", layerOverlay); } protected override void ExecuteSample() { LayerOverlay layerOverlay = (LayerOverlay)MapView.Overlays["LayerOverlay"]; InMemoryFeatureLayer sourceLayer = (InMemoryFeatureLayer)layerOverlay.Layers["SourceLayer"]; Feature sourceFeature = sourceLayer.InternalFeatures.First(); sourceLayer.Open(); sourceLayer.EditTools.BeginTransaction(); sourceLayer.EditTools.ScaleUp(sourceFeature.Id, 10); sourceLayer.EditTools.CommitTransaction(); layerOverlay.Refresh(); } } } ====SimplifySample.cs==== using System.Linq; using ThinkGeo.MapSuite.Core; using ThinkGeo.MapSuite.FormsEdition; namespace GeometricFunc { public class SimplifySample : BaseSampleView { public const string SampleName = "Simplify"; private static readonly double simplifyTolerence = 30; public override string Name { get { return SampleName; } } protected override void LoadMap() { MapView.MapUnit = GeographyUnit.Meter; MapView.CurrentExtent = GetBoundingBox(); Feature feature = GeometrySource.FirstOrDefault(); InMemoryFeatureLayer sourceLayer = new InMemoryFeatureLayer(); sourceLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = new AreaStyle(new GeoSolidBrush(BrushColor)); sourceLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle.OutlinePen.Width = 3; sourceLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle.OutlinePen.Color = GeoColor.StandardColors.Black; sourceLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; sourceLayer.InternalFeatures.Add(feature); LayerOverlay layerOverlay = new LayerOverlay(); layerOverlay.Layers.Add("SourceLayer", sourceLayer); MapView.Overlays.Add("LayerOverlay", layerOverlay); } protected override void ExecuteSample() { LayerOverlay layerOverlay = (LayerOverlay)MapView.Overlays["LayerOverlay"]; InMemoryFeatureLayer sourceLayer = (InMemoryFeatureLayer)layerOverlay.Layers["SourceLayer"]; AreaBaseShape sourceShape = (AreaBaseShape)sourceLayer.InternalFeatures.FirstOrDefault().GetShape(); SimplificationType simplificationType = SimplificationType.DouglasPeucker; MultipolygonShape multipolygonShape = sourceShape.Simplify(GeographyUnit.Meter, simplifyTolerence, DistanceUnit.Meter, simplificationType); sourceLayer.InternalFeatures.Clear(); sourceLayer.InternalFeatures.Add(new Feature(multipolygonShape)); layerOverlay.Refresh(); } } } ====SnapGPSSample.cs==== using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using ThinkGeo.MapSuite.Core; using ThinkGeo.MapSuite.FormsEdition; namespace GeometricFunc { public class SnapGPSSample : BaseSampleView { public const string SampleName = "Snapping"; public override string Name { get { return SampleName; } } private InMemoryFeatureLayer inProcessLayer; private InMemoryFeatureLayer resultLayer; protected override void LoadMap() { MapView.MapUnit = GeographyUnit.Meter; MapView.CurrentExtent = GetBoundingBox(); inProcessLayer = new InMemoryFeatureLayer(); resultLayer = new InMemoryFeatureLayer(); inProcessLayer.Open(); inProcessLayer.Columns.Add(new FeatureSourceColumn("Name", "character", 100)); resultLayer.Open(); resultLayer.Columns.Add(new FeatureSourceColumn("Name", "character", 100)); InitializeStyle(); foreach (var feature in GeometrySource) { inProcessLayer.InternalFeatures.Add(feature); } CollectVertices(inProcessLayer.InternalFeatures.Skip(1).ToArray(), resultLayer); LayerOverlay layerOverlay = new LayerOverlay(); layerOverlay.Layers.Add("SourceLayer", inProcessLayer); layerOverlay.Layers.Add("PointLayer", resultLayer); MapView.Overlays.Add("LayerOverlay", layerOverlay); } protected override void ExecuteSample() { LayerOverlay layerOverlay = (LayerOverlay)MapView.Overlays["LayerOverlay"]; resultLayer.InternalFeatures.Clear(); if (resultLayer.InternalFeatures.Count == 0) { inProcessLayer.IsVisible = false; Feature multilineFeature = inProcessLayer.InternalFeatures[0]; MultilineShape multilineShape = (MultilineShape)multilineFeature.GetShape(); Feature[] allFeatures = { inProcessLayer.InternalFeatures[1] }; double tolerance = 100; Collection matchFeatures = new Collection(); foreach (var item in allFeatures) { double tempDistance = multilineShape.GetShortestLineTo(item, GeographyUnit.Meter).GetLength(GeographyUnit.Meter, DistanceUnit.Feet); if (tempDistance < tolerance) { matchFeatures.Add(item); } } resultLayer.InternalFeatures.Add(multilineFeature); foreach (var feature in matchFeatures) { Collection vertices = new Collection(); PointShape resultShape = multilineShape.GetClosestPointTo(feature, GeographyUnit.Meter); MultilineShape tempMultilineShape = feature.GetShape() as MultilineShape; if (tempMultilineShape != null) { double offsetX = resultShape.X - tempMultilineShape.Lines[0].Vertices[0].X; double offsetY = resultShape.Y - tempMultilineShape.Lines[0].Vertices[0].Y; vertices.Add(new Vertex(resultShape)); double x = offsetX + tempMultilineShape.Lines[0].Vertices[1].X; double y = offsetY + tempMultilineShape.Lines[0].Vertices[1].Y; vertices.Add(new Vertex(x, y)); } resultLayer.InternalFeatures.Add(new Feature(new MultilineShape(new[] { new LineShape(vertices) }))); } foreach (var feature in allFeatures) { if (!matchFeatures.Contains(feature)) { resultLayer.InternalFeatures.Add(feature); } } CollectVertices(resultLayer.InternalFeatures.Skip(1).ToArray(), resultLayer); } layerOverlay.Refresh(); } private static void CollectVertices(IEnumerable features, InMemoryFeatureLayer featureLayer) { lock (features) { foreach (var multilineShape in features.Select(f => f.GetShape()).OfType()) { foreach (var vertex in multilineShape.Lines.SelectMany(l => l.Vertices)) { EllipseShape ellipseShape = new EllipseShape(new PointShape(vertex), 30); featureLayer.InternalFeatures.Add(new Feature(ellipseShape)); } } } } private void InitializeStyle() { GeoColor semiTransparentOrange = GeoColor.FromArgb(140, 255, 155, 13); inProcessLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.CreateSimpleAreaStyle(GeoColor.StandardColors.Transparent, GeoColor.StandardColors.Black); inProcessLayer.ZoomLevelSet.ZoomLevel01.DefaultLineStyle = LineStyles.CreateSimpleLineStyle(semiTransparentOrange, 3, false); inProcessLayer.ZoomLevelSet.ZoomLevel01.DefaultTextStyle = TextStyles.CreateSimpleTextStyle("Name", "Arial", 9, DrawingFontStyles.Regular, GeoColor.StandardColors.Black); inProcessLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; resultLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = inProcessLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle; resultLayer.ZoomLevelSet.ZoomLevel01.DefaultLineStyle = LineStyles.CreateSimpleLineStyle(semiTransparentOrange, 4, false); resultLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; } } } ====UnionSample.cs==== using System.Collections.Generic; using System.Linq; using ThinkGeo.MapSuite.Core; using ThinkGeo.MapSuite.FormsEdition; namespace GeometricFunc { public class UnionSample : BaseSampleView { public const string SampleName = "Union"; public override string Name { get { return SampleName; } } protected override void LoadMap() { MapView.MapUnit = GeographyUnit.Meter; MapView.CurrentExtent = GetBoundingBox(); InMemoryFeatureLayer sourceLayer = new InMemoryFeatureLayer(); sourceLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = new AreaStyle(new GeoSolidBrush(BrushColor)); sourceLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle.OutlinePen.Width = 3; sourceLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle.OutlinePen.Color = GeoColor.SimpleColors.Black; sourceLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; foreach (Feature feature in GeometrySource) { sourceLayer.InternalFeatures.Add(feature); } LayerOverlay layerOverlay = new LayerOverlay(); layerOverlay.Layers.Add("SourceLayer", sourceLayer); MapView.Overlays.Add("LayerOverlay", layerOverlay); } protected override void ExecuteSample() { LayerOverlay layerOverlay = (LayerOverlay)MapView.Overlays["LayerOverlay"]; InMemoryFeatureLayer sourceLayer = (InMemoryFeatureLayer)layerOverlay.Layers["SourceLayer"]; if (sourceLayer.InternalFeatures.Count > 1) { IEnumerable areaBaseShapes = sourceLayer.InternalFeatures.Select(f => f.GetShape()).OfType(); AreaBaseShape unionedAreaBaseShape = AreaBaseShape.Union(areaBaseShapes); sourceLayer.InternalFeatures.Clear(); sourceLayer.InternalFeatures.Add(new Feature(unionedAreaBaseShape)); layerOverlay.Refresh(); } } } } ====BaseSampleView.cs==== using System; using System.IO; using System.Linq; using System.Collections.ObjectModel; using System.Reflection; using System.Xml.Linq; using ThinkGeo.MapSuite.Core; using ThinkGeo.MapSuite.FormsEdition; using Xamarin.Forms; namespace GeometricFunc { public abstract class BaseSampleView : ContentView, IDisposable { protected static readonly GeoColor BrushColor = GeoColor.FromArgb(100, 0, 147, 221); private MapView mapView; private ToolbarItem sampleToolbarItem; private Collection geometrySource; public BaseSampleView() { mapView = new MapView(); mapView.MapUnit = GeographyUnit.Meter; mapView.CurrentExtent = new RectangleShape(-30, 10, 10, -10); Content = new Grid { Children = { mapView } }; var assembly = typeof(BaseSampleView).GetTypeInfo().Assembly; Stream stream = assembly.GetManifestResourceStream("GeometricFunc.AppData.GeometricFunctions.xml"); XDocument xdoc = XDocument.Load(stream); XElement selectSampleElement = xdoc.Root.Elements().FirstOrDefault(e => e.Attribute("Name").Value == Name); XElement geometrySourceElement = selectSampleElement.Element("GeometrySource"); foreach (var featureWktElement in geometrySourceElement.Elements()) { if (!string.IsNullOrEmpty(featureWktElement.Value)) { GeometrySource.Add(new Feature(featureWktElement.Value)); } } WorldMapKitOverlay worldOverlay = new WorldMapKitOverlay(); worldOverlay.Projection = WorldMapKitProjection.SphericalMercator; mapView.Overlays.Insert(0, "WMK", worldOverlay); LoadMap(); } public abstract string Name { get; } public MapView MapView { get { return mapView; } } public Collection GeometrySource { get { return geometrySource ?? (geometrySource = new Collection()); } } public virtual ToolbarItem SampleToolbarItem { get { if (sampleToolbarItem == null) { sampleToolbarItem = new ToolbarItem { Text = "GO", Name = "GO" }; sampleToolbarItem.Clicked += delegate { ExecuteSample(); }; } return sampleToolbarItem; } } protected virtual RectangleShape GetBoundingBox() { RectangleShape mapExtent = (RectangleShape)ExtentHelper.GetBoundingBoxOfItems(GeometrySource).CloneDeep(); mapExtent.ScaleUp(100); return mapExtent; } protected abstract void ExecuteSample(); protected abstract void LoadMap(); ~BaseSampleView() { Dispose(false); } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if (disposing) { mapView.Dispose(); } } } } ====SampleItem.cs==== using System; using Xamarin.Forms; namespace GeometricFunc { public class SampleItem { private string name; private ImageSource icon; private Type classType; public SampleItem(string name, string iconPathFilename, Type classType) { this.name = name; this.classType = classType; this.icon = new FileImageSource { File = iconPathFilename }; } public string Name { get { return name; } set { name = value; } } public ImageSource Icon { get { return icon; } set { icon = value; } } public Type ClassType { get { return classType; } set { classType = value; } } } } ====SampleHelper.cs==== using System.IO; using Xamarin.Forms; namespace GeometricFunc { public static class SampleHelper { public static readonly string SampleDataDictionary = Device.OnPlatform(@"AppData/", @"mnt/sdcard/MapSuiteSampleData/GeometricFunc", string.Empty); public static string GetDataPath(string fileName) { return Path.Combine(SampleDataDictionary, fileName); } } }