====== Source Code iOSEditionSample GeometricFunctions.zip ====== ====AppDelegate.cs==== using Foundation; using UIKit; namespace GeometricFunctions { // The UIApplicationDelegate for the application. This class is responsible for launching the // User Interface of the application, as well as listening (and optionally responding) to // application events from iOS. [Register("AppDelegate")] public partial class AppDelegate : UIApplicationDelegate { // class-level declarations public override UIWindow Window { get; set; } // This method is invoked when the application is about to move from active to inactive state. // OpenGL applications should use this method to pause. public override void OnResignActivation(UIApplication application) { } // This method should be used to release shared resources and it should store the application state. // If your application supports background exection this method is called instead of WillTerminate // when the user quits. public override void DidEnterBackground(UIApplication application) { } // This method is called as part of the transiton from background to active state. public override void WillEnterForeground(UIApplication application) { } // This method is called when the application is about to terminate. Save data, if needed. public override void WillTerminate(UIApplication application) { } } } ====Main.cs==== using UIKit; namespace GeometricFunctions { public class Application { // This is the main entry point of the application. static void Main(string[] args) { // if you want to use a different Application Delegate class from "AppDelegate" // you can specify it here. UIApplication.Main(args, null, "AppDelegate"); } } } ====MainViewController.cs==== using MonoTouch.Dialog; using UIKit; using System; using System.Collections.ObjectModel; using System.Linq; using System.Reflection; using System.Xml.Linq; using ThinkGeo.MapSuite.Core; namespace GeometricFunctions { public partial class MainViewController : UIViewController { private SliderViewController navigation; public MainViewController(IntPtr handle) : base(handle) { } public override void ViewDidLoad() { base.ViewDidLoad(); navigation = new SliderViewController(); navigation.Position = FlyOutPosition.Left; navigation.View.Frame = UIScreen.MainScreen.Bounds; View.AddSubview(navigation.View); AddChildViewController(navigation); XDocument xDoc = XDocument.Load("AppData/GeometricFunctions.xml"); Section section = new Section("Style List"); if (xDoc.Root != null) { Collection styleList = new Collection(); Assembly currentAssembly = Assembly.GetExecutingAssembly(); foreach (var element in xDoc.Root.Elements()) { string name = element.Attribute("Name").Value; string image = element.Attribute("Image").Value; string className = element.Attribute("Class").Value; UIImage icon = UIImage.FromBundle(image); BadgeElement iconItem = new BadgeElement(icon, name); section.Add(iconItem); Type sampleType = currentAssembly.GetType("GeometricFunctions." + className); DetailViewController rootController = (DetailViewController)Activator.CreateInstance(sampleType); XElement geometrySourceElement = element.Element("GeometrySource"); foreach (var featureWktElement in geometrySourceElement.Elements()) { if (!string.IsNullOrEmpty(featureWktElement.Value)) { rootController.GeometrySource.Add(new Feature(featureWktElement.Value)); } } rootController.DetailButtonClick = navigation.ToggleMenu; rootController.Title = name; UINavigationController mainController = new UINavigationController(rootController); styleList.Add(mainController); } navigation.ViewControllers = styleList.ToArray(); } navigation.NavigationRoot = new RootElement("Style List") { section }; } } } ====MainViewController.designer.cs==== // WARNING // // This file has been generated automatically by Xamarin Studio from the outlets and // actions declared in your storyboard file. // Manual changes to this file will not be maintained. // using System; using Foundation; using UIKit; using System.CodeDom.Compiler; namespace GeometricFunctions { [Register|("MainViewController")] partial class MainViewController { void ReleaseDesignerOutlets () { } } } ====BufferViewController.cs==== using System.Linq; using ThinkGeo.MapSuite.Core; using ThinkGeo.MapSuite.iOSEdition; namespace GeometricFunctions { public class BufferViewController : DetailViewController { private int bufferSize; public BufferViewController() { } protected override void InitializeMap() { 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.TileType = TileType.SingleTile; layerOverlay.Layers.Add("BufferedLayer", bufferedLayer); layerOverlay.Layers.Add("SourceLayer", sourceLayer); MapView.Overlays.Add("LayerOverlay", layerOverlay); MapView.Refresh(); } 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(); } } } ====CenterPointViewController.cs==== using System.Globalization; using System.Linq; using ThinkGeo.MapSuite.Core; using ThinkGeo.MapSuite.iOSEdition; namespace GeometricFunctions { public class CenterPointViewController : DetailViewController { private ManagedProj4Projection projection; public CenterPointViewController() { } protected override void InitializeMap() { 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.TileType = TileType.SingleTile; layerOverlay.Layers.Add("SourceLayer", sourceLayer); layerOverlay.Layers.Add("PointLayer", pointLayer); MapView.Overlays.Add("LayerOverlay", layerOverlay); MapView.Refresh(); } protected override void Execute() { LayerOverlay layerOverlay = (LayerOverlay)MapView.Overlays["LayerOverlay"]; InMemoryFeatureLayer pointLayer = (InMemoryFeatureLayer)layerOverlay.Layers["PointLayer"]; InMemoryFeatureLayer sourceLayer = (InMemoryFeatureLayer)layerOverlay.Layers["SourceLayer"]; pointLayer.Clear(); Feature feature = sourceLayer.InternalFeatures.FirstOrDefault(); Feature centerFeature = new Feature(feature.GetBoundingBox().GetCenterPoint()); PointShape centerPoint = (PointShape)projection.ConvertToExternalProjection(centerFeature.CloneDeep()).GetShape(); centerFeature.ColumnValues["Type"] = string.Format(CultureInfo.InvariantCulture, "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(CultureInfo.InvariantCulture, "Centroid at Lon: {0:N4}, Lat: {1:N4}", centroidPoint.X, centroidPoint.Y); pointLayer.InternalFeatures.Add(centroidFeature); layerOverlay.Refresh(); } } } ====ClipViewController.cs==== using System.Collections.ObjectModel; using System.Linq; using ThinkGeo.MapSuite.Core; using ThinkGeo.MapSuite.iOSEdition; namespace GeometricFunctions { public class ClipViewController : DetailViewController { public ClipViewController() { } protected override void InitializeMap() { 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.TileType = TileType.SingleTile; layerOverlay.Layers.Add("SourceLayer", sourceLayer); layerOverlay.Layers.Add("ClippingLayer", clippingLayer); MapView.Overlays.Add("LayerOverlay", layerOverlay); MapView.Refresh(); } 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 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(); } } } ====ConvexHullViewController.cs==== using System.Collections.ObjectModel; using System.Linq; using ThinkGeo.MapSuite.Core; using ThinkGeo.MapSuite.iOSEdition; namespace GeometricFunctions { public class ConvexHullViewController : DetailViewController { public ConvexHullViewController() { } protected override void InitializeMap() { 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(@"AppData/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.TileType = TileType.SingleTile; layerOverlay.Layers.Add("SourceLayer", sourceLayer); layerOverlay.Layers.Add("ConvexHullLayer", convexHullLayer); MapView.Overlays.Add("LayerOverlay", layerOverlay); MapView.Refresh(); } 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 features = sourceLayer.FeatureSource.GetAllFeatures(ReturningColumnsType.NoColumns); convexHullLayer.Clear(); MultipointShape multipointShape = new MultipointShape(); foreach (PointShape pointShape in features.Skip(1).Select(feature => (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(); } } } ====DifferenceViewController.cs==== using ThinkGeo.MapSuite.Core; using ThinkGeo.MapSuite.iOSEdition; namespace GeometricFunctions { public class DifferenceViewController : DetailViewController { public DifferenceViewController() { } protected override void InitializeMap() { 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.TileType = TileType.SingleTile; layerOverlay.Layers.Add("SourceLayer", sourceLayer); MapView.Overlays.Add("LayerOverlay", layerOverlay); MapView.Refresh(); } 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(); } } } } ====EnvelopViewController.cs==== using System.Linq; using ThinkGeo.MapSuite.Core; using ThinkGeo.MapSuite.iOSEdition; namespace GeometricFunctions { public class EnvelopViewController : DetailViewController { public EnvelopViewController() { } protected override void InitializeMap() { 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.TileType = TileType.SingleTile; layerOverlay.Layers.Add("SourceLayer", sourceLayer); layerOverlay.Layers.Add("BoundingboxLayer", boundingboxLayer); MapView.Overlays.Add("LayerOverlay", layerOverlay); MapView.Refresh(); } 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(); } } } ====GetAreaViewController.cs==== using System.Globalization; using System.Linq; using ThinkGeo.MapSuite.Core; using ThinkGeo.MapSuite.iOSEdition; using UIKit; namespace GeometricFunctions { public class GetAreaViewController : DetailViewController { public GetAreaViewController() { } protected override void InitializeMap() { 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.TileType = TileType.SingleTile; layerOverlay.Layers.Add("SourceLayer", sourceLayer); MapView.Overlays.Add("LayerOverlay", layerOverlay); MapView.Refresh(); } 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; UIAlertView alertView = new UIAlertView("Area", areaMessage, null, "OK"); alertView.Show(); layerOverlay.Refresh(); } } } } ====GetLengthViewController.cs==== using System.Globalization; using System.Linq; using ThinkGeo.MapSuite.Core; using ThinkGeo.MapSuite.iOSEdition; using UIKit; namespace GeometricFunctions { public class GetLengthViewController : DetailViewController { public GetLengthViewController() { } protected override void InitializeMap() { MapView.MapUnit = GeographyUnit.Meter; MapView.CurrentExtent = GetBoundingBox(); InMemoryFeatureLayer sourceLayer = new InMemoryFeatureLayer(); sourceLayer.Open(); sourceLayer.Columns.Add(new FeatureSourceColumn("Length")); 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); MapView.Refresh(); } 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); UIAlertView alertView = new UIAlertView("Length", lengthContent, null, "OK"); alertView.Show(); layerOverlay.Refresh(); } } } } ====GetShortestLineViewController.cs==== using System.Globalization; using ThinkGeo.MapSuite.Core; using ThinkGeo.MapSuite.iOSEdition; namespace GeometricFunctions { public class GetShortestLineViewController : DetailViewController { public GetShortestLineViewController() { } protected override void InitializeMap() { MapView.MapUnit = GeographyUnit.Meter; RectangleShape mapExtent = ExtentHelper.GetBoundingBoxOfItems(GeometrySource); 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")); shortestLineLayer.ZoomLevelSet.ZoomLevel01.DefaultTextStyle = GetTextStyle(); 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.TileType = TileType.SingleTile; layerOverlay.Layers.Add("SourceLayer", sourceLayer); layerOverlay.Layers.Add("ShortestLineLayer", shortestLineLayer); MapView.Overlays.Add("LayerOverlay", layerOverlay); MapView.Refresh(); } 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(); } private static TextStyle GetTextStyle() { 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; return textStyle; } } } ====LineOnLineViewController.cs==== using System.Linq; using ThinkGeo.MapSuite.Core; using ThinkGeo.MapSuite.iOSEdition; namespace GeometricFunctions { public class LineOnLineViewController : DetailViewController { public LineOnLineViewController() { } protected override void InitializeMap() { 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.TileType = TileType.SingleTile; layerOverlay.Layers.Add("SourceLayer", sourceLayer); layerOverlay.Layers.Add("LineOnLineLayer", lineOnLineLayer); MapView.Overlays.Add("LayerOverlay", layerOverlay); MapView.Refresh(); } 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(); } } } } ====RotateViewController.cs==== using System.Linq; using ThinkGeo.MapSuite.Core; using ThinkGeo.MapSuite.iOSEdition; namespace GeometricFunctions { public class RotateViewController : DetailViewController { public RotateViewController() { } protected override void InitializeMap() { 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.TileType = TileType.SingleTile; layerOverlay.Layers.Add("SourceLayer", sourceLayer); MapView.Overlays.Add("LayerOverlay", layerOverlay); MapView.Refresh(); } 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(); } } } } ====ScaleViewController.cs==== using System.Linq; using ThinkGeo.MapSuite.Core; using ThinkGeo.MapSuite.iOSEdition; namespace GeometricFunctions { public class ScaleViewController : DetailViewController { public ScaleViewController() { } protected override void InitializeMap() { 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.TileType = TileType.SingleTile; layerOverlay.Layers.Add("SourceLayer", sourceLayer); MapView.Overlays.Add("LayerOverlay", layerOverlay); MapView.Refresh(); } 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(); } } } ====SimplifyViewContoller.cs==== using System.Linq; using ThinkGeo.MapSuite.Core; using ThinkGeo.MapSuite.iOSEdition; namespace GeometricFunctions { public class SimplifyViewController : DetailViewController { private static readonly double simplifyTolerence = 30; public SimplifyViewController() { } protected override void InitializeMap() { 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.TileType = TileType.SingleTile; layerOverlay.Layers.Add("SourceLayer", sourceLayer); MapView.Overlays.Add("LayerOverlay", layerOverlay); MapView.Refresh(); } 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(); } } } ====SnapGPSViewController.cs==== using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using ThinkGeo.MapSuite.Core; using ThinkGeo.MapSuite.iOSEdition; namespace GeometricFunctions { public class SnapGPSViewController : DetailViewController { private InMemoryFeatureLayer resultLayer; private InMemoryFeatureLayer inProcessLayer; public SnapGPSViewController() { } protected override void InitializeMap() { MapView.MapUnit = GeographyUnit.Meter; MapView.CurrentExtent = GetBoundingBox(); InitializeLayers(); LayerOverlay layerOverlay = new LayerOverlay(); layerOverlay.TileType = TileType.SingleTile; layerOverlay.Layers.Add("SourceLayer", inProcessLayer); layerOverlay.Layers.Add("PointLayer", resultLayer); MapView.Overlays.Add("LayerOverlay", layerOverlay); MapView.Refresh(); } protected override void Execute() { LayerOverlay layerOverlay = (LayerOverlay)MapView.Overlays["LayerOverlay"]; resultLayer.InternalFeatures.Clear(); if (resultLayer.InternalFeatures.Count == 0) { inProcessLayer.IsVisible = false; MultilineShape multilineShape = inProcessLayer.InternalFeatures[0].GetShape() as MultilineShape; Feature[] allFeatures = { inProcessLayer.InternalFeatures[1] }; Collection matchFeatures = new Collection(); double tolerance = 100; 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(new Feature(multilineShape)); foreach (var feature in matchFeatures) { Collection vertices = new Collection(); PointShape resultShape = multilineShape.GetClosestPointTo(feature, GeographyUnit.Meter); MultilineShape tempMultilineShape = feature.GetShape() as MultilineShape; if (tempMultilineShape != null) { vertices.Add(new Vertex(resultShape)); double offsetX = resultShape.X - tempMultilineShape.Lines[0].Vertices[0].X; double offsetY = resultShape.Y - tempMultilineShape.Lines[0].Vertices[0].Y; 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 void InitializeLayers() { inProcessLayer = new InMemoryFeatureLayer(); inProcessLayer.Open(); inProcessLayer.Columns.Add(new FeatureSourceColumn("Name", "character", 100)); resultLayer = new InMemoryFeatureLayer(); resultLayer.Open(); resultLayer.Columns.Add(new FeatureSourceColumn("Name", "character", 100)); 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; foreach (var feature in GeometrySource) { inProcessLayer.InternalFeatures.Add(feature); } resultLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = inProcessLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle; resultLayer.ZoomLevelSet.ZoomLevel01.DefaultLineStyle = LineStyles.CreateSimpleLineStyle(semiTransparentOrange, 4, false); resultLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; CollectVertices(inProcessLayer.InternalFeatures.Skip(1).ToArray(), resultLayer); } private static void CollectVertices(IEnumerable features, InMemoryFeatureLayer targetFeatureLayer) { foreach (var multilineShape in features.Select(f => f.GetShape()).OfType().Where(s => s != null)) { foreach (var vertex in multilineShape.Lines.SelectMany(l => l.Vertices)) { EllipseShape ellipseShape = new EllipseShape(new PointShape(vertex), 30); targetFeatureLayer.InternalFeatures.Add(new Feature(ellipseShape)); } } } } } ====SplitViewController.cs==== using ThinkGeo.MapSuite.Core; using ThinkGeo.MapSuite.iOSEdition; namespace GeometricFunctions { public class SplitViewController : DetailViewController { public SplitViewController() { } protected override void InitializeMap() { MapView.MapUnit = GeographyUnit.Meter; WorldMapKitOverlay worldOverlay = new WorldMapKitOverlay(); worldOverlay.Projection = WorldMapKitProjection.SphericalMercator; MapView.Overlays.Add(worldOverlay); MapView.Refresh(); } } } ====UnionViewController.cs==== using System.Collections.Generic; using System.Linq; using ThinkGeo.MapSuite.Core; using ThinkGeo.MapSuite.iOSEdition; namespace GeometricFunctions { public class UnionViewController : DetailViewController { public UnionViewController() { } protected override void InitializeMap() { 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.TileType = TileType.SingleTile; layerOverlay.Layers.Add("SourceLayer", sourceLayer); MapView.Overlays.Add("LayerOverlay", layerOverlay); MapView.Refresh(); } protected override void Execute() { LayerOverlay layerOverlay = (LayerOverlay)MapView.Overlays["LayerOverlay"]; InMemoryFeatureLayer sourceLayer = (InMemoryFeatureLayer)layerOverlay.Layers["SourceLayer"]; if (sourceLayer.InternalFeatures.Count > 1) { IEnumerable areaBaseShapes = sourceLayer.InternalFeatures.Select(f => f.GetShape()).OfType(); AreaBaseShape unionedAreaBaseShape = AreaBaseShape.Union(areaBaseShapes); sourceLayer.InternalFeatures.Clear(); sourceLayer.InternalFeatures.Add(new Feature(unionedAreaBaseShape)); layerOverlay.Refresh(); } } } } ====DetailViewController.cs==== using CoreGraphics; using Foundation; using System; using System.Collections.ObjectModel; using ThinkGeo.MapSuite.Core; using ThinkGeo.MapSuite.iOSEdition; using UIKit; namespace GeometricFunctions { [Register("DetailViewController")] public class DetailViewController : UIViewController { private GeoColor brushColor; private UIBarButtonItem settingButton; private Collection geometrySource; protected MapView MapView; public Action DetailButtonClick; protected DetailViewController() { geometrySource = new Collection(); } private void InitializeToolbar() { brushColor = GeoColor.FromArgb(100, 0, 147, 221); UIBarButtonItem detailButton = new UIBarButtonItem(UIImage.FromBundle("detail40"), UIBarButtonItemStyle.Plain, OnDetailItemClick); detailButton.TintColor = UIColor.Black; NavigationItem.SetLeftBarButtonItem(detailButton, true); settingButton = new UIBarButtonItem("GO", UIBarButtonItemStyle.Plain, OnGoItemClick); settingButton.TintColor = UIColor.Black; NavigationItem.SetRightBarButtonItems(new[] { settingButton }, true); } public Collection GeometrySource { get { return geometrySource; } } protected GeoColor BrushColor { get { return brushColor; } } protected RectangleShape GetBoundingBox() { RectangleShape mapExtent = (RectangleShape)ExtentHelper.GetBoundingBoxOfItems(GeometrySource).CloneDeep(); mapExtent.ScaleUp(140); return mapExtent; } public override void ViewDidLoad() { base.ViewDidLoad(); View.AutoresizingMask = UIViewAutoresizing.FlexibleHeight | UIViewAutoresizing.FlexibleWidth; MapView = new MapView(View.Frame); MapView.BackgroundColor = UIColor.FromRGB(244, 242, 238); MapView.MapTools.ZoomMapTool.Center = new CGPoint(MapView.MapTools.ZoomMapTool.Center.X + 10, MapView.MapTools.ZoomMapTool.Center.Y + 55); LoadBackgroundLayer(); InitializeMap(); InitializeToolbar(); View.AddSubview(MapView); } public override void WillAnimateRotation(UIInterfaceOrientation toInterfaceOrientation, double duration) { base.WillAnimateRotation(toInterfaceOrientation, duration); double resolution = Math.Max(MapView.CurrentExtent.Width / MapView.Frame.Width, MapView.CurrentExtent.Height / MapView.Frame.Height); MapView.Frame = View.Bounds; MapView.CurrentExtent = GetExtentRetainScale(MapView.CurrentExtent.GetCenterPoint(), MapView.Frame, resolution); MapView.Refresh(); } protected virtual void InitializeMap() { } protected virtual void Execute() { } private void LoadBackgroundLayer() { WorldMapKitOverlay worldOverlay = new WorldMapKitOverlay(); worldOverlay.TileType = TileType.MultiTile; worldOverlay.Projection = WorldMapKitProjection.SphericalMercator; MapView.Overlays.Add("WMK", worldOverlay); } private static RectangleShape GetExtentRetainScale(PointShape currentLocationInMecator, CGRect frame, double resolution) { double left = currentLocationInMecator.X - resolution * frame.Width * .5; double right = currentLocationInMecator.X + resolution * frame.Width * .5; double top = currentLocationInMecator.Y + resolution * frame.Height * .5; double bottom = currentLocationInMecator.Y - resolution * frame.Height * .5; return new RectangleShape(left, top, right, bottom); } private void OnGoItemClick(object sender, EventArgs e) { settingButton.Enabled = false; Execute(); settingButton.Enabled = true; } private void OnDetailItemClick(object sender, EventArgs e) { if (DetailButtonClick != null) DetailButtonClick(); } } } ====SliderViewController.cs==== using CoreGraphics; using MonoTouch.Dialog; using Foundation; using MediaPlayer; using ObjCRuntime; using UIKit; using System; using System.Drawing; namespace GeometricFunctions { public enum FlyOutPosition { Left = 0, // default Right }; [Register("SilderViewController")] public class SliderViewController : UIViewController { private const float sidebarFlickVelocity = 1000.0f; private const int menuWidth = 240; private bool hideShadow; private UIButton closeButton; private FlyOutPosition position; private DialogViewController leftNavigation; private int selectedIndex; private UIView shadowView; private nfloat startX; private UIView statusImage; private UIViewController[] viewControllers; private bool isIos7; private bool isOpen; public event UITouchEventArgs ShouldReceiveTouch; public Action SelectedIndexChanged; public SliderViewController(IntPtr handle) : base(handle) { Initialize(); } public SliderViewController(UITableViewStyle navigationStyle = UITableViewStyle.Plain) { Initialize(navigationStyle); } public FlyOutPosition Position { get { return position; } set { position = value; shadowView.Layer.ShadowOffset = new CGSize(Position == FlyOutPosition.Left ? -5 : 5, -1); } } public bool AlwaysShowLandscapeMenu { get; set; } public bool ForceMenuOpen { get; set; } public bool HideShadow { get { return hideShadow; } set { if (value == hideShadow) return; hideShadow = value; if (hideShadow) { if (mainView != null) View.InsertSubviewBelow(shadowView, mainView); } else { shadowView.RemoveFromSuperview(); } } } public UIColor ShadowViewColor { get { return shadowView.BackgroundColor; } set { shadowView.BackgroundColor = value; } } public UIViewController CurrentViewController { get; set; } public UIView mainView { get { if (CurrentViewController == null) return null; return CurrentViewController.View; } } public RootElement NavigationRoot { get { return leftNavigation.Root; } set { EnsureInvokedOnMainThread(delegate { leftNavigation.Root = value; }); } } public UITableView NavigationTableView { get { return leftNavigation.TableView; } } public UIViewController[] ViewControllers { get { return viewControllers; } set { EnsureInvokedOnMainThread(delegate { viewControllers = value; NavigationItemSelected(GetIndexPath(SelectedIndex)); }); } } public bool IsOpen { get { if (Position == FlyOutPosition.Left) { return mainView.Frame.X == menuWidth; } else { return mainView.Frame.X == -menuWidth; } } set { isOpen = value; if (value) HideMenu(); else ShowMenu(); } } public bool ShouldStayOpen { get { if (ForceMenuOpen || (UIDevice.CurrentDevice.UserInterfaceIdiom == UIUserInterfaceIdiom.Pad && AlwaysShowLandscapeMenu && (InterfaceOrientation == UIInterfaceOrientation.LandscapeLeft || InterfaceOrientation == UIInterfaceOrientation.LandscapeRight))) return true; return false; } } public int SelectedIndex { get { return selectedIndex; } set { if (selectedIndex == value) return; selectedIndex = value; EnsureInvokedOnMainThread(delegate { NavigationItemSelected(value); }); } } public bool DisableRotation { get; set; } public override bool ShouldAutorotateToInterfaceOrientation(UIInterfaceOrientation toInterfaceOrientation) { if (DisableRotation) return toInterfaceOrientation == InterfaceOrientation; bool theReturn = CurrentViewController == null ? true : CurrentViewController.ShouldAutorotateToInterfaceOrientation(toInterfaceOrientation); return theReturn; } public override UIInterfaceOrientationMask GetSupportedInterfaceOrientations() { if (CurrentViewController != null) return CurrentViewController.GetSupportedInterfaceOrientations(); return UIInterfaceOrientationMask.All; } public override void ViewDidLayoutSubviews() { base.ViewDidLayoutSubviews(); CGRect navFrame = View.Bounds; // navFrame.Y += UIApplication.SharedApplication.StatusBarFrame.Height; // navFrame.Height -= navFrame.Y; //this.statusbar navFrame.Width = menuWidth; if (Position == FlyOutPosition.Right) navFrame.X = mainView.Frame.Width - menuWidth; if (leftNavigation.View.Frame != navFrame) leftNavigation.View.Frame = navFrame; } public override void ViewWillAppear(bool animated) { CGRect navFrame = leftNavigation.View.Frame; navFrame.Width = menuWidth; if (Position == FlyOutPosition.Right) navFrame.X = mainView.Frame.Width - menuWidth; navFrame.Location = PointF.Empty; leftNavigation.View.Frame = navFrame; View.BackgroundColor = NavigationTableView.BackgroundColor; var frame = mainView.Frame; setViewSize(); SetLocation(frame); base.ViewWillAppear(animated); } private void Initialize(UITableViewStyle navigationStyle = UITableViewStyle.Plain) { DisableStatusBarMoving = true; statusImage = new UIView { ClipsToBounds = true }.SetAccessibilityId("statusbar"); leftNavigation = new DialogViewController(navigationStyle, null); leftNavigation.OnSelection += NavigationItemSelected; CGRect navFrame = leftNavigation.View.Frame; navFrame.Width = menuWidth; if (Position == FlyOutPosition.Right) navFrame.X = mainView.Frame.Width - menuWidth; leftNavigation.View.Frame = navFrame; View.AddSubview(leftNavigation.View); var version = new Version(UIDevice.CurrentDevice.SystemVersion); isIos7 = version.Major >= 7; if (isIos7) { leftNavigation.TableView.TableHeaderView = new UIView(new CGRect(0, 0, 320, 22)) { BackgroundColor = UIColor.Clear }; leftNavigation.TableView.SectionHeaderHeight = 50; } leftNavigation.TableView.TableFooterView = new UIView(new CGRect(0, 0, 100, 100)) { BackgroundColor = UIColor.Clear }; leftNavigation.TableView.ScrollsToTop = false; shadowView = new UIView(); shadowView.BackgroundColor = UIColor.White; shadowView.Layer.ShadowOffset = new CGSize(Position == FlyOutPosition.Left ? -5 : 5, -1); shadowView.Layer.ShadowColor = UIColor.Black.CGColor; shadowView.Layer.ShadowOpacity = .75f; closeButton = new UIButton(); closeButton.TouchUpInside += delegate { HideMenu(); }; AlwaysShowLandscapeMenu = true; View.AddGestureRecognizer(new OpenMenuGestureRecognizer(DragContentView, shouldReceiveTouch)); } private void DragContentView(UIPanGestureRecognizer panGesture) { //if (ShouldStayOpen || mainView == null) if (mainView == null) return; if (!HideShadow) View.InsertSubviewBelow(shadowView, mainView); leftNavigation.View.Hidden = false; CGRect frame = mainView.Frame; shadowView.Frame = frame; nfloat translation = panGesture.TranslationInView(View).X; if (panGesture.State == UIGestureRecognizerState.Began) { startX = frame.X; } else if (panGesture.State == UIGestureRecognizerState.Changed) { frame.X = translation + startX; if (Position == FlyOutPosition.Left) { if (frame.X < 0) frame.X = 0; else if (frame.X > menuWidth) frame.X = menuWidth; } else { if (frame.X > 0) frame.X = 0; else if (frame.X < -menuWidth) frame.X = -menuWidth; } SetLocation(frame); } else if (panGesture.State == UIGestureRecognizerState.Ended) { nfloat velocity = panGesture.VelocityInView(View).X; nfloat newX = translation + startX; bool show = Math.Abs(velocity) > sidebarFlickVelocity ? velocity > 0 : newX > (menuWidth / 2); if (Position == FlyOutPosition.Right) { show = Math.Abs(velocity) > sidebarFlickVelocity ? velocity < 0 : newX < -(menuWidth / 2); } if (show) { ShowMenu(); } else { HideMenu(); } } } private bool shouldReceiveTouch(UIGestureRecognizer gesture, UITouch touch) { if (ShouldReceiveTouch != null) return ShouldReceiveTouch(gesture, touch); return true; } private void NavigationItemSelected(NSIndexPath indexPath) { int index = GetIndex(indexPath); NavigationItemSelected(index); } private void NavigationItemSelected(int index) { if (selectedIndex == index && CurrentViewController != null) { HideMenu(); return; } selectedIndex = index; if (viewControllers == null || viewControllers.Length <= index || index < 0) { if (SelectedIndexChanged != null) SelectedIndexChanged(); return; } if (ViewControllers[index] == null) { if (SelectedIndexChanged != null) SelectedIndexChanged(); return; } if (!DisableStatusBarMoving) //if (!DisableStatusBarMoving && !ShouldStayOpen) UIApplication.SharedApplication.SetStatusBarHidden(false, UIStatusBarAnimation.Fade); //bool isOpen = false; //if (mainView != null) //{ // mainView.RemoveFromSuperview(); // isOpen = IsOpen; //} //isOpen = false; CurrentViewController = ViewControllers[SelectedIndex]; CGRect frame = View.Bounds; //if (isOpen || ShouldStayOpen) if (isOpen) { frame.X = Position == FlyOutPosition.Left ? menuWidth : -menuWidth; frame.Width = frame.Width - frame.X; } //setViewSize(); SetLocation(frame); View.AddSubview(mainView); AddChildViewController(CurrentViewController); //if (!ShouldStayOpen) HideMenu(); if (SelectedIndexChanged != null) SelectedIndexChanged(); } //bool isOpen {get{ return mainView.Frame.X == menuWidth; }} private void ShowMenu() { if (mainView == null) return; EnsureInvokedOnMainThread(delegate { //navigation.ReloadData (); //isOpen = true; leftNavigation.View.Hidden = false; closeButton.Frame = mainView.Frame; shadowView.Frame = mainView.Frame; var statusFrame = statusImage.Frame; statusFrame.X = mainView.Frame.X; statusImage.Frame = statusFrame; //if (!ShouldStayOpen) View.AddSubview(closeButton); if (!HideShadow) View.InsertSubviewBelow(shadowView, mainView); UIView.BeginAnimations("slideMenu"); UIView.SetAnimationCurve(UIViewAnimationCurve.EaseIn); UIView.SetAnimationDuration(.3); setViewSize(); CGRect frame = mainView.Frame; frame.X = Position == FlyOutPosition.Left ? menuWidth : -menuWidth; SetLocation(frame); setViewSize(); frame = mainView.Frame; shadowView.Frame = frame; closeButton.Frame = frame; statusFrame.X = mainView.Frame.X; statusImage.Frame = statusFrame; UIView.CommitAnimations(); isOpen = true; }); } private void setViewSize() { CGRect frame = View.Bounds; //frame.Location = PointF.Empty; //if (ShouldStayOpen) if (isOpen) frame.Width -= menuWidth; if (mainView.Bounds == frame) return; mainView.Bounds = frame; } private void SetLocation(CGRect frame) { mainView.Layer.AnchorPoint = new CGPoint(.5f, .5f); frame.Y = 0; if (mainView.Frame.Location == frame.Location) return; frame.Size = mainView.Frame.Size; var center = new CGPoint(frame.Left + frame.Width / 2, frame.Top + frame.Height / 2); mainView.Center = center; shadowView.Center = center; if (Math.Abs(frame.X - 0) > float.Epsilon) { getStatus(); var statusFrame = statusImage.Frame; statusFrame.X = mainView.Frame.X; statusImage.Frame = statusFrame; } } private bool DisableStatusBarMoving { get; set; } private void getStatus() { //if (DisableStatusBarMoving || !isIos7 || statusImage.Superview != null || ShouldStayOpen) if (DisableStatusBarMoving || !isIos7 || statusImage.Superview != null) return; var image = captureStatusBarImage(); if (image == null) return; this.View.AddSubview(statusImage); foreach (var view in statusImage.Subviews) view.RemoveFromSuperview(); statusImage.AddSubview(image); statusImage.Frame = UIApplication.SharedApplication.StatusBarFrame; UIApplication.SharedApplication.StatusBarHidden = true; } private UIView captureStatusBarImage() { try { UIView screenShot = UIScreen.MainScreen.SnapshotView(false); return screenShot; } catch (Exception ex) { return null; } } private void hideStatus() { if (!isIos7) return; statusImage.RemoveFromSuperview(); UIApplication.SharedApplication.StatusBarHidden = false; } private void HideMenu() { //if (mainView == null || mainView.Frame.X == 0) if (mainView == null) return; EnsureInvokedOnMainThread(delegate { isOpen = false; leftNavigation.FinishSearch(); closeButton.RemoveFromSuperview(); shadowView.Frame = mainView.Frame; var statusFrame = statusImage.Frame; statusFrame.X = mainView.Frame.X; statusImage.Frame = statusFrame; UIView.Animate(.5, () => { UIView.SetAnimationCurve(UIViewAnimationCurve.EaseInOut); CGRect frame = View.Bounds; frame.X = 0; setViewSize(); SetLocation(frame); shadowView.Frame = frame; statusFrame.X = 0; statusImage.Frame = statusFrame; }, hideComplete); }); } [Export("animationEnded")] private void hideComplete() { hideStatus(); shadowView.RemoveFromSuperview(); leftNavigation.View.Hidden = true; } private void ResignFirstResponders(UIView view) { if (view.Subviews == null) return; foreach (UIView subview in view.Subviews) { if (subview.IsFirstResponder) subview.ResignFirstResponder(); ResignFirstResponders(subview); } } public void ToggleMenu() { EnsureInvokedOnMainThread(delegate { if (!IsOpen && CurrentViewController != null && CurrentViewController.IsViewLoaded) ResignFirstResponders(CurrentViewController.View); if (IsOpen) HideMenu(); else ShowMenu(); }); } private int GetIndex(NSIndexPath indexPath) { int section = 0; int rowCount = 0; while (section < indexPath.Section) { rowCount += leftNavigation.Root[section].Count; section++; } return rowCount + indexPath.Row; } private NSIndexPath GetIndexPath(int index) { if (leftNavigation.Root == null) return NSIndexPath.FromRowSection(0, 0); int currentCount = 0; int section = 0; foreach (Section element in leftNavigation.Root) { if (element.Count + currentCount > index) break; currentCount += element.Count; section++; } int row = index - currentCount; return NSIndexPath.FromRowSection(row, section); } //public override void DidRotate(UIInterfaceOrientation fromInterfaceOrientation) //{ // base.DidRotate(fromInterfaceOrientation); // if (UIDevice.CurrentDevice.UserInterfaceIdiom == UIUserInterfaceIdiom.Phone) // return; // switch (InterfaceOrientation) // { // case UIInterfaceOrientation.LandscapeLeft: // case UIInterfaceOrientation.LandscapeRight: // ShowMenu(); // break; // default: // HideMenu(); // break; // } //} private void EnsureInvokedOnMainThread(Action action) { if (NSThread.Current.IsMainThread) { action(); return; } BeginInvokeOnMainThread(() => action() ); } } internal static class Helpers { static readonly IntPtr selAccessibilityIdentifier_Handle = Selector.GetHandle("accessibilityIdentifier"); public static UIView SetAccessibilityId(this UIView view, string id) { var nsId = NSString.CreateNative(id); //Messaging.void_objc_msgSend_IntPtr(view.Handle, selAccessibilityIdentifier_Handle, nsId); return view; } } internal class OpenMenuGestureRecognizer : UIPanGestureRecognizer { public OpenMenuGestureRecognizer(Action callback, Func shouldReceiveTouch) : base(callback) { ShouldReceiveTouch += (sender, touch) => { //Ugly hack to ignore touches that are on a cell that is moving... bool isMovingCell = touch.View.ToString().IndexOf("UITableViewCellReorderControl", StringComparison.InvariantCultureIgnoreCase) > -1; if (touch.View is UISlider || touch.View is MPVolumeView || isMovingCell) return false; return shouldReceiveTouch(sender, touch); }; } } } ====AssemblyInfo.cs==== using System.Reflection; using System.Runtime.InteropServices; // 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("AnalyzingVisualization")] [assembly: AssemblyDescription("")] [assembly:|AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly:|AssemblyProduct("AnalyzingVisualization")] [assembly: AssemblyCopyright("Copyright © 2015")] [assembly:|AssemblyTrademark("")] [assembly: AssemblyCulture("")] // Setting ComVisible to false makes the types in this assembly not visible // to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. [assembly:|ComVisible(false)] // The following GUID is for the ID of the typelib if this project is exposed to COM [assembly:|Guid("84efb68d-6dbd-4d6e-a2e8-f4ef414d8ee0")] // 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("9.0.0.0")] [assembly:|AssemblyFileVersion("9.0.0.0")]