User Tools

Site Tools


source_code_androideditionsample_geometricfunctions.zip

Source Code AndroidEditionSample GeometricFunctions.zip

MainActivity.cs

 using Android.App;  
 using Android.Content;  
 using Android.OS;  
 using Android.Widget;  
 using System;  
 using System.Collections.Generic;  
 using System.Collections.ObjectModel;  
 using System.Globalization;  
 using System.IO;  
 using System.Linq;  
 using System.Reflection;  
 using System.Xml.Linq;  
 using ThinkGeo.MapSuite.Core;  
 
 namespace GeometricFunctions  
 {  
     [Activity(Label = "Geometric Func", Icon = "@drawable/icon", ConfigurationChanges = Android.Content.PM.ConfigChanges.Orientation | Android.Content.PM.ConfigChanges.KeyboardHidden | Android.Content.PM.ConfigChanges.ScreenSize)]  
     public class MainActivity : Activity  
     {  
         private ListView listView;  
         private SliderView sliderView;  
         private BaseSample activitySample;  
         private Collection<BaseSample> samples;  
         private List<Tuple<string, int>> listItems;  
 
         protected override void OnCreate(Bundle bundle)  
         {  
             base.OnCreate(bundle);  
             SetContentView(Resource.Layout.Main);  
 
             ActionBar.Hide();  
             listView = FindViewById<ListView>(Resource.Id.sampleListView);  
             sliderView = (SliderView)FindViewById(Resource.Id.slider_view);  
             ImageButton helpButton = FindViewById<ImageButton>(Resource.Id.sampleListMoreButton);  
 
             InitializeSmapleListView();  
             activitySample = samples.FirstOrDefault();  
             sliderView.MainView.AddView(samples.FirstOrDefault().GetSampleView());  
             helpButton.Click += delegate  
             {  
                 Intent helpIntent = new Intent(Intent.ActionView, Android.Net.Uri.Parse("http://www.thinkgeo.com"));  
                 StartActivity(helpIntent);  
             };  
         }  
 
         private void InitializeSmapleListView()  
         {  
             samples = new Collection<BaseSample>();  
             listItems = new List<Tuple<string, int>>();  
             XDocument xDoc = XDocument.Load(Assets.Open("GeometricFunctions.xml"));  
             if (xDoc.Root != null)  
             {  
                 foreach (var element in xDoc.Root.Elements())  
                 {  
                     string image = element.Attribute("Image").Value;  
                     string className = element.Attribute("Class").Value;  
                     string name = element.Attribute("Name").Value;  
                     XElement geometrySourceElement = element.Element("GeometrySource");  
 
                     BaseSample sample = (BaseSample)Activator.CreateInstance(Assembly.GetExecutingAssembly().GetType("GeometricFunctions." + className), this, sliderView);  
                     sample.TitleText = name;  
                     samples.Add(sample);  
 
                     foreach (var featureWktElement in geometrySourceElement.Elements())  
                     {  
                         if (!string.IsNullOrEmpty(featureWktElement.Value))  
                         {  
                             sample.GeometrySource.Add(new Feature(featureWktElement.Value));  
                         }  
                     }  
 
                     int resouceId = (int)typeof(Resource.Drawable).GetField(image).GetValue(null);  
                     listItems.Add(new Tuple<string, int>(name, resouceId));  
                 }  
             }  
             ActivityListItemAdapter adapter = new ActivityListItemAdapter(this, listItems);  
             listView.Adapter = adapter;  
             listView.ItemClick += sampleListView_ItemClick;  
         }  
 
         private void sampleListView_ItemClick(object sender, AdapterView.ItemClickEventArgs e)  
         {  
             sliderView.SetSlided(false);  
 
             activitySample.DisposeMap();  
             sliderView.MainView.RemoveAllViews();  
             sliderView.MainView.AddView(samples[e.Position].GetSampleView());  
             activitySample = samples[e.Position];  
         }  
     }  
 }  
 

