Table of Contents

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<Feature> 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<Feature> 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<BaseSampleView, string>(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<SampleItem> samples;  
         private Command openHelpUriCommand;  
 
         public event EventHandler SelectedSampleChanged;  
 
         public SampleListPage()  
         {  
             InitializeComponent();  
             samples = new ObservableCollection<SampleItem>();  
 
             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<SampleItem> 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<Feature> matchFeatures = new Collection<Feature>();  
                 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<Vertex> vertices = new Collection<Vertex>();  
                     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<Feature> features, InMemoryFeatureLayer featureLayer)  
         {  
             lock (features)  
             {  
                 foreach (var multilineShape in features.Select(f => f.GetShape()).OfType<MultilineShape>())  
                 {  
                     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<AreaBaseShape> areaBaseShapes = sourceLayer.InternalFeatures.Select(f => f.GetShape()).OfType<AreaBaseShape>();  
 
                 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<Feature> 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<Feature> GeometrySource  
         {  
             get { return geometrySource ?? (geometrySource = new Collection<Feature>()); }  
         }  
 
         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);  
         }  
     }  
 }