12+ Jahre App-Entwicklung
Schnell mit KI, stark durch Erfahrung
50+ Erfolgreiche App-Projekte

Blog

Erweitere deine Xamarin.iOS-App mit OpenStreetMap

Kartenfunktionen sind im mobilen Bereich ein wichtiges Feature. Kaum eine App gewinnt nicht an Wert, wenn sie Karten darstellen kann. Apple und Google machen mit ihren Map-SDKs vieles richtig, aber manchmal stößt man an Grenzen - sei es aus rechtlichen Gründen oder wegen eines Bugs. In meinem Fall war Letzteres der Auslöser. Ich brauchte außerdem eine Alternative, die auch offline funktioniert.


Was ist das OpenStreetMap-Projekt?

Das OpenStreetMap-Projekt hat das Ziel, geografische Informationen wie Straßen, Flüsse oder Häuser bereitzustellen. Wenn du möchtest, kannst du diese Informationen selbst ergänzen. OpenStreetMap unterscheidet sich von Google oder Apple vor allem dadurch, dass du auch Zugriff auf die Rohdaten bekommst. Das ist großartig, wenn du eigene Karten oder Routing-Informationen erzeugen möchtest. Mehr über dieses spannende Projekt findest du auf www.openstreetmap.org.

Eine OpenStreetMap darstellen

Wenn du deine Xamarin.iOS-App mit Kartenmaterial aus dem OpenStreetMap-Projekt erweitern möchtest, musst du zunächst die neueste OSMSharp-Version herunterladen und referenzieren. Erstelle danach eine neue Xamarin.iOS-Single-View-App und füge alle im ZIP-Archiv enthaltenen Dateien als Referenz hinzu. Die damaligen NuGet-Pakete funktionierten in meinem Fall nicht, deshalb wurden die Assemblies direkt eingebunden.

Ein wenig Hintergrundwissen vorab: Die meisten Map-SDKs arbeiten schichtbasiert. Jede Ebene wird für unterschiedliche Informationsarten genutzt. Wenn du zum Beispiel einen Marker hinzufügen willst, sollte dieser möglichst weit oben liegen, damit er immer sichtbar bleibt. Auch Stadt- und Straßennamen liegen typischerweise oberhalb der Basiskarte.

Der zweite wichtige Punkt ist, dass solche SDKs mit einem Kachelraster arbeiten. Jedes Rasterfeld wird mit einer Tile gefüllt, also einem kleinen Bildausschnitt der gesamten Karte.

Bevor eine Karte dargestellt werden kann, brauchen wir einen Tile-Provider. OpenStreetMap stellt auf seiner Website eine kleine Liste mit Tile-Servern bereit. Ebenfalls hilfreich ist ein Blick auf https://wiki.openstreetmap.org/wiki/Tileserver.

Mit einem Tile-Server lässt sich eine Karte bereits in wenigen Zeilen Code in ViewDidLoad initialisieren:

public override void ViewDidLoad()
{
    base.ViewDidLoad();

    try
    {
        Native.Initialize();

        var _mapView = new MapView(View.Frame);
        _mapView.MapCenter = new GeoCoordinate(52.207767, 8.803513);
        _mapView.MapZoom = 12;
        _mapView.Map.AddLayerTile("http://a.tile.openstreetmap.de/tiles/osmde/{0}/{1}/{2}.png");

        View.AddSubview(_mapView);
    }
    catch(Exception ex)
    {
        Console.WriteLine(ex);
    }
}

Das Bild links zeigt die Karte im Standardstil von OpenStreetMap. Wenn wir einen anderen Tile-Server als Quelle verwenden, erhalten wir - wie rechts zu sehen - ein optisch ansprechenderes Kartenbild.

Image of a standard looking Open Street Map map Image of a custom looking Open Street Map map

Marker mit OSMSharp anzeigen

Wir haben die Karte auf den Hauptsitz von Cayas Software zentriert. Jetzt ist es Zeit, einen Marker hinzuzufügen, damit dieser Punkt leichter erkennbar wird. Dafür brauchen wir zwei Informationen:

  • die Position, an der der Marker erscheinen soll
  • ein Bild, das den Marker repräsentiert

Danach ist der Rest nur noch ein kleines Stück Code:

var marker = new MapMarker(new GeoCoordinate(52.207767, 8.803513), MapControlAlignmentType.CenterBottom, UIImage.FromFile("pin.png"));
_mapView.AddMarker(marker);
Image of a custom looking Open Street Map map with an location pin

In diesem Beispiel ist der Marker nicht klickbar und zeigt keine weiteren Informationen an, damit es einfach bleibt. Wenn du ein Popup ergänzen möchtest, lohnt sich ein Blick auf die Methode AddPopup.