SplashActivity.cs

 using Android.App;  
 using Android.OS;  
 using Android.Widget;  
 using System;  
 using System.Collections.Generic;  
 using System.Collections.ObjectModel;  
 using System.IO;  
 using System.Linq;  
 using System.Threading.Tasks;  
 
 namespace GeometricFunctions  
 {  
     [Activity(Theme = "@android:style/Theme.Light.NoTitleBar", MainLauncher = true, NoHistory = true, ScreenOrientation = Android.Content.PM.ScreenOrientation.Portrait,  
         ConfigurationChanges = Android.Content.PM.ConfigChanges.Orientation | Android.Content.PM.ConfigChanges.KeyboardHidden |  
         Android.Content.PM.ConfigChanges.ScreenSize)]  
     public class SplashActivity : Activity  
     {  
         private TextView uploadTextView;  
         private ProgressBar uploadProgressBar;  
 
         protected override void OnCreate(Bundle savedInstanceState)  
         {  
             base.OnCreate(savedInstanceState);  
             SetContentView(Resource.Layout.SplashLayout);  
 
             uploadTextView = FindViewById<TextView>(Resource.Id.uploadDataTextView);  
             uploadProgressBar = FindViewById<ProgressBar>(Resource.Id.uploadProgressBar);  
 
             Task updateSampleDatasTask = Task.Factory.StartNew(() =>  
             {  
                 Collection<string> unLoadDatas = CollectUnloadDatas(SampleHelper.SampleDataDictionary, SampleHelper.AssetsDataDictionary);  
                 UploadDataFiles(SampleHelper.SampleDataDictionary, unLoadDatas, OnCopyingSourceFile);  
 
                 uploadTextView.Post(() =>  
                 {  
                     uploadTextView.Text = "Ready";  
                     uploadProgressBar.Progress = 100;  
                 });  
             });  
 
             updateSampleDatasTask.ContinueWith(t =>  
             {  
                 uploadTextView.PostDelayed(() =>  
                 {  
                     StartActivity(typeof(MainActivity));  
                     Finish();  
                 }, 200);  
             });  
         }  
 
         private void OnCopyingSourceFile(string targetPathFilename, int completeCount, int totalCount)  
         {  
             uploadTextView.Post(() =>  
             {  
                 uploadTextView.Text = string.Format("Copying {0} ({1}/{2})", Path.GetFileName(targetPathFilename), completeCount, totalCount);  
                 uploadProgressBar.Progress = (int)(completeCount * 100f / totalCount);  
             });  
         }  
 
         private Collection<string> CollectUnloadDatas(string targetDirectory, string sourceDirectory)  
         {  
             Collection<string> result = new Collection<string>();  
 
             foreach (string filename in Assets.List(sourceDirectory))  
             {  
                 string sourcePath = System.IO.Path.Combine(sourceDirectory, filename);  
                 string targetPath = System.IO.Path.Combine(targetDirectory, sourcePath);  
 
                 bool isSourcePathAFile = !string.IsNullOrEmpty(Path.GetExtension(sourcePath));  
                 if (isSourcePathAFile && !File.Exists(targetPath))  
                 {  
                     result.Add(sourcePath);  
                 }  
                 else if (!isSourcePathAFile)  
                 {  
                     foreach (string item in CollectUnloadDatas(targetDirectory, sourcePath))  
                     {  
                         result.Add(item);  
                     }  
                 }  
             }  
             return result;  
         }  
 
         private void UploadDataFiles(string targetDirectory, IEnumerable<string> sourcePathFilenames, Action<string, int, int> onCopyingSourceFile = null)  
         {  
             int completeCount = 0;  
             if (!Directory.Exists(targetDirectory)) Directory.CreateDirectory(targetDirectory);  
 
             foreach (string sourcePathFilename in sourcePathFilenames)  
             {  
                 string targetPathFilename = Path.Combine(targetDirectory, sourcePathFilename);  
                 if (!File.Exists(targetPathFilename))  
                 {  
                     if (onCopyingSourceFile != null) onCopyingSourceFile(targetPathFilename, completeCount, sourcePathFilenames.Count());  
 
                     string targetPath = Path.GetDirectoryName(targetPathFilename);  
                     if (!Directory.Exists(targetPath)) Directory.CreateDirectory(targetPath);  
                     Stream sourceStream = Assets.Open(sourcePathFilename);  
                     FileStream fileStream = File.Create(targetPathFilename);  
                     sourceStream.CopyTo(fileStream);  
                     fileStream.Close();  
                     sourceStream.Close();  
 
                     completeCount++;  
                 }  
             }  
         }  
     }  
 }  
 

AssemblyInfo.cs

 using System.Reflection;  
 using System.Runtime.CompilerServices;  
 using System.Runtime.InteropServices;  
 using Android.App;  
 
 // 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("GeometricFunctions")]  
 [assembly: AssemblyDescription("")]  
 [assembly: AssemblyConfiguration("")]  
 [assembly: AssemblyCompany("")]  
 [assembly: AssemblyProduct("GeometricFunctions")]  
 [assembly: AssemblyCopyright("Copyright ©  2014")]  
 [assembly: AssemblyTrademark("")]  
 [assembly: AssemblyCulture("")]  
 [assembly: ComVisible(false)]  
 
 // 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")]  
 
 

