a.erbeesri-de-esridist

Vector Tile Service Export in ArcGIS Runtime 100.2

Blog Post created by a.erbeesri-de-esridist Employee on Feb 8, 2018

Maps bestehen in der Regel aus Basemap Layers zur Orientierung und Operational Layers für das Visualisieren, Abfragen, Bearbeiten und Analysieren von Geo-Informationen. In ArcGIS werden zwei Typen von Basemaps unterschieden: Raster Tile Services (gecachte Map Services und Image Services) und die noch recht jungen Vector Tile Services.

 

      Link zur Live Map

 

Für die Offline-Nutzung von Basemaps in ArcGIS Runtime können schon seit langer Zeit Tile Packages (.tpk) direkt aus Raster Tile Services exportiert werden. Brandneu ist nun die Möglichkeit, Bereiche von Vector Tile Services zu exportieren und lokal als Vector Tile Packages (.vtpk) nutzen zu können:

 

Vector Tile Services für den Export


Der große Vorteil von Vector Tile Services ist das clientseitige dynamische Rendering von Tiles. Somit ist die Basemap in jedem Maßstab der Map und bei jeder Auflösung des Displays immer gestochen scharf. Weiterhin werden die Daten und der Style der Basemap getrennt behandelt. Das ermöglicht dynamisches Anzeigen von Labels und das Erstellen von Basemaps mit unterschiedlichen Themen basierend auf immer denselben Datensatz. Und letztendlich werden Vektoren übertragen, also keine Bilder wie bei Raster Tile Services. Das sorgt für hohe Performanz und deutlich kleinere Datenmengen.

In ArcGIS Online werden schon eine Reihe von exportierbaren Vector Tile Basemaps bereitgestellt. Die hier verlinkten Services basieren alle auf denselben World Basemap Daten, aber immer jeweils mit anderem Style. Falls mehrere dieser Basemaps offline genutzt werden sollen, muss nur von einem der Services das vtpk (Daten + „Root Style“) und von allen Services jeweils nur der Style exportiert werden. Dazu später mehr.

Es können auch eigene Vector Tile Services auf ArcGIS Online erstellt und für den Export freigeschaltet werden. Dazu wird in den allgemeinen Einstellungen des Vector Tile Service Portal Items in der Registerkarte Einstellungen der Offline-Modus aktiviert:

 

 

Wie eigene Vector Tile Services erzeugt und dafür verschiedene Styles erstellt werden können, wird in diesen zwei Esri UK - Blogs sehr gut beschrieben:

 

 

Export von Vector Tile Packages und Styles in ArcGIS Runtime

Für den Export von Vector Tile Services und Styles werden die PortalItem IDs der Services, eine Identität (Named User oder ArcGIS Online Developer Account) und mindestens die ArcGIS Runtime Version 100.2 benötigt. Hier ist die exemplarische Vorgehensweise anhand des ArcGIS Runtime SDK for .NET:

 

      Online Map mit dem zu exportierenden Gebiet (AreaOfInterest im ExportVectorTilesParameters)

 

1. Authentifizieren

Der anonyme Export ist nicht erlaubt, es ist eine Authentifizierung erforderlich. Dafür gibt es mehrere Möglichkeiten, z.B in diesem Sample.

 

2. Vector Tile Service PortalItem erzeugen

Wir nutzen in unserem Code-Beispiel die World Topographic Map (for Export). Hiervon wird die Portal ID benötigt.

 

var portal = await ArcGISPortal.CreateAsync();
var portalItem = await PortalItem.CreateAsync(portal,"df541726b3df4c0caf99255bb1be4c86");

 

TIP:

 

Es ist leider nicht möglich, von einem Vector Tile Service equivalente Services mit anderen Styles abzufragen. Um das trotzdem zu automatisieren kann in ArcGIS Runtime nach PortalItems-Typen und Tags gesucht werden.

 

Z.B ist in den hier beschriebenen ArcGIS Online Basemaps der spezifischer Tag "World_Basemap_Export_v2".

 

Bei eigenen Services muss dementsprechend ein eigener spezifischer Tag gewählt werden.

 

So wird gesucht:

var queryExpression = string.Format("tags:\"{0}\"type: \"Vector Tile Service\"", "World_Basemap_Export_v2");

PortalQueryParameters queryParams = new PortalQueryParameters(queryExpression, 100);