Offline-Funktionalität hinzufügen

Einer der Hauptgründe, warum ich mit OSMSharp und OpenStreetMap experimentiert habe, war die Möglichkeit, Karten auch in Offline-Szenarien zu nutzen. OSMSharp bietet dafür mehrere Lösungen mit jeweils eigenen Vor- und Nachteilen. Hier liegt der Fokus auf MBTiles als Datenquelle, aber osm.pbf-Dateien können auf ähnliche Weise verwendet werden.

MBTiles sind im Grunde SQLite-Datenbanken, während osm.pbf-Dateien Google Protobuf zum Speichern der Karteninformationen verwenden. Je nach Informationsdichte - also Straßen, Städte, Flüsse - und Kartengröße - ganze Welt, Land oder Region - können diese Dateien sehr groß werden.

In diesem Beitrag binde ich meine mbtiles-Datei als BundleResource ein. Dadurch ist sie bereits in der App enthalten und muss nicht erst heruntergeladen werden. In einem realen Projekt würdest du möglicherweise anders vorgehen, aber der Ladevorgang bleibt gleich: Du holst dir einen Stream auf die Datei und gibst dem MBTile-Layer den Namen der Datenbank.

using (var mapStream = File.OpenRead("./demo_layers.mbtiles"))
{
    _mapView.Map.AddLayer(new LayerMBTile(SQLiteConnection.CreateFrom(mapStream, "map")));
}

Damit der Unterschied zwischen Online- und Offline-Karte sichtbar wird, habe ich für die Offline-Karte einen anderen Stil gewählt. Außerdem ist der Zoom-Level höher eingestellt, um Platz in der MBTiles-Datei zu sparen. Das Ergebnis sieht dann so aus:

Image of an map stored offline

Das Demo-Projekt und alle Dateien findest du auf bitbucket. Wenn dir der Artikel gefallen hat oder du Fragen hast, hinterlasse gerne einen Kommentar.

Update: Wenn du dich dafür interessierst, wie OSMSharp in einer Xamarin.Android-App integriert wird, lies auch meinen späteren Beitrag Erweitere deine Xamarin.Android-App mit OpenStreetMap.

FAQ

OpenStreetMap ist ein offenes Kartenprojekt, in dem geografische Informationen wie Straßen, Flüsse oder Gebäude gemeinschaftlich gesammelt und gepflegt werden. Im Unterschied zu klassischen Plattformen bekommt man hier auch Zugriff auf die Rohdaten.

Mit OSMSharp laden Sie eine Kartenansicht, setzen Kartenmittelpunkt und Zoom und binden über einen Tile-Server das gewünschte Kartenmaterial ein. Danach können Sie Marker und weitere Layer hinzufügen.

Ja. OSMSharp kann Karten auch aus lokalen Datenquellen wie MBTiles laden. Dazu wird die Datei als Ressource eingebunden und anschließend als Layer in die Kartenansicht geladen.

Sebastian Seidel

Sebastian Seidel

Als Mobile-Enthusiast und Geschäftsführer der Cayas Software GmbH ist es mir ein großes Anliegen, mein Team und unsere Kunden zu unterstützen, neue potenziale zu entdecken und gemeinsam zu wachsen. Hier schreibe ich vor allem zur Entwicklung von Android und iOS-Apps mit Xamarin und .NET MAUI.

Verwandte Artikel

Ein BeeWi-Auto mit Xamarin iOS steuern

Lerne in 5 einfachen Schritten, wie Bluetooth und das External Accessory Framework zusammenspielen, um ein BeeWi-Auto mit Xamarin.iOS zu steuern.

Spracheingabe erleichtert Dokumentation - ein Hackathon-Thema
Spracheingabe erleichtert Dokumentation - ein Hackathon-Thema

Spracheingabe macht es möglich, gegessene und getrunkene Lebensmittel intuitiv zu erfassen, ohne ständig auf ein Gerät schauen oder tippen zu müssen. Statt alles mühsam per Hand einzugeben, können Nutzer Mahlzeiten und Snacks einfach per Sprache dokumentieren. Das spart Zeit und senkt die Hürde für eine regelmäßige Erfassung.

7 Schritte zur Migration von Xamarin.Forms zu .NET MAUI
7 Schritte zur Migration von Xamarin.Forms zu .NET MAUI

Mit dem nahenden Ende des Supports für Xamarin im Mai 2024 sind Entwickler damit beschäftigt, bestehende Xamarin.Forms-Projekte auf .NET MAUI als Nachfolger zu migrieren. Das tun wir natürlich auch. In diesem Artikel zeige ich 7 Schritte, die wir während des Übergangs immer machen mussten, um Ihnen den Umstieg auf .NET MAUI zu erleichtern.