Resource.Designer.cs

 #pragma warning disable 1591  
 //------------------------------------------------------------------------------  
 // <auto-generated>  
 //     This code was generated by a tool.  
 //     Runtime Version:4.0.30319.0  
 //  
 //     Changes to this file may cause incorrect behavior and will be lost if  
 //     the code is regenerated.  
 // </auto-generated>  
 //------------------------------------------------------------------------------  
 
 [assembly: global::Android.Runtime.ResourceDesignerAttribute("GeometricFunctions.Resource", IsApplication=true)]  
 
 namespace GeometricFunctions  
 {  
 
 
 	[System.CodeDom.Compiler.GeneratedCodeAttribute("Xamarin.Android.Build.Tasks", "1.0.0.0")]  
 	public partial class Resource  
 	{  
 
 		static Resource()  
 		{  
 			global::Android.Runtime.ResourceIdManager.UpdateIdValues();  
 		}  
 
 		public static void UpdateIdValues()  
 		{  
 			global::ThinkGeo.MapSuite.AndroidEdition.Resource.Drawable.icon_mapsuite_default256x256 = global::GeometricFunctions.Resource.Drawable.icon_mapsuite_default256x256;  
 			global::ThinkGeo.MapSuite.AndroidEdition.Resource.Drawable.icon_mapsuite_default512x512 = global::GeometricFunctions.Resource.Drawable.icon_mapsuite_default512x512;  
 			global::ThinkGeo.MapSuite.AndroidEdition.Resource.Drawable.icon_mapsuite_globe = global::GeometricFunctions.Resource.Drawable.icon_mapsuite_globe;  
 			global::ThinkGeo.MapSuite.AndroidEdition.Resource.Drawable.icon_mapsuite_globe_Pressed = global::GeometricFunctions.Resource.Drawable.icon_mapsuite_globe_Pressed;  
 			global::ThinkGeo.MapSuite.AndroidEdition.Resource.Drawable.icon_mapsuite_Minus = global::GeometricFunctions.Resource.Drawable.icon_mapsuite_Minus;  
 			global::ThinkGeo.MapSuite.AndroidEdition.Resource.Drawable.icon_mapsuite_Minus_Pressed = global::GeometricFunctions.Resource.Drawable.icon_mapsuite_Minus_Pressed;  
 			global::ThinkGeo.MapSuite.AndroidEdition.Resource.Drawable.icon_mapsuite_noImageTile = global::GeometricFunctions.Resource.Drawable.icon_mapsuite_noImageTile;  
 			global::ThinkGeo.MapSuite.AndroidEdition.Resource.Drawable.icon_mapsuite_Plus = global::GeometricFunctions.Resource.Drawable.icon_mapsuite_Plus;  
 			global::ThinkGeo.MapSuite.AndroidEdition.Resource.Drawable.icon_mapsuite_Plus_Pressed = global::GeometricFunctions.Resource.Drawable.icon_mapsuite_Plus_Pressed;  
 		}  
 
 		public partial class Attribute  
 		{  
 
 			static Attribute()  
 			{  
 				global::Android.Runtime.ResourceIdManager.UpdateIdValues();  
 			}  
 
 			private Attribute()  
 			{  
 			}  
 		}  
 
 		public partial class Drawable  
 		{  
 
 			// aapt resource value: 0x7f020000  
 			public const int bbox = 2130837504;  
 
 			// aapt resource value: 0x7f020001  
 			public const int buffer = 2130837505;  
 
 			// aapt resource value: 0x7f020002  
 			public const int centerPoint = 2130837506;  
 
 			// aapt resource value: 0x7f020003  
 			public const int clip = 2130837507;  
 
 			// aapt resource value: 0x7f020004  
 			public const int convexHull = 2130837508;  
 
 			// aapt resource value: 0x7f020005  
 			public const int detail40 = 2130837509;  
 
 			// aapt resource value: 0x7f020006  
 			public const int difference = 2130837510;  
 
 			// aapt resource value: 0x7f020007  
 			public const int getArea = 2130837511;  
 
 			// aapt resource value: 0x7f020008  
 			public const int getLength = 2130837512;  
 
 			// aapt resource value: 0x7f020009  
 			public const int Icon = 2130837513;  
 
 			// aapt resource value: 0x7f02000a  
 			public const int icon_mapsuite_default256x256 = 2130837514;  
 
 			// aapt resource value: 0x7f02000b  
 			public const int icon_mapsuite_default512x512 = 2130837515;  
 
 			// aapt resource value: 0x7f02000c  
 			public const int icon_mapsuite_globe = 2130837516;  
 
 			// aapt resource value: 0x7f02000d  
 			public const int icon_mapsuite_globe_Pressed = 2130837517;  
 
 			// aapt resource value: 0x7f02000e  
 			public const int icon_mapsuite_Minus = 2130837518;  
 
 			// aapt resource value: 0x7f02000f  
 			public const int icon_mapsuite_Minus_Pressed = 2130837519;  
 
 			// aapt resource value: 0x7f020010  
 			public const int icon_mapsuite_noImageTile = 2130837520;  
 
 			// aapt resource value: 0x7f020011  
 			public const int icon_mapsuite_Plus = 2130837521;  
 
 			// aapt resource value: 0x7f020012  
 			public const int icon_mapsuite_Plus_Pressed = 2130837522;  
 
 			// aapt resource value: 0x7f020013  
 			public const int iconstyle = 2130837523;  
 
 			// aapt resource value: 0x7f020014  
 			public const int lineOnLine = 2130837524;  
 
 			// aapt resource value: 0x7f020015  
 			public const int MapSuite = 2130837525;  
 
 			// aapt resource value: 0x7f020016  
 			public const int More = 2130837526;  
 
 			// aapt resource value: 0x7f020017  
 			public const int more40 = 2130837527;  
 
 			// aapt resource value: 0x7f020018  
 			public const int rotate = 2130837528;  
 
 			// aapt resource value: 0x7f020019  
 			public const int scale = 2130837529;  
 
 			// aapt resource value: 0x7f02001a  
 			public const int settings40 = 2130837530;  
 
 			// aapt resource value: 0x7f02001b  
 			public const int shortestLine = 2130837531;  
 
 			// aapt resource value: 0x7f02001c  
 			public const int simplify = 2130837532;  
 
 			// aapt resource value: 0x7f02001d  
 			public const int SliderLineBackground = 2130837533;  
 
 			// aapt resource value: 0x7f02001e  
 			public const int snapGps = 2130837534;  
 
 			// aapt resource value: 0x7f02001f  
 			public const int union = 2130837535;  
 
 			static Drawable()  
 			{  
 				global::Android.Runtime.ResourceIdManager.UpdateIdValues();  
 			}  
 
 			private Drawable()  
 			{  
 			}  
 		}  
 
 		public partial class Id  
 		{  
 
 			// aapt resource value: 0x7f050008  
 			public const int ExecuteButton = 2131034120;  
 
 			// aapt resource value: 0x7f050005  
 			public const int LabelStylingLayout = 2131034117;  
 
 			// aapt resource value: 0x7f050009  
 			public const int MapContainerView = 2131034121;  
 
 			// aapt resource value: 0x7f050006  
 			public const int SampleListButton = 2131034118;  
 
 			// aapt resource value: 0x7f050007  
 			public const int TitleTextView = 2131034119;  
 
 			// aapt resource value: 0x7f050004  
 			public const int mainLinearLayout = 2131034116;  
 
 			// aapt resource value: 0x7f050003  
 			public const int sampleListMoreButton = 2131034115;  
 
 			// aapt resource value: 0x7f050001  
 			public const int sampleListTitle = 2131034113;  
 
 			// aapt resource value: 0x7f050002  
 			public const int sampleListView = 2131034114;  
 
 			// aapt resource value: 0x7f050000  
 			public const int slider_view = 2131034112;  
 
 			// aapt resource value: 0x7f05000b  
 			public const int uploadDataTextView = 2131034123;  
 
 			// aapt resource value: 0x7f05000a  
 			public const int uploadProgressBar = 2131034122;  
 
 			static Id()  
 			{  
 				global::Android.Runtime.ResourceIdManager.UpdateIdValues();  
 			}  
 
 			private Id()  
 			{  
 			}  
 		}  
 
 		public partial class Layout  
 		{  
 
 			// aapt resource value: 0x7f030000  
 			public const int ButtonBackgroundSelector = 2130903040;  
 
 			// aapt resource value: 0x7f030001  
 			public const int Main = 2130903041;  
 
 			// aapt resource value: 0x7f030002  
 			public const int SampleBaseLayout = 2130903042;  
 
 			// aapt resource value: 0x7f030003  
 			public const int SplashLayout = 2130903043;  
 
 			static Layout()  
 			{  
 				global::Android.Runtime.ResourceIdManager.UpdateIdValues();  
 			}  
 
 			private Layout()  
 			{  
 			}  
 		}  
 
 		public partial class String  
 		{  
 
 			// aapt resource value: 0x7f040001  
 			public const int ApplicationName = 2130968577;  
 
 			// aapt resource value: 0x7f040000  
 			public const int Hello = 2130968576;  
 
 			static String()  
 			{  
 				global::Android.Runtime.ResourceIdManager.UpdateIdValues();  
 			}  
 
 			private String()  
 			{  
 			}  
 		}  
 	}  
 }  
 #pragma warning restore 1591  
 
 

