private void FindWithinDistanceFeatures() { if (mapView.Overlays.Count > 0) { FeatureLayer worldLayer = mapView.FindFeatureLayer("WorldLayer"); InMemoryFeatureLayer highlightLayer = (InMemoryFeatureLayer)mapView.FindFeatureLayer("HighlightLayer"); // Find the countries within special distance. double distance = Convert.ToDouble(cmbDistance.SelectedItem.ToString().Split(':')[1], CultureInfo.InvariantCulture); worldLayer.Open(); worldLayer.FeatureSource.ProjectionConverter = project; Collection <Feature> selectedFeatures = worldLayer.QueryTools.GetFeaturesWithinDistanceOf((PointShape)project.ConvertToExternalProjection(pointShape), GeographyUnit.DecimalDegree, DistanceUnit.Kilometer, distance, new string[0]); worldLayer.FeatureSource.ProjectionConverter = null; worldLayer.Close(); if (highlightLayer.InternalFeatures.Count > 0) { highlightLayer.InternalFeatures.Clear(); } highlightLayer.InternalFeatures.Add("Point", new Feature(pointShape)); foreach (Feature feature in selectedFeatures) { highlightLayer.InternalFeatures.Add(feature.Id, project.ConvertToInternalProjection(feature)); } mapView.Overlays["HighlightOverlay"].Refresh(); } }
/// <summary> /// Use the TimezoneCloudClient to query for timezone information /// </summary> private async Task GetTimeZoneInfo(double lon, double lat) { CloudTimeZoneResult result; try { // Show a loading graphic to let users know the request is running loadingIndicator.IsRunning = true; loadingLayout.IsVisible = true; // Get timezone info based on the lon, lat, and input projection (Spherical Mercator in this case) result = await timeZoneCloudClient.GetTimeZoneByCoordinateAsync(lon, lat, 3857); } catch (Exception ex) { await DisplayAlert("Error", ex.Message, "OK"); return; } finally { loadingIndicator.IsRunning = false; loadingLayout.IsVisible = false; } // Get the timezone info popup overlay from the mapview PopupOverlay timezoneInfoPopupOverlay = (PopupOverlay)mapView.Overlays["Timezone Info Popup Overlay"]; // Clear the existing info popups from the map timezoneInfoPopupOverlay.Popups.Clear(); // Build a string description of the timezone StringBuilder timezoneInfoString = new StringBuilder(); timezoneInfoString.AppendLine($"Time Zone: {result.TimeZone}"); timezoneInfoString.AppendLine($"Current Local Time: {result.CurrentLocalTime}"); timezoneInfoString.AppendLine($"Daylight Savings Active: {result.DaylightSavingsActive}"); // Display the timezone info on a popup on the map Popup popup = new Popup(); popup.Content = timezoneInfoString.ToString(); popup.Position = new PointShape(lon, lat); timezoneInfoPopupOverlay.Popups.Add(popup); // Clear the timezone feature layer of previous features InMemoryFeatureLayer timezonesFeatureLayer = (InMemoryFeatureLayer)mapView.FindFeatureLayer("Timezone Feature Layer"); timezonesFeatureLayer.Open(); timezonesFeatureLayer.InternalFeatures.Clear(); // Use a ProjectionConverter to convert the shape to Spherical Mercator ProjectionConverter converter = new ProjectionConverter(3857, 4326); converter.Open(); // Add the new timezone polygon to the map timezonesFeatureLayer.InternalFeatures.Add(new Feature(converter.ConvertToInternalProjection(result.Shape))); converter.Close(); timezonesFeatureLayer.Close(); // Refresh and redraw the map mapView.Refresh(); }
/// <summary> /// Set up the map with the ThinkGeo Cloud Maps overlay and a feature layer containing Frisco zoning data /// </summary> protected override void OnAppearing() { base.OnAppearing(); // Create the background world maps using vector tiles requested from the ThinkGeo Cloud Service. ThinkGeoCloudVectorMapsOverlay thinkGeoCloudVectorMapsOverlay = new ThinkGeoCloudVectorMapsOverlay("9ap16imkD_V7fsvDW9I8r8ULxgAB50BX_BnafMEBcKg~", "vtVao9zAcOj00UlGcK7U-efLANfeJKzlPuDB9nw7Bp4K4UxU_PdRDg~~", ThinkGeoCloudVectorMapsMapType.Light); thinkGeoCloudVectorMapsOverlay.VectorTileCache = new FileVectorTileCache(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "cache"), "CloudMapsVector"); mapView.Overlays.Add(thinkGeoCloudVectorMapsOverlay); // Set the Map Unit to meters (used in Spherical Mercator) mapView.MapUnit = GeographyUnit.Meter; // Create a feature layer to hold and display the zoning data InMemoryFeatureLayer zoningLayer = new InMemoryFeatureLayer(); // Add a style to use to draw the Frisco zoning polygons zoningLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; zoningLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyle.CreateSimpleAreaStyle(GeoColor.FromArgb(50, GeoColors.MediumPurple), GeoColors.MediumPurple, 2); // Import the features from the Frisco zoning data shapefile ShapeFileFeatureSource zoningDataFeatureSource = new ShapeFileFeatureSource(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Data/Shapefile/Zoning.shp")); // Create a ProjectionConverter to convert the shapefile data from North Central Texas (2276) to Spherical Mercator (3857) ProjectionConverter projectionConverter = new ProjectionConverter(3857, 2276); // For this sample, we have to reproject the features before adding them to the feature layer // This is because the topological equality query often does not work when used on a feature layer with a ProjectionConverter, due to rounding issues between projections zoningDataFeatureSource.Open(); projectionConverter.Open(); foreach (Feature zoningFeature in zoningDataFeatureSource.GetAllFeatures(ReturningColumnsType.AllColumns)) { Feature reprojectedFeature = projectionConverter.ConvertToInternalProjection(zoningFeature); zoningLayer.InternalFeatures.Add(reprojectedFeature); } zoningDataFeatureSource.Close(); projectionConverter.Close(); // Set the map extent to Frisco, TX //mapView.CurrentExtent = new RectangleShape(-10781137.28, 3917162.59, -10774579.34, 3911241.35); // Create a layer to hold the feature we will perform the spatial query against InMemoryFeatureLayer queryFeatureLayer = new InMemoryFeatureLayer(); queryFeatureLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyle.CreateSimpleAreaStyle(GeoColor.FromArgb(75, GeoColors.LightRed), GeoColors.LightRed); queryFeatureLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; // Create a layer to hold features found by the spatial query InMemoryFeatureLayer highlightedFeaturesLayer = new InMemoryFeatureLayer(); highlightedFeaturesLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyle.CreateSimpleAreaStyle(GeoColor.FromArgb(90, GeoColors.MidnightBlue), GeoColors.MidnightBlue); highlightedFeaturesLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; // Add each feature layer to it's own overlay // We do this so we can control and refresh/redraw each layer individually LayerOverlay layerOverlay = new LayerOverlay(); layerOverlay.Layers.Add("Frisco Zoning", zoningLayer); layerOverlay.Layers.Add("Query Feature", queryFeatureLayer); layerOverlay.Layers.Add("Highlighted Features", highlightedFeaturesLayer); mapView.Overlays.Add("Layer Overlay", layerOverlay); // Create a sample shape using vertices from an existing feature, to ensure that it is touching other features zoningLayer.Open(); MultipolygonShape firstFeatureShape = (MultipolygonShape)zoningLayer.FeatureSource.GetAllFeatures(ReturningColumnsType.NoColumns).First().GetShape(); // Get vertices from an existing feature var vertices = firstFeatureShape.Polygons.First().OuterRing.Vertices; // Create a new feature using a subset of those vertices MultipolygonShape sampleShape = new MultipolygonShape(new Collection <PolygonShape> { new PolygonShape(new RingShape(new Collection <Vertex> { vertices[0], vertices[1], vertices[2] })) }); queryFeatureLayer.InternalFeatures.Add(new Feature(sampleShape)); zoningLayer.Close(); GetFeaturesTouching(sampleShape); // Set the map extent to the sample shape mapView.CurrentExtent = new RectangleShape(-10778499.3056056, 3920951.91647677, -10774534.1347853, 3917536.13679426); mapView.Refresh(); }