<\/HEAD>
Karten bestehen in der Regel aus Basemap Layers zur Orientierung und Operational Layers ffcr das Visualisieren, Abfragen, Bearbeiten und Analysieren von Geo-Informationen. In ArcGIS werden zwei Typen von Basemaps<\/A> unterschieden: Raster Tile Services (gecachte Map Services und Image Services) und die noch recht jungen Vector Tile Services.<\/P><\/P>
<\/P>
Link zur Live Map<\/A><\/P><\/P>
<\/DIV>
Ffcr die Offline-Nutzung von Basemaps in
ArcGIS Runtime<\/A> kf6nnen schon seit langer Zeit Tile Packages (.tpk) direkt aus Raster Tile Services exportiert werden. Brandneu ist nun die Mf6glichkeit, Bereiche von Vector Tile Services zu exportieren und lokal als Vector Tile Packages (.vtpk) nutzen zu kf6nnen:<\/DIV><\/P>
1. Authentifizieren
Der anonyme Export ist nicht erlaubt, es ist eine Authentifizierung erforderlich. Dafr gibt es mehrere Mlglichkeiten, 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 bentigt.
var portal = await ArcGISPortal.CreateAsync();
var portalItem = await PortalItem.CreateAsync(portal, "df541726b3df4c0caf99255bb1be4c86");
<SPAN class=line-numbers-rows>
</SPAN>
</SPAN>
TIPP:
Es ist leider nicht mlglich, 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 gewlt 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;
<SPAN class=line-numbers-rows>
</SPAN>
3. Aufgabe, Parameter und Job erstellen und ausführen
Im folgenden Code werden nur die Daten (.vtpk) und nicht der Style exportiert.
<SPAN class="comment token">// Erstelle die Aufgabe</SPAN>
<SPAN class="keyword token">var</SPAN> exportTask <SPAN class="operator token">=</SPAN> <SPAN class="keyword token">await</SPAN> ExportVectorTilesTask.<SPAN class="token function">CreateAsync</SPAN>(portalItem);
<SPAN class="comment token">// Erstelle eine neue Parameterinstanz</SPAN>
<SPAN class="keyword token">var</SPAN> parameters <SPAN class="operator token">=</SPAN> <SPAN class="keyword token">new</SPAN> ExportVectorTilesParameters()
{
AreaOfInterest <SPAN class="operator token">=</SPAN> exportArea.Geometry, <SPAN class="comment token">// Bereich zum Exportieren</SPAN>
MaxLevel <SPAN class="operator token">=</SPAN> exportTask.VectorTileSourceInfo.LevelsOfDetail.Count - 1 <SPAN class="comment token">// Ebenen zum Exportieren</SPAN>
};
<SPAN class="comment token">// Erstelle den Export-Job</SPAN>
<SPAN class="keyword token">var</SPAN> job <SPAN class="operator token">=</SPAN> exportTask.<SPAN class="token function">ExportVectorTiles</SPAN>(parameters, Path.<SPAN class="token function">Combine</SPAN>(_vectorTileCachePath, "name.vtpk"));
<SPAN class="comment token">// Abonniere Benachrichtigungen für Statusaktualisierungen</SPAN>
job.JobChanged += (sender, e) =>
{
<SPAN class="keyword token">if</SPAN> (job.Status == Esri.ArcGISRuntime.Tasks.JobStatus.Succeeded)
{
<SPAN class="comment token">// mache etwas</SPAN>
}
<SPAN class="keyword token">else</SPAN> <SPAN class="keyword token">if</SPAN> (job.Status == Esri.ArcGISRuntime.Tasks.JobStatus.Failed)
{
<SPAN class="comment token">// Benachrichtige den Benutzer</SPAN>
ShowStatusMessage(job.Error.Message);
}
};
<SPAN class="comment token">// Starte den Export-Job</SPAN>
job.<SPAN class="token function">Start</SPAN>();<SPAN class="line-numbers-rows"><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></Span><Span></Span><Span></Span><Span></Span><Span></Span><Span></Span><Span></Span><Span></Span><Span></Span><Span></Span><Span></Span><Span></Span><Span></Span><Span></Span><Span></Span></span>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;
<span class="keyword token">if</span>(exportTask.HasStyleResources)
{
job = exportTask.ExportVectorTiles(parameters, Path.Combine(_vectorTileCachePath, "name.vtpk"), _styleResourcePath);
}
<span class="keyword token">else</span>
{
job = exportTask.ExportVectorTiles(parameters, Path.Combine(_vectorTileCachePath, "name.vtpk"));
}<span class="line-numbers-rows"><span><<EMOJI_32>></span><span><<EMOJI_33>></span><span><<EMOJI_34>></span><span><<EMOJI_35>></span><span><<EMOJI_36>></span><span><<EMOJI_37>></span><span><<EMOJI_38>></span><span><<EMOJI_39>></span><span><<EMOJI_40>></span></span>Und wenn nur der Style exportiert werden soll sieht es so aus:<\/P>
<SPAN class="keyword token">var<\/SPAN> exportTask <SPAN class="operator token">=<\/SPAN> <SPAN class="keyword token">await<\/SPAN> ExportVectorTilesTask<SPAN class="punctuation token">.<\/SPAN><SPAN class="token function">CreateAsync<\/SPAN><SPAN class="punctuation token">(<\/SPAN>portalItem<SPAN class="punctuation token">)<\/SPAN><SPAN class="punctuation token">;<\/SPAN>
<SPAN class="keyword token">if<\/SPAN> <SPAN class="punctuation token">(<\/SPAN>exportTask<SPAN class="punctuation token">.<\/SPAN>HasStyleResources<SPAN class="punctuation token">)<\/SPAN>
<SPAN class="punctuation token">{<\/SPAN>
<SPAN class="keyword token">var<\/SPAN> exportStyleJob <SPAN class="operator token">=<\/SPAN> exportTask<SPAN class="punctuation token">.<\/SPAN><SPAN class="token function">ExportStyleResourceCache<\/SPAN><SPAN class="punctuation token">(<\/SPAN>_styleResourcePath<SPAN class="punctuation token">)<\/SPAN><SPAN class="punctuation token">;<\/SPAN>
<SPAN class="keyword token">var<\/SPAN> result <SPAN class="operator token">=<\/SPAN> <SPAN class="keyword token">await<\/SPAN> exportStyleJob<SPAN class="punctuation token">.<\/SPAN><SPAN class="token function">GetResultAsync<\/SPAN><SPAN class="punctuation token">(<\/SPAN><SPAN class="punctuation token">)<\/SPAN><SPAN class="punctuation token">;<\/SPAN>
<SPAN class="comment token">\/\/do something<\/SPAN>
<SPAN class="punctuation token">}<\/SPAN><SPAN class="line-numbers-rows"><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><\/span><\/CODE><\/PRE><P><\/P><P>Wenn zum Beispiel alle die weiter oben beschriebenen <A href="http:\/\/www.arcgis.com\/home\/search.html?q=vector%20tile%20v2%20for%20export%20world%20basemap&t=content&focus=layers&start=1&sortOrder=desc&sortField=relevance" rel="nofollow noopener noreferrer" target="_blank">exportierbaren ArcGIS Online Vector Tile Services<\/A> lokal als Basemaps verfügbar sein sollen, muss von <span style="text-decoration: underline;">einem<\/span> 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.<\/P><P><\/P><P><IMG class="image-16 jive-image" src="https:\/\/us.v-cdn.net\/6038851\/uploads\/legacyfs\/online\/396344_pastedImage_1.png" style="width: 620px; height: 341px;" \/><\/P><H3 id="toc-hId-1751590101" id="toc-hId-1751590101"><\/H3><H3 id="toc-hId--800566860" id="toc-hId--800566860">Nutzen von lokalen Vector Tile Packages und Styles in ArcGIS Runtime<\/H3><P>Das lokale vtpk und ein vorhandener Style können dann so in die Map eingebunden werden:<\/P><P><\/P><PRE class="lia-code-sample line-numbers language-none"><CODE><span class="comment token">\/\/_Load a style_<span>
<span class="keyword token">var</span> itemResourceCache <span class="operator token">=</span> <span class="keyword token">new</span> ItemResourceCache(<span>)</span>_styleResourcePath<span>)</span>;<EMOJI_8>
<span class="comment token">\/_Load the vtpk_<span>
<span class="keyword token">var</span> offlineVectorTileCache <span class="operator token">=</span> <span class="keyword token">new</span> VectorTileCache(<span>)</span>Path.Combine(_vectorTileCachePath, "name.vtpk")<span>)</span>;<EMOJI_9>
<span class="comment token">\/_ Create a tile layer with the cache and the style_<span>
<span class="keyword token">var</span> layer <span class="operator token">=</span> <span class="keyword token">new</span> ArcGISVectorTiledLayer(offlineVectorTileCache, itemResourceCache);
<span class="comment token">\/_ Create a tile layer only with the cache_<span>
<span class="comment token">\/_var layer = new ArcGISVectorTiledLayer(offlineVectorTileCache);_<span>
<span class="comment token">\/_ Create a new map with the layer as basemap_<span>
<span class="keyword token">var</span> map <span class="operator token">=</span> <span class="keyword token">new</span> Map(<span>)</span>new Basemap(layer)<span>)</span>;
<span class="comment token">\/_ Apply the map to the mapview_<span>
MyMapView.Map = map;<EMOJI_10>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.