BufferSample.cs

 using Android.Content;  
 using System.Linq;  
 using ThinkGeo.MapSuite.AndroidEdition;  
 using ThinkGeo.MapSuite.Core;  
 
 namespace GeometricFunctions  
 {  
     public class BufferSample : BaseSample  
     {  
         private int bufferSize;  
 
         public BufferSample(Context context, SliderView sliderView)  
             : base(context, sliderView)  
         { }  
 
         protected override void Execute()  
         {  
             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();  
         }  
 
         protected override void InitalizeMap()  
         {  
             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);  
         }  
     }  
 }  
 

CenterPointSample.cs

 using Android.Content;  
 using System.Linq;  
 using ThinkGeo.MapSuite.AndroidEdition;  
 using ThinkGeo.MapSuite.Core;  
 
 namespace GeometricFunctions  
 {  
     public class CenterPointSample : BaseSample  
     {  
         private ManagedProj4Projection projection;  
 
         public CenterPointSample(Context context, SliderView sliderView)  
             : base(context, sliderView)  
         { }  
 
         protected override void Execute()  
         {  
             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();  
         }  
 
         protected override void InitalizeMap()  
         {  
             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);  
         }  
     }  
 }  
 

ClipSample.cs

 using Android.Content;  
 using System.Collections.ObjectModel;  
 using System.Linq;  
 using ThinkGeo.MapSuite.AndroidEdition;  
 using ThinkGeo.MapSuite.Core;  
 
 namespace GeometricFunctions  
 {  
     public class ClipSample : BaseSample  
     {  
         public ClipSample(Context context, SliderView sliderView)  
             : base(context, sliderView)  
         { }  
 
         protected override void Execute()  
         {  
             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();  
         }  
 
         protected override void InitalizeMap()  
         {  
             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);  
         }  
     }  
 }  
 

ConvexHullSample.cs

 using System.Linq;  
 using Android.Content;  
 using System.Collections.ObjectModel;  
 using ThinkGeo.MapSuite.AndroidEdition;  
 using ThinkGeo.MapSuite.Core;  
 
 namespace GeometricFunctions  
 {  
     public class ConvexHullSample : BaseSample  
     {  
         public ConvexHullSample(Context context, SliderView sliderView)  
             : base(context, sliderView)  
         { }  
 
         protected override void Execute()  
         {  
             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();  
         }  
 
         protected override void InitalizeMap()  
         {  
             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);  
         }  
     }  
 }  
 