// Search the portal using the query parameters and await the results
PortalQueryResultSet<PortalItem> findResult = await portal.FindItemsAsync(queryParams);

// Get the items from the query results
var tileServicePortalItems = findResult.Results;

 

3. Task, Parameter und Job erzeugen und ausführen

Im folgenden Code werden nur die Daten (.vtpk) und nicht der Style exportiert.

// Create the task
var exportTask = await ExportVectorTilesTask.CreateAsync(portalItem);

// Create a new parameters instance
var parameters = new ExportVectorTilesParameters()
{
    AreaOfInterest = exportArea.Geometry,    //area to export
    MaxLevel = exportTask.VectorTileSourceInfo.LevelsOfDetail.Count - 1  //levels to export
};

// Create the export job
var job = exportTask.ExportVectorTiles(parameters, Path.Combine(_vectorTileCachePath, "name.vtpk"));

// Subscribe to notifications for status updates
job.JobChanged += (sender, e) =>
{

   if (job.Status == Esri.ArcGISRuntime.Tasks.JobStatus.Succeeded)
   {
      //do something
   }
   else if (job.Status == Esri.ArcGISRuntime.Tasks.JobStatus.Failed)
   {
      // Notify the user
      ShowStatusMessage(job.Error.Message);
   }
};

// Start the export job
job.Start();

 

Es kann auch das vtpk und der Style (falls vorhanden) in einem Rutsch exportiert werden . Dazu muss dem ExportVectorTilesJob nur zusätzlich der Speicherpfad für einen Ordner für den Style mitgegeben werden.

ExportVectorTilesJob job;
if (exportTask.HasStyleResources)
{
   job = exportTask.ExportVectorTiles(parameters, Path.Combine(_vectorTileCachePath, "name.vtpk"), _styleResourcePath);
}
else
{
   job = exportTask.ExportVectorTiles(parameters, Path.Combine(_vectorTileCachePath, "name.vtpk"));
}

 

Und wenn nur der Style exportiert werden soll sieht es so aus:

var exportTask = await ExportVectorTilesTask.CreateAsync(portalItem);
if (exportTask.HasStyleResources)
{
   var exportStyleJob = exportTask.ExportStyleResourceCache(_styleResourcePath);
   var result = await exportStyleJob.GetResultAsync();
   //do something
}

 

Wenn zum Beispiel alle die weiter oben beschriebenen exportierbaren ArcGIS Online Vector Tile Services lokal als Basemaps verfügbar sein sollen, muss von einem Service das vtpk und von allen Services nur die Styles exportiert werden. In einem StyleResource Ordner befinden sich nur JSON-Dateien mit der Beschreibung des Styles, diese sind sehr klein.

 

Nutzen von lokalen Vector Tile Packages und Styles in ArcGIS Runtime

Das lokale vtpk und ein vorhandener Style können dann so in die Map eingebunden werden:

 

//Load a style
var itemResourceCache = new ItemResourceCache(_styleResourcePath);

//Load the vtpk
var offlineVectorTileCache = new VectorTileCache(Path.Combine(_vectorTileCachePath, "name.vtpk"));

// Create a tile layer with the cache and the style
var layer = new ArcGISVectorTiledLayer(offlineVectorTileCache, itemResourceCache);

// Create a tile layer only with the cache
//var layer = new ArcGISVectorTiledLayer(offlineVectorTileCache);

// Create a new map with the layer as basemap
var map = new Map(new Basemap(layer));

// Apply the map to the mapview
MyMapView.Map = map;

 

Wenn der Entwickler alles beschriebene schön kombiniert, können so in der ArcGIS Runtime App lokal mehrer Basemaps auf Basis von nur einem vtpk genutzt werden. Um den Speicherplatz der Daten auf dem Gerät muss sich meistens auch keine Sorgen mehr gemacht werden. In einem Test mit dem Gebiet grob Bayern in der gesamten Detailtiefe ist die Größe des vtpks + Styles nur ca.230 MB groß und der Export hat knapp 7 min gedauert. Wichtig ist noch die Information, dass es eine maximale Begrenzung ("maxExportTilesCount":10000) für einen Export gibt.

 

     Offline Vector Tile Basemap ohne extra Style (nur das .vtpk geladen)

 

       Offline Vector Tile Basemap mit Style

 

      Offline Vector Tile Basemap mit Style

 

      Offline Vector Tile Basemap mit Style

 

      Offline Vector Tile Basemap mit Style

Outcomes