@LukeSmallwood
So I'm occasionally getting an error with my ExportVectorTiles. Depending one where I try to export from I will get an error like this...
namespace ArcGISRuntime.WPF.Samples.ExportTiles
{
public partial class ExportTiles
{
// URL to the service tiles will be exported from.
private Uri _serviceUri = new Uri("https://basemaps.arcgis.com/arcgis/rest/services/World_Basemap_Export_v2/VectorTileServer");
public ExportTiles()
{
InitializeComponent();
// Call a function to set up the map.
Initialize();
}
private async void Initialize()
{
try
{
// Create the tile layer.
ArcGISVectorTiledLayer myLayer = new ArcGISVectorTiledLayer(_serviceUri);
// Load the layer.
await myLayer.LoadAsync();
// Create the basemap with the layer.
Map myMap = new Map(new Basemap(myLayer))
{
// Set the min and max scale - export task fails if the scale is too big or small.
MaxScale = 5000000,
MinScale = 10000000
};
// Assign the map to the mapview.
MyMapView.Map = myMap;
// Create a new symbol for the extent graphic.
// This is the red box that visualizes the extent for which tiles will be exported.
SimpleLineSymbol myExtentSymbol = new SimpleLineSymbol(SimpleLineSymbolStyle.Solid, Color.Red, 2);
// Create graphics overlay for the extent graphic and apply a renderer.
GraphicsOverlay extentOverlay = new GraphicsOverlay
{
Renderer = new SimpleRenderer(myExtentSymbol)
};
// Add the overlay to the view.
MyMapView.GraphicsOverlays.Add(extentOverlay);
// Subscribe to changes in the mapview's viewpoint so the preview box can be kept in position.
MyMapView.ViewpointChanged += MyMapView_ViewpointChanged;
// Update the graphic - needed in case the user decides not to interact before pressing the button.
UpdateMapExtentGraphic();
// Enable the export button.
MyExportButton.IsEnabled = true;
// Set viewpoint of the map.
MyMapView.SetViewpoint(new Viewpoint(-4.853791, 140.983598, myMap.MinScale));
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
private void MyMapView_ViewpointChanged(object sender, EventArgs e)
{
UpdateMapExtentGraphic();
}
private void UpdateMapExtentGraphic()
{
// Return if mapview is null.
if (MyMapView == null) { return; }
// Get the new viewpoint.
Viewpoint myViewPoint = MyMapView.GetCurrentViewpoint(ViewpointType.BoundingGeometry);
// Return if viewpoint is null.
if (myViewPoint == null) { return; }
// Get the updated extent for the new viewpoint.
Envelope extent = myViewPoint.TargetGeometry as Envelope;
// Return if extent is null.
if (extent == null) { return; }
// Create an envelope that is a bit smaller than the extent.
EnvelopeBuilder envelopeBldr = new EnvelopeBuilder(extent);
envelopeBldr.Expand(0.80);
// Get the (only) graphics overlay in the map view.
GraphicsOverlay extentOverlay = MyMapView.GraphicsOverlays.FirstOrDefault();
// Return if the extent overlay is null.
if (extentOverlay == null) { return; }
// Get the extent graphic.
Graphic extentGraphic = extentOverlay.Graphics.FirstOrDefault();
// Create the extent graphic and add it to the overlay if it doesn't exist.
if (extentGraphic == null)
{
extentGraphic = new Graphic(envelopeBldr.ToGeometry());
extentOverlay.Graphics.Add(extentGraphic);
}
else
{
// Otherwise, simply update the graphic's geometry.
extentGraphic.Geometry = envelopeBldr.ToGeometry();
}
}
private async Task StartExport()
{
// Get the (only) graphics overlay in the map view.
GraphicsOverlay extentOverlay = MyMapView.GraphicsOverlays.First();
// Get the area selection graphic's extent.
Graphic extentGraphic = extentOverlay.Graphics.First();
// Create the task.
ExportVectorTilesTask exportTask = await ExportVectorTilesTask.CreateAsync(_serviceUri);
ExportVectorTilesParameters parameters = await exportTask.CreateDefaultExportVectorTilesParametersAsync(extentGraphic.Geometry, 100);
// Get the tile cache path.
string tilePath = Path.Combine(Environment.ExpandEnvironmentVariables("%TEMP%"), Path.GetTempFileName() + ".vtpk");
//string tilePath = Path.Combine("C:/Development/Map_Tiles", fileName.Text + ".vtpk");
// Create the export job.
ExportVectorTilesJob job = exportTask.ExportVectorTiles(parameters, tilePath);
// Start the export job.
job.Start();
// Wait for the job to complete.
ExportVectorTilesResult resultTileCache = await job.GetResultAsync();
// Do the rest of the work.
await HandleExportCompleted(job, resultTileCache);
}
private async Task HandleExportCompleted(ExportVectorTilesJob job, ExportVectorTilesResult cache)
{
if (job.Status == Esri.ArcGISRuntime.Tasks.JobStatus.Succeeded)
{
// Show the exported tiles on the preview map.
await UpdatePreviewMap(cache);
// Show the preview window.
MyPreviewMapView.Visibility = Visibility.Visible;
// Show the 'close preview' button.
MyClosePreviewButton.Visibility = Visibility.Visible;
// Hide the 'export tiles' button.
MyExportButton.Visibility = Visibility.Collapsed;
// Hide the progress bar.
MyProgressBar.Visibility = Visibility.Collapsed;
}
else if (job.Status == Esri.ArcGISRuntime.Tasks.JobStatus.Failed)
{
// Notify the user.
MessageBox.Show("Job failed");
// Hide the progress bar.
MyProgressBar.Visibility = Visibility.Collapsed;
}
}
private async Task UpdatePreviewMap(ExportVectorTilesResult cache)
{
VectorTileCache vc = cache.VectorTileCache;
// Load the cache.
await vc.LoadAsync();
// Create a tile layer from the tile cache.
ArcGISVectorTiledLayer myLayer = new ArcGISVectorTiledLayer(vc);
// Show the layer in a new map.
MyPreviewMapView.Map = new Map(new Basemap(myLayer));
}
private async void MyExportButton_Click(object sender, RoutedEventArgs e)
{
try
{
// Show the progress bar.
MyProgressBar.Visibility = Visibility.Visible;
// Hide the preview window.
MyPreviewMapView.Visibility = Visibility.Collapsed;
// Hide the 'close preview' button.
MyClosePreviewButton.Visibility = Visibility.Collapsed;
// Show the 'export tiles' button.
MyExportButton.Visibility = Visibility.Visible;
// Disable the 'export tiles' button.
MyExportButton.IsEnabled = false;
// Start the export.
await StartExport();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
private void ClosePreview_Click(object sender, RoutedEventArgs e)
{
// Hide the preview map.
MyPreviewMapView.Visibility = Visibility.Collapsed;
// Hide the close preview button.
MyClosePreviewButton.Visibility = Visibility.Collapsed;
// Show the 'export tiles' button.
MyExportButton.Visibility = Visibility.Visible;
// Re-enable the export button.
MyExportButton.IsEnabled = true;
}
}
}