DifferenceSample.cs

 using Android.Content;  
 using ThinkGeo.MapSuite.AndroidEdition;  
 using ThinkGeo.MapSuite.Core;  
 
 namespace GeometricFunctions  
 {  
     public class DifferenceSample : BaseSample  
     {  
         public DifferenceSample(Context context, SliderView sliderView)  
             : base(context, sliderView)  
         { }  
 
         protected override void Execute()  
         {  
             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();  
             }  
         }  
 
         protected override void InitalizeMap()  
         {  
             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);  
         }  
     }  
 }  
 

EnvelopSample.cs

 using Android.Content;  
 using System.Linq;  
 using ThinkGeo.MapSuite.AndroidEdition;  
 using ThinkGeo.MapSuite.Core;  
 
 namespace GeometricFunctions  
 {  
     public class EnvelopSample : BaseSample  
     {  
         public EnvelopSample(Context context, SliderView sliderView)  
             : base(context, sliderView)  
         { }  
 
         protected override void Execute()  
         {  
             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();  
         }  
 
         protected override void InitalizeMap()  
         {  
             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);  
         }  
     }  
 }  
 

GetAreaSample.cs

 using Android.Content;  
 using Android.Widget;  
 using System.Globalization;  
 using System.Linq;  
 using ThinkGeo.MapSuite.AndroidEdition;  
 using ThinkGeo.MapSuite.Core;  
 
 namespace GeometricFunctions  
 {  
     public class GetAreaSample : BaseSample  
     {  
         private Context context;  
 
         public GetAreaSample(Context context, SliderView sliderView)  
             : base(context, sliderView)  
         {  
             this.context = context;  
         }  
 
         protected override void Execute()  
         {  
             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();  
                 layerOverlay.Refresh();  
             }  
         }  
 
         protected override void InitalizeMap()  
         {  
             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;  
             GeometrySource.First().ColumnValues.Clear();  
             sourceLayer.InternalFeatures.Add(GeometrySource.First());  
 
             LayerOverlay layerOverlay = new LayerOverlay();  
             layerOverlay.Layers.Add("SourceLayer", sourceLayer);  
             MapView.Overlays.Add("LayerOverlay", layerOverlay);  
         }  
     }  
 }  
 

GetLengthSample.cs

 using Android.Content;  
 using Android.Widget;  
 using System.Globalization;  
 using System.Linq;  
 using ThinkGeo.MapSuite.AndroidEdition;  
 using ThinkGeo.MapSuite.Core;  
 
 namespace GeometricFunctions  
 {  
     public class GetLengthSample : BaseSample  
     {  
         private Context context;  
 
         public GetLengthSample(Context context, SliderView sliderView)  
             : base(context, sliderView)  
         {  
             this.context = context;  
         }  
 
         protected override void Execute()  
         {  
             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);  
 
                 Toast.MakeText(context, lengthContent, ToastLength.Long).Show();  
 
                 layerOverlay.Refresh();  
             }  
         }  
 
         protected override void InitalizeMap()  
         {  
             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);  
         }  
     }  
 }  
 

GetShortestLineSample.cs

 using Android.Content;  
 using System.Globalization;  
 using ThinkGeo.MapSuite.AndroidEdition;  
 using ThinkGeo.MapSuite.Core;  
 
 namespace GeometricFunctions  
 {  
     public class GetShortestLineSample : BaseSample  
     {  
         public GetShortestLineSample(Context context, SliderView sliderView)  
             : base(context, sliderView)  
         { }  
 
         protected override void Execute()  
         {  
             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();  
         }  
 
         protected override void InitalizeMap()  
         {  
             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);  
         }  
     }  
 }  
 

LineOnLineSample.cs

 using Android.Content;  
 using System.Linq;  
 using ThinkGeo.MapSuite.AndroidEdition;  
 using ThinkGeo.MapSuite.Core;  
 
 namespace GeometricFunctions  
 {  
     public class LineOnLineSample : BaseSample  
     {  
         public LineOnLineSample(Context context, SliderView sliderView)  
             : base(context, sliderView)  
         { }  
 
         protected override void Execute()  
         {  
             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();  
             }  
         }  
 
         protected override void InitalizeMap()  
         {  
             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);  
         }  
     }  
 }  
 

RotateSample.cs

 using Android.Content;  
 using System.Linq;  
 using ThinkGeo.MapSuite.AndroidEdition;  
 using ThinkGeo.MapSuite.Core;  
 
 namespace GeometricFunctions  
 {  
     public class RotateSample : BaseSample  
     {  
         public RotateSample(Context context, SliderView sliderView)  
             : base(context, sliderView)  
         { }  
 
         protected override void Execute()  
         {  
             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();  
             }  
         }  
 
         protected override void InitalizeMap()  
         {  
             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);  
         }  
     }  
 }  
 

ScaleSample.cs

 using Android.Content;  
 using System.Linq;  
 using ThinkGeo.MapSuite.AndroidEdition;  
 using ThinkGeo.MapSuite.Core;  
 
 namespace GeometricFunctions  
 {  
     public class ScaleSample : BaseSample  
     {  
         public ScaleSample(Context context, SliderView sliderView)  
             : base(context, sliderView)  
         { }  
 
         protected override void Execute()  
         {  
             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();  
         }  
 
         protected override void InitalizeMap()  
         {  
             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);  
         }  
     }  
 }  
 

SimplifySample.cs

 using Android.Content;  
 using System.Linq;  
 using ThinkGeo.MapSuite.AndroidEdition;  
 using ThinkGeo.MapSuite.Core;  
 
 namespace GeometricFunctions  
 {  
     public class SimplifySample : BaseSample  
     {  
         private static readonly double simplifyTolerence = 30;  
 
         public SimplifySample(Context context, SliderView sliderView)  
             : base(context, sliderView)  
         { }  
 
         protected override void Execute()  
         {  
             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();  
         }  
 
         protected override void InitalizeMap()  
         {  
             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);  
         }  
     }  
 }  
 

SnapGPSSample.cs

 using Android.Content;  
 using System.Collections.Generic;  
 using System.Collections.ObjectModel;  
 using System.Linq;  
 using ThinkGeo.MapSuite.AndroidEdition;  
 using ThinkGeo.MapSuite.Core;  
 
 namespace GeometricFunctions  
 {  
     public class SnapGPSSample : BaseSample  
     {  
         private InMemoryFeatureLayer inProcessLayer;  
         private InMemoryFeatureLayer resultLayer;  
 
         public SnapGPSSample(Context context, SliderView sliderView)  
             : base(context, sliderView)  
         { }  
 
         protected override void Execute()  
         {  
             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();  
         }  
 
         protected override void InitalizeMap()  
         {  
             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);  
         }  
 
         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;  
         }  
     }  
 }  
 

SplitSample.cs

 using Android.Content;  
 
 namespace GeometricFunctions  
 {  
     public class SplitSample : BaseSample  
     {  
         public SplitSample(Context context, SliderView sliderView)  
             : base(context, sliderView)  
         {  
         }  
 
         protected override void InitalizeMap()  
         {  
         }  
     }  
 }  
 

UnionSample.cs

 using System.Collections.Generic;  
 using System.Linq;  
 using Android.Content;  
 using ThinkGeo.MapSuite.AndroidEdition;  
 using ThinkGeo.MapSuite.Core;  
 
 namespace GeometricFunctions  
 {  
     public class UnionSample : BaseSample  
     {  
         public UnionSample(Context context, SliderView sliderView)  
             : base(context, sliderView)  
         { }  
 
         protected override void Execute()  
         {  
             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();  
             }  
         }  
 
         protected override void InitalizeMap()  
         {  
             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);  
         }  
     }  
 }  
 

BaseSample.cs

 using Android.App;  
 using Android.Content;  
 using Android.Graphics;  
 using Android.Util;  
 using Android.Views;  
 using Android.Widget;  
 using System;  
 using System.Collections.ObjectModel;  
 using ThinkGeo.MapSuite.AndroidEdition;  
 using ThinkGeo.MapSuite.Core;  
 
 namespace GeometricFunctions  
 {  
     public abstract class BaseSample  
     {  
         protected static readonly GeoColor BrushColor = GeoColor.FromArgb(100, 0, 147, 221);  
 
         private MapView mapView;  
         private View sampleView;  
         private TextView titleTextView;  
         private SliderView sliderView;  
         private Button executeButton;  
         private Collection<Feature> geometrySource;  
 
         protected BaseSample(Context context, SliderView sliderView)  
         {  
             this.sliderView = sliderView;  
             this.sampleView = View.Inflate(context, Resource.Layout.SampleBaseLayout, null);  
             this.executeButton = sampleView.FindViewById<Button>(Resource.Id.ExecuteButton);  
             this.titleTextView = sampleView.FindViewById<TextView>(Resource.Id.TitleTextView);  
 
             ImageButton sampleListButton = sampleView.FindViewById<ImageButton>(Resource.Id.SampleListButton);  
             sampleListButton.Click += SampleListButtonClick;  
             executeButton.Click += ExecuteButtonClick;  
         }  
 
         public string TitleText  
         {  
             get { return titleTextView.Text; }  
             set { titleTextView.Text = value; }  
         }  
 
         public SliderView SliderView  
         {  
             get { return sliderView; }  
         }  
 
         public Collection<Feature> GeometrySource  
         {  
             get { return geometrySource ?? (geometrySource = new Collection<Feature>()); }  
         }  
 
         protected MapView MapView  
         {  
             get { return mapView ?? (mapView = new MapView(Application.Context)); }  
         }  
 
         public virtual View GetSampleView()  
         {  
             try  
             {  
                 FrameLayout mapContainerView = sampleView.FindViewById<FrameLayout>(Resource.Id.MapContainerView);  
 
                 mapContainerView.RemoveAllViews();  
                 mapView = new MapView(Application.Context);  
                 InitalizeBaseMap();  
                 InitalizeMap();  
 
                 mapContainerView.AddView(mapView);  
             }  
             catch (Exception ex)  
             {  
                 Log.Debug("Sample Changed", ex.Message);  
             }  
             return sampleView;  
         }  
 
         public void DisposeMap()  
         {  
             if (mapView != null && mapView.Parent != null)  
             {  
                 FrameLayout mapContainerView = sampleView.FindViewById<FrameLayout>(Resource.Id.MapContainerView);  
                 mapContainerView.RemoveAllViews();  
 
                 mapView.Dispose();  
                 mapView = null;  
                 GC.Collect();  
                 GC.WaitForPendingFinalizers();  
             }  
         }  
 
         protected abstract void InitalizeMap();  
 
         protected virtual void Execute()  
         { }  
 
         protected virtual RectangleShape GetBoundingBox()  
         {  
             RectangleShape mapExtent = (RectangleShape)ExtentHelper.GetBoundingBoxOfItems(GeometrySource).CloneDeep();  
             mapExtent.ScaleUp(100);  
             return mapExtent;  
         }  
 
         private void InitalizeBaseMap()  
         {  
             if (!MapView.Overlays.Contains("WMK"))  
             {  
                 MapView.SetBackgroundColor(Color.Argb(255, 244, 242, 238));  
                 WorldMapKitOverlay worldOverlay = new WorldMapKitOverlay();  
                 worldOverlay.TileType = TileType.MultiTile;  
                 worldOverlay.Projection = WorldMapKitProjection.SphericalMercator;  
                 string baseFolder = Android.OS.Environment.ExternalStorageDirectory.AbsolutePath;  
                 string cachePathFilename = System.IO.Path.Combine(baseFolder, "MapSuiteTileCaches/SampleCaches.db");  
                 worldOverlay.TileCache = new SqliteBitmapTileCache(cachePathFilename, "SphericalMercator");  
                 MapView.Overlays.Insert(0, "WMK", worldOverlay);  
             }  
         }  
 
         private void SampleListButtonClick(object sender, EventArgs e)  
         {  
             sliderView.SetSlided(!sliderView.IsSlided());  
         }  
 
         private void ExecuteButtonClick(object sender, EventArgs e)  
         {  
             Execute();  
         }  
     }  
 }  
 

ActivityListItemAdapter.cs

 using Android.App;  
 using Android.Graphics;  
 using Android.Views;  
 using Android.Widget;  
 using System;  
 using System.Collections.Generic;  
 
 namespace GeometricFunctions  
 {  
     public class ActivityListItemAdapter : ArrayAdapter<Tuple<string, int>>  
     {  
         private Activity context;  
         private float ratio;  
 
         public ActivityListItemAdapter(Activity context, IList<Tuple<string, int>> objects)  
             : base(context, Android.Resource.Id.Text1, objects)  
         {  
             this.context = context;  
         }  
 
         public override View GetView(int position, View convertView, ViewGroup parent)  
         {  
             ratio = context.Resources.DisplayMetrics.Density;  
 
             LinearLayout layout = (LinearLayout)context.LayoutInflater.Inflate(Android.Resource.Layout.ActivityListItem, null);  
             var item = GetItem(position);  
 
             TextView textView = layout.FindViewById<TextView>(Android.Resource.Id.Text1);  
             textView.Text = item.Item1;  
             textView.SetTextColor(Color.Black);  
             textView.SetTextSize(Android.Util.ComplexUnitType.Px, 14 * ratio);  
             ((LinearLayout.LayoutParams)(textView.LayoutParameters)).Gravity = GravityFlags.CenterVertical;  
 
             ImageView imageView = layout.FindViewById<ImageView>(Android.Resource.Id.Icon);  
             imageView.SetImageResource(item.Item2);  
             imageView.LayoutParameters.Width = (int)(30 * ratio);  
             imageView.LayoutParameters.Height = (int)(30 * ratio);  
             ((LinearLayout.LayoutParams)imageView.LayoutParameters).SetMargins(0, (int)(2 * ratio), 0, (int)(2 * ratio));  
 
             return layout;  
         }  
     }  
 }  
 

SampleHelper.cs

 using System.IO;  
 
 namespace GeometricFunctions  
 {  
     internal class SampleHelper  
     {  
         public readonly static string AssetsDataDictionary = @"AppData";  
         public readonly static string SampleDataDictionary = @"mnt/sdcard/MapSuiteSampleData/GeometricFunctions";  
 
         public static string GetDataPath(string fileName)  
         {  
             return Path.Combine(SampleDataDictionary, AssetsDataDictionary, fileName);  
         }  
     }  
 }  
 

SliderView.cs

 using Android.Content;  
 using Android.Util;  
 using Android.Views;  
 using Android.Widget;  
 using System;  
 
 namespace GeometricFunctions  
 {  
     public class SliderView : ViewGroup  
     {  
         private static readonly int VELOCITY_X_SPEED = 800;  
 
         private float x;  
         private Context context;  
         private Scroller scroller;  
         private bool dispatched;  
         private bool slided;  
         private int leftViewWidth;  
         private int startScrollLeftOffset;  
         private VelocityTracker mVelocityTracker;  
 
         public SliderView(Context context, IAttributeSet attrs)  
             : base(context, attrs)  
         {  
             this.context = context;  
             this.leftViewWidth = 200;  
             this.scroller = new Scroller(context);  
         }  
 
         public int LeftViewWidth  
         {  
             get { return leftViewWidth; }  
             set { leftViewWidth = value; }  
         }  
 
         public View LeftView  
         {  
             get { return this.GetChildAt(0); }  
         }  
 
         public ViewGroup MainView  
         {  
             get { return this.GetChildAt(1) as ViewGroup; }  
         }  
 
         protected override void OnLayout(bool arg0, int arg1, int arg2, int arg3, int arg4)  
         {  
             int childCount = this.ChildCount;  
             for (int i = 0; i < childCount; ++i)  
             {  
                 View view = this.GetChildAt(i);  
                 if (view.Visibility != ViewStates.Gone)  
                 {  
                     view.Layout(0, 0, view.MeasuredWidth, view.MeasuredHeight);  
                 }  
             }  
         }  
 
         public override bool OnInterceptTouchEvent(MotionEvent ev)  
         {  
             return true;  
         }  
 
         public override bool OnTouchEvent(MotionEvent e)  
         {  
             if (mVelocityTracker == null)  
             {  
                 mVelocityTracker = VelocityTracker.Obtain();  
             }  
             mVelocityTracker.AddMovement(e);  
             MotionEventActions action = e.Action;  
             if (action == MotionEventActions.Down)  
             {  
                 x = e.GetX();  
 
                 if (IsSlided())  
                 {  
                     dispatched = DispatchTouchEventToView(GetChildAt(0), e);  
                 }  
                 else  
                 {  
                     dispatched = DispatchTouchEventToView(GetChildAt(1), e);  
                 }  
             }  
             else if (action == MotionEventActions.Move)  
             {  
                 if (dispatched)  
                 {  
                     if (IsSlided())  
                     {  
                         DispatchTouchEventToView(GetChildAt(0), e);  
                     }  
                     else  
                     {  
                         DispatchTouchEventToView(GetChildAt(1), e);  
                     }  
                 }  
                 else  
                 {  
                     float dx = e.GetX() - x;  
                     View view = this.GetChildAt(1);  
                     int left = (int)(view.Left + dx);  
                     if (left >= 0)  
                     {  
                         view.Layout(left, view.Top, view.Width + left,  
                                 view.Top + view.Height);  
                     }  
                 }  
                 x = e.GetX();  
             }  
             else if (action == MotionEventActions.Cancel  
                   || action == MotionEventActions.Up)  
             {  
                 if (dispatched)  
                 {  
                     if (IsSlided())  
                     {  
                         DispatchTouchEventToView(GetChildAt(0), e);  
                     }  
                     else  
                     {  
                         DispatchTouchEventToView(GetChildAt(1), e);  
                     }  
                 }  
                 else  
                 {  
                     mVelocityTracker.ComputeCurrentVelocity(1000);  
                     int velocityX = (int)mVelocityTracker.GetXVelocity(0);  
                     if (velocityX > VELOCITY_X_SPEED)  
                     {  
                         SetSlided(true);  
                     }  
                     else if (velocityX < -VELOCITY_X_SPEED)  
                     {  
                         SetSlided(false);  
                     }  
                     else  
                     {  
                         View view = GetChildAt(1);  
                         if (view.Left >= view.Width / 2)  
                         {  
                             SetSlided(true);  
                         }  
                         else  
                         {  
                             SetSlided(false);  
                         }  
                     }  
                     if (mVelocityTracker != null)  
                     {  
                         try  
                         {  
                             mVelocityTracker.Recycle();  
                         }  
                         catch  
                         { }  
                     }  
                 }  
             }  
             else if (!IsSlided())  
             {  
                 DispatchTouchEventToView(GetChildAt(1), e);  
             }  
             return true;  
         }  
 
         public bool IsSlided()  
         {  
             return slided;  
         }  
 
         public void SetSlided(bool slided)  
         {  
             View view = GetChildAt(1);  
             startScrollLeftOffset = view.Left;  
             if (slided)  
             {  
                 scroller.StartScroll(0, Top, (int)(leftViewWidth * context.Resources.DisplayMetrics.Density) - startScrollLeftOffset, 0);  
             }  
             else  
             {  
                 scroller.StartScroll(0, Top, -startScrollLeftOffset, 0);  
             }  
             this.slided = slided;  
             PostInvalidate();  
         }  
 
 
         public override void ComputeScroll()  
         {  
             if (scroller.ComputeScrollOffset())  
             {  
                 View view = GetChildAt(1);  
                 int left = startScrollLeftOffset + scroller.CurrX;  
                 view.Layout(left, view.Top, left + view.Width, view.Height);  
                 PostInvalidate();  
             }  
         }  
 
         protected override void OnMeasure(int widthMeasureSpec, int heightMeasureSpec)  
         {  
             base.OnMeasure(widthMeasureSpec, heightMeasureSpec);  
             for (int i = 0; i < ChildCount; ++i)  
             {  
                 GetChildAt(i).Measure(widthMeasureSpec, heightMeasureSpec);  
             }  
         }  
 
         public bool DispatchTouchEventToView(View view, MotionEvent ev)  
         {  
             try  
             {  
                 return view.DispatchTouchEvent(ev);  
             }  
             catch (Exception e)  
             {  
                 // some machines will throw exception  
 
             }  
             return false;  
         }  
     }  
 }  
 
source_code_androideditionsample_geometricfunctions.zip.txt · Last modified: 2015/09/14 02:20 by admin