private ImageSource GenerateMapImage() { Collection <Layer> layersToDraw = new Collection <Layer>(); // Create the background world maps using vector tiles stored locally in our MBTiles file and also set the styling though a json file ThinkGeoMBTilesLayer mbTilesLayer = new ThinkGeoMBTilesLayer(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Data/Mbtiles/Frisco.mbtiles"), new Uri(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Data/Json/thinkgeo-world-streets-light.json"), UriKind.Relative)); mbTilesLayer.Open(); layersToDraw.Add(mbTilesLayer); // Create the new layer and set the projection as the data is in srid 2276 and our background is srid 3857 (spherical mercator). ShapeFileFeatureLayer zoningLayer = new ShapeFileFeatureLayer(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Data/Shapefile/Zoning.shp")); zoningLayer.FeatureSource.ProjectionConverter = new ProjectionConverter(2276, 3857); zoningLayer.Open(); // Create an Area style on zoom level 1 and then apply it to all zoom levels up to 20. zoningLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = new AreaStyle(new GeoPen(GeoBrushes.Blue)); zoningLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; layersToDraw.Add(zoningLayer); // Create a GeoCanvas to do the drawing GeoCanvas canvas = GeoCanvas.CreateDefaultGeoCanvas(); // Create a GeoImage as the image to draw on GeoImage geoImage = new GeoImage(800, 600); // Start the drawing by specifying the image, extent and map units canvas.BeginDrawing(geoImage, MapUtil.GetDrawingExtent(zoningLayer.GetBoundingBox(), 800, 600), GeographyUnit.Meter); // This collection is used during drawing to pass labels in between layers so we can track collisions Collection <SimpleCandidate> labels = new Collection <SimpleCandidate>(); // Loop through all the layers and draw them to the GeoCanvas // The flush is to compact styles that use different drawing levels foreach (var layer in layersToDraw) { layer.Draw(canvas, labels); canvas.Flush(); } // End drawing, we can now use the GeoImage canvas.EndDrawing(); // Create a memory stream and save the GeoImage as a standard PNG formatted image MemoryStream imageStream = new MemoryStream(); geoImage.Save(imageStream, GeoImageFormat.Png); // Reset the image stream back to the beginning imageStream.Position = 0; return(ImageSource.FromStream(() => { return imageStream; })); }
private void mapView_Loaded(object sender, RoutedEventArgs e) { //Load the well depth points and depth data from a text file into the dictionary //We cache this at the class level to prevent form loading it multiple times string wellDepthPointDataFilePath = SampleHelper.Get("GrayCountyIrrigationWellDepths.csv"); Dictionary <PointShape, double> wellDepthPointData = GetWellDepthPointDataFromCSV(wellDepthPointDataFilePath); //Get the current extent since we use that to gerenate the grid. Of course this is just for //the demo and in the real world you can use any extent you like RectangleShape currentDrawingExtent = MapUtil.GetDrawingExtent(mapView.CurrentExtent, (float)mapView.ActualWidth, (float)mapView.ActualHeight); //Calculate the cell size based on how many rows and columns you specified double cellSize = Math.Min(currentDrawingExtent.Width / 4, currentDrawingExtent.Height / 4); //Greate the grid definition based on the extent, cell size etc. GridDefinition gridDefinition = new GridDefinition(currentDrawingExtent, cellSize, -9999, wellDepthPointData); //Generate the grid based on Inverse Distance Weighted interpolation model. You can define your own model if needed. GridCell[,] gridCellMatrix = GridFeatureSource.GenerateGridMatrix(gridDefinition, new InverseDistanceWeightedGridInterpolationModel(2, double.MaxValue)); //Load a new GridFeatureLayer based on the current grid file InMemoryGridFeatureLayer gridFeatureLayer = new InMemoryGridFeatureLayer(gridCellMatrix); gridFeatureLayer.Open(); var currentExtent = gridFeatureLayer.GetBoundingBox(); gridFeatureLayer.Close(); gridFeatureLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyle.CreateSimpleAreaStyle(GeoColors.Transparent, GeoColors.Black); gridFeatureLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; //Add the grid layer, the grid cells, and the well points to the map LayerOverlay layerOverlay = new LayerOverlay(); layerOverlay.Layers.Add(gridFeatureLayer); mapView.ZoomLevelSet = new ThinkGeoCloudMapsZoomLevelSet(); mapView.CurrentExtent = currentExtent; mapView.MapUnit = GeographyUnit.Meter; mapView.Overlays.Add(layerOverlay); mapView.Refresh(); }