StreetMap Premium for ArcGIS Runtime bietet hochwertige, weltweite Straßendaten, die für die Verwendung bei der kartographischen Kartendarstellung, Geokodierung und dem Routing optimiert wurden. Diese Daten können in Apps eingebunden werden, die mit den ArcGIS Runtime SDKs ab Version 100.0 entwickelt wurden. Sie werden lokal auf dem Gerät des Nutzers gespeichert – dass ermöglicht die Nutzung unterwegs und ohne Internetverbindung. Die Daten werden in regelmäßigen Abständen aktualisiert, so dass sie stets auf dem neuesten Stand sind und somit der Fokus der Entwicklungsarbeit ausschließlich auf der Erstellung und Pflege der eigentlichen Apps liegt.

Folgende Vorteile bietet StreetMap Premium for ArcGIS Runtime:
- Detaillierte Straßengrundkarte
Die mit StreetMap Premium for ArcGIS Runtime bereitgestellten Daten wurden bereits aufbereitet und sind als sofort einsetzbare Straßengrundkarte verfügbar. Diese hochwertige Grundkarte bietet in den Apps den nötigen räumlichen Kontext. - Suchen und Geokodieren von Positionen
StreetMap Premium for ArcGIS Runtime umfasst einen Locator-Task zur Geokodierung, der sich ganz einfach in Apps einbinden lässt. Mit diesem Locator können Nutzer nach spezifischen Adressen, Kreuzungen oder Points of Interest suchen und diese auf einer Karte darstellen. - Lösen von Routen-Problemen
StreetMap Premium for ArcGIS Runtime bietet auch ein Netzwerk-Dataset für Verkehrsnetze für umfassende Routing-Analysefunktionen in ArcGIS Runtime-Apps. Diese Daten ermöglichen das Ermitteln der optimalen Routen zwischen verschiedenen Orten im Straßennetzwerk. - Offline-Verwendung von Straßendaten
Die in StreetMap Premium for ArcGIS Runtime verfügbaren Daten sind auch dann verfügbar, wenn keine Verbindung zum Internet besteht. So können Nutzer auch im Außendienst oder Bereichen mit schlechter oder keiner Internetverbindung bequem auf die Grundkarten, Geokodierungsfunktionen und Routing-Funktionalität zugreifen. Ein weiterer Vorteil ist die reduzierte Datenmenge, die übertragen werden muss – dies spart Kosten. - Apps für den Einsatz in der ganzen Welt
Die Daten und Karten von StreetMap Premium for ArcGIS Runtime sind für die ganze Welt verfügbar. Mobile Kartenpakete für unterschiedlichste Gebiete, z. B. Regionen oder Länder, lassen sich damit in Apps einbinden.
Download und Lizenzierung
ArcGIS Entwickler können mit StreetMap Premium for ArcGIS Runtime ab der kostenlosen ArcGIS Developer Subscription „Essentials“ entwickeln und testen. Die Daten können in Form von Mobile Map Packages (.mmpk) für unterschiedliche Länder und Regionen im Downloadbereich des ArcGIS Developers Portals heruntergeladen werden:

Für das Deployment der fertigen Apps muss StreetMap Premium for ArcGIS Runtime als Extension zu ArcGIS Runtime lizenziert werden. Der oder die Lizenzschlüssel (lizenziert wird per Region) werden dazu auch im Code wie eine Extension implementiert. Mehr Informationen zur Vorgehensweise hier am Beispiel des ArcGIS Runtime SDK for .NET.
Implementierung
Das Implementieren und Nutzen von StreetMap Premium for ArcGIS Runtime ist intuitiv und in allen ArcGIS Runtime SDKs fast identisch:
Öffnen des Mobile Map Packages:
<SPAN class="keyword token">var</SPAN> mapPackage <SPAN class="operator token">=</SPAN> <SPAN class="keyword token">await</SPAN> MobileMapPackage<SPAN class="punctuation token">.</SPAN><SPAN class="token function">OpenAsync</SPAN><SPAN class="punctuation token">(</SPAN>Path to mmpk<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN><SPAN class="line-numbers-rows"><SPAN></SPAN></SPAN>
Nutzen der fertigen Map(s):
<SPAN class="keyword token">var</SPAN> map <SPAN class="operator token">=</SPAN> mapPackage<SPAN class="punctuation token">.</SPAN>Maps<SPAN class="punctuation token">[</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">;</SPAN>
Map <SPAN class="operator token">=</SPAN> map<SPAN class="punctuation token">;</SPAN><SPAN class="line-numbers-rows"><SPAN></SPAN><SPAN></SPAN></SPAN>
Nutzen des Locator Tasks für Geocoding/Reverse Geocoding usw.:
<SPAN class="keyword token">await</SPAN> mapPackage<SPAN class="punctuation token">.</SPAN>LocatorTask<SPAN class="punctuation token">.</SPAN><SPAN class="token function">LoadAsync</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
<SPAN class="keyword token">var</SPAN> suggestions <SPAN class="operator token">=</SPAN> <SPAN class="keyword token">await</SPAN> mapPackage<SPAN class="punctuation token">.</SPAN>LocatorTask<SPAN class="punctuation token">.</SPAN><SPAN class="token function">SuggestAsync</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="string token">"Fechnerstrasse 8, Leipzig"</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
<SPAN class="line-numbers-rows"><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN></SPAN>
Nutzen des Transportation Networks für Routing:
<SPAN class="keyword token">var</SPAN> routeTask <SPAN class="operator token">=</SPAN> <SPAN class="keyword token">await</SPAN> RouteTask<SPAN class="punctuation token">.</SPAN><SPAN class="token function">CreateAsync</SPAN><SPAN class="punctuation token">(</SPAN>map<SPAN class="punctuation token">.</SPAN>TransportationNetworks<SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN><SPAN class="line-numbers-rows"><SPAN></SPAN></SPAN>
Mit dem ArcGIS Runtime SDK for .Net sieht es so aus (der Einfachheit halber alles in einer Methode):
<SPAN class="keyword token">private</SPAN> <SPAN class="keyword token">async</SPAN> <SPAN class="keyword token">void</SPAN> <SPAN class="token function">CreateMmpkMap</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="punctuation token">{</SPAN>
GraphicsOverlays<SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">.</SPAN>Graphics<SPAN class="punctuation token">.</SPAN><SPAN class="token function">Clear</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
<SPAN class="keyword token">try</SPAN>
<SPAN class="punctuation token">{</SPAN>
<SPAN class="keyword token">var</SPAN> mapPackage <SPAN class="operator token">=</SPAN> <SPAN class="keyword token">await</SPAN> MobileMapPackage<SPAN class="punctuation token">.</SPAN><SPAN class="token function">OpenAsync</SPAN><SPAN class="punctuation token">(</SPAN>_baseDirectory<SPAN class="punctuation token">.</SPAN>LocalPath <SPAN class="operator token">+</SPAN> <SPAN class="string token">@"geodata\Germany.mmpk"</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
<SPAN class="keyword token">var</SPAN> map <SPAN class="operator token">=</SPAN> mapPackage<SPAN class="punctuation token">.</SPAN>Maps<SPAN class="punctuation token">[</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">;</SPAN>
<SPAN class="comment token">// Locator, just a test</SPAN>
<SPAN class="keyword token">await</SPAN> mapPackage<SPAN class="punctuation token">.</SPAN>LocatorTask<SPAN class="punctuation token">.</SPAN><SPAN class="token function">LoadAsync</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
<SPAN class="keyword token">var</SPAN> suggestions <SPAN class="operator token">=</SPAN> <SPAN class="keyword token">await</SPAN> mapPackage<SPAN class="punctuation token">.</SPAN>LocatorTask<SPAN class="punctuation token">.</SPAN><SPAN class="token function">SuggestAsync</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="string token">"Fechnerstrasse 8, Leipzig"</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
<SPAN class="comment token">//do something with the suggestions</SPAN>
<SPAN class="keyword token">await</SPAN> map<SPAN class="punctuation token">.</SPAN><SPAN class="token function">LoadAsync</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
<SPAN class="comment token">//make sure the map loaded</SPAN>
<SPAN class="keyword token">if</SPAN> <SPAN class="punctuation token">(</SPAN>map<SPAN class="punctuation token">.</SPAN>LoadStatus <SPAN class="operator token">!=</SPAN> LoadStatus<SPAN class="punctuation token">.</SPAN>Loaded<SPAN class="punctuation token">)</SPAN> <SPAN class="keyword token">return</SPAN><SPAN class="punctuation token">;</SPAN>
<SPAN class="comment token">// Routing</SPAN>
<SPAN class="keyword token">var</SPAN> routeTask <SPAN class="operator token">=</SPAN> <SPAN class="keyword token">await</SPAN> RouteTask<SPAN class="punctuation token">.</SPAN><SPAN class="token function">CreateAsync</SPAN><SPAN class="punctuation token">(</SPAN>map<SPAN class="punctuation token">.</SPAN>TransportationNetworks<SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
<SPAN class="comment token">// get the default route parameters</SPAN>
<SPAN class="keyword token">var</SPAN> routeParams <SPAN class="operator token">=</SPAN> <SPAN class="keyword token">await</SPAN> routeTask<SPAN class="punctuation token">.</SPAN><SPAN class="token function">CreateDefaultParametersAsync</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
<SPAN class="comment token">// explicitly set values for some params</SPAN>
routeParams<SPAN class="punctuation token">.</SPAN>ReturnDirections <SPAN class="operator token">=</SPAN> <SPAN class="keyword token">false</SPAN><SPAN class="punctuation token">;</SPAN>
routeParams<SPAN class="punctuation token">.</SPAN>ReturnRoutes <SPAN class="operator token">=</SPAN> <SPAN class="keyword token">true</SPAN><SPAN class="punctuation token">;</SPAN>
routeParams<SPAN class="punctuation token">.</SPAN>OutputSpatialReference <SPAN class="operator token">=</SPAN> map<SPAN class="punctuation token">.</SPAN>SpatialReference<SPAN class="punctuation token">;</SPAN>
<SPAN class="comment token">// create a Stop for my location</SPAN>
<SPAN class="keyword token">var</SPAN> myLocation <SPAN class="operator token">=</SPAN> <SPAN class="keyword token">new</SPAN> <SPAN class="token class-name">MapPoint</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="number token">1375470.8306</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="number token">6685056.1967</SPAN><SPAN class="punctuation token">,</SPAN> map<SPAN class="punctuation token">.</SPAN>SpatialReference<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
<SPAN class="keyword token">var</SPAN> stop1 <SPAN class="operator token">=</SPAN> <SPAN class="keyword token">new</SPAN> <SPAN class="token class-name">Stop</SPAN><SPAN class="punctuation token">(</SPAN>myLocation<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
<SPAN class="keyword token">var</SPAN> markerSym <SPAN class="operator token">=</SPAN> <SPAN class="keyword token">new</SPAN> <SPAN class="token class-name">SimpleMarkerSymbol</SPAN>
<SPAN class="punctuation token">{</SPAN>
Style <SPAN class="operator token">=</SPAN> SimpleMarkerSymbolStyle<SPAN class="punctuation token">.</SPAN>Circle<SPAN class="punctuation token">,</SPAN>
Color <SPAN class="operator token">=</SPAN> Colors<SPAN class="punctuation token">.</SPAN>Red<SPAN class="punctuation token">,</SPAN>
Size <SPAN class="operator token">=</SPAN> <SPAN class="number token">12</SPAN>
<SPAN class="punctuation token">}</SPAN><SPAN class="punctuation token">;</SPAN>
<SPAN class="keyword token">var</SPAN> pointGraphic <SPAN class="operator token">=</SPAN> <SPAN class="keyword token">new</SPAN> <SPAN class="token class-name">Graphic</SPAN><SPAN class="punctuation token">(</SPAN>myLocation<SPAN class="punctuation token">,</SPAN> markerSym<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
_graphicsOverlays<SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">.</SPAN>Graphics<SPAN class="punctuation token">.</SPAN><SPAN class="token function">Add</SPAN><SPAN class="punctuation token">(</SPAN>pointGraphic<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
<SPAN class="comment token">// create a Stop for your location</SPAN>
<SPAN class="keyword token">var</SPAN> yourLocation <SPAN class="operator token">=</SPAN> <SPAN class="keyword token">new</SPAN> <SPAN class="token class-name">MapPoint</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="number token">1377231.148</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="number token">6687515.5736</SPAN><SPAN class="punctuation token">,</SPAN> map<SPAN class="punctuation token">.</SPAN>SpatialReference<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
<SPAN class="keyword token">var</SPAN> stop2 <SPAN class="operator token">=</SPAN> <SPAN class="keyword token">new</SPAN> <SPAN class="token class-name">Stop</SPAN><SPAN class="punctuation token">(</SPAN>yourLocation<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
pointGraphic <SPAN class="operator token">=</SPAN> <SPAN class="keyword token">new</SPAN> <SPAN class="token class-name">Graphic</SPAN><SPAN class="punctuation token">(</SPAN>yourLocation<SPAN class="punctuation token">,</SPAN> markerSym<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
_graphicsOverlays<SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">.</SPAN>Graphics<SPAN class="punctuation token">.</SPAN><SPAN class="token function">Add</SPAN><SPAN class="punctuation token">(</SPAN>pointGraphic<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
<SPAN class="comment token">// assign the stops to the route parameters</SPAN>
<SPAN class="keyword token">var</SPAN> stopPoints <SPAN class="operator token">=</SPAN> <SPAN class="keyword token">new</SPAN> <SPAN class="token class-name">List</SPAN><SPAN class="operator token"><</SPAN>Stop<SPAN class="operator token">></SPAN> <SPAN class="punctuation token">{</SPAN> stop1<SPAN class="punctuation token">,</SPAN> stop2 <SPAN class="punctuation token">}</SPAN><SPAN class="punctuation token">;</SPAN>
routeParams<SPAN class="punctuation token">.</SPAN><SPAN class="token function">SetStops</SPAN><SPAN class="punctuation token">(</SPAN>stopPoints<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
<SPAN class="keyword token">var</SPAN> routeResult <SPAN class="operator token">=</SPAN> <SPAN class="keyword token">await</SPAN> routeTask<SPAN class="punctuation token">.</SPAN><SPAN class="token function">SolveRouteAsync</SPAN><SPAN class="punctuation token">(</SPAN>routeParams<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
<SPAN class="comment token">// get the route from the results</SPAN>
<SPAN class="keyword token">var</SPAN> route <SPAN class="operator token">=</SPAN> routeResult<SPAN class="punctuation token">.</SPAN>Routes<SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">;</SPAN>
<SPAN class="comment token">// create a graphic (with a dashed line symbol) to represent the route</SPAN>
<SPAN class="keyword token">var</SPAN> routeSymbol <SPAN class="operator token">=</SPAN> <SPAN class="keyword token">new</SPAN> <SPAN class="token class-name">SimpleLineSymbol</SPAN><SPAN class="punctuation token">(</SPAN>SimpleLineSymbolStyle<SPAN class="punctuation token">.</SPAN>DashDotDot<SPAN class="punctuation token">,</SPAN> Colors<SPAN class="punctuation token">.</SPAN>Red<SPAN class="punctuation token">,</SPAN> <SPAN class="number token">5</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
<SPAN class="keyword token">var</SPAN> routeGraphic <SPAN class="operator token">=</SPAN> <SPAN class="keyword token">new</SPAN> <SPAN class="token class-name">Graphic</SPAN><SPAN class="punctuation token">(</SPAN>route<SPAN class="punctuation token">.</SPAN>RouteGeometry<SPAN class="punctuation token">,</SPAN> routeSymbol<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
<SPAN class="comment token">// add the route graphic to the map view and zoom to its extent</SPAN>
_graphicsOverlays<SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">.</SPAN>Graphics<SPAN class="punctuation token">.</SPAN><SPAN class="token function">Add</SPAN><SPAN class="punctuation token">(</SPAN>routeGraphic<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
map<SPAN class="punctuation token">.</SPAN>InitialViewpoint <SPAN class="operator token">=</SPAN> <SPAN class="keyword token">new</SPAN> <SPAN class="token class-name">Viewpoint</SPAN><SPAN class="punctuation token">(</SPAN>route<SPAN class="punctuation token">.</SPAN>RouteGeometry<SPAN class="punctuation token">,</SPAN> <SPAN class="number token">0</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
Map <SPAN class="operator token">=</SPAN> map<SPAN class="punctuation token">;</SPAN>
<SPAN class="punctuation token">}</SPAN>
<SPAN class="keyword token">catch</SPAN> <SPAN class="punctuation token">(</SPAN><SPAN class="token class-name">Exception</SPAN> ex<SPAN class="punctuation token">)</SPAN>
<SPAN class="punctuation token">{</SPAN>
<SPAN class="keyword token">var</SPAN> text <SPAN class="operator token">=</SPAN> ex<SPAN class="punctuation token">.</SPAN>Message<SPAN class="punctuation token">;</SPAN>
<SPAN class="punctuation token">}</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></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><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></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN></SPAN>
Ergebnis