Zusammenfassung von Kapitel 28. Standort und Karten

Beispiel herunterladen Das Beispiel herunterladen

Hinweis

Dieses Buch wurde im Frühjahr 2016 veröffentlicht und seitdem nicht aktualisiert. Wenngleich ein großer Teil des Buchs weiterhin relevante Informationen liefert, sind einige Abschnitte veraltet, und einige Themen sind nicht mehr korrekt oder vollständig.

Xamarin.Forms unterstützt ein Map-Element, das von View abgeleitet wird. Aufgrund der speziellen Plattformanforderungen, die bei der Verwendung von Karten zum Tragen kommen, sind sie in einer gesonderten Assembly ( Xamarin.Forms.Maps) und verwenden einen anderen Namespace: Xamarin.Forms.Maps.

Das geografische Koordinatensystem

Ein geografisches Koordinatensystem identifiziert Standorte auf einem kugelförmigen (oder fast kugelförmigen) Objekt wie der Erde. Eine Koordinate besteht aus einem Breitengrad und einem Längengrad, ausgedrückt in Winkeln.

Ein großer Kreis, bezeichnet als equator, liegt in der Mitte zwischen den beiden Polen, durch die die Achse der Erde konzeptionell verläuft.

Breitenkreise und Längengrad

Ein nördlich oder südlich des Äquators von der Mitte der Erde aus gemessener Winkel markiert Linien gleicher Breite, auch bekannt als Breitenkreise (Parallelen). Diese reichen von 0 Grad am Äquator bis hin zu 90 Grad am Nord- und Südpol. Per Konvention besitzen Breitengrade nördlich des Äquators positive Werte, Breitengrade südlich des Äquators haben negative Werte.

Längengrad und Meridiane

Die Hälften großer Kreise vom Nord- zum Südpol sind Linien gleicher Länge, auch bekannt als Meridiane. Diese sind relativ zum Nullmeridian in Greenwich, England. Gemäß der Konvention sind Längengrade östlich des Meridians positive Werte von 0 Grad bis 180 Grad, und Längengrade westlich des Meridians sind negative Werte von 0 Grad bis –180 Grad.

Die Equirektangularprojektion

Jede Plattkarte der Erde führt Verzerrungen ein. Wenn alle Breiten- und Längengradlinien gerade sind, und wenn gleiche Abstände bei Breitengrad- und Längengradwinkeln gleichen Abständen auf der Karte entsprechen, ist das Ergebnis eine equirektangulare Projektion. Bei dieser Karte werden Gebiete näher an den Polen verzerrt, weil sie horizontal gestreckt werden.

Die Mercator-Projektion

Die beliebte Mercator-Projektion versucht, die horizontale Streckung zu kompensieren, indem diese Gebiete ebenfalls vertikal gestreckt werden. Dies führt zu einer Karte, bei der Gebiete in der Nähe der Pole wesentlich größer erscheinen, als sie tatsächlich sind, aber jedes lokale Gebiet entspricht ziemlich genau der tatsächlichen Fläche.

Kartendienste und -kacheln

Kartendienste verwenden eine Variation der Mercator-Projektion namens Web Mercator. Die Kartendienste liefern Bitmapkacheln an einen Client, basierend auf Standort und Zoomfaktor.

Abrufen des Standorts des Benutzers

Die Xamarin.FormsMap Klassen enthalten keine Möglichkeit zum Abrufen des geografischen Standorts des Benutzers, aber dies ist bei der Arbeit mit Karten häufig wünschenswert, sodass ein Abhängigkeitsdienst dies behandeln muss.

Hinweis

Xamarin.Forms-Anwendungen können stattdessen die in Xamarin.Essentials enthaltene Geolocation-Klasse verwenden.

Die Standorttracker-API

Die Projektmappe Xamarin.FormsBook.Platform enthält Code für eine Standorttracker-API. Die GeographicLocation-Struktur kapselt einen Breiten- und Längengrad. Die ILocationTracker-Schnittstelle definiert zwei Methoden zum Starten und Anhalten des Standorttrackers sowie ein Ereignis, wenn ein neuer Standort verfügbar ist.

Der Standort-Manager von iOS

Die iOS-Implementierung von ILocationTracker ist eine LocationTracker-Klasse, die den CLLocationManager von iOS verwendet.

Der Standort-Manager von Android

Die Android-Implementierung von ILocationTracker ist eine LocationTracker-Klasse, die den LocationManager von Android verwendet.

Der Geo-Locator von UWP

Die universelle Windows-Plattformimplementierung von ILocationTracker ist eine LocationTracker-Klasse, die den Geolocator der UWP verwendet.

Anzeigen des Standorts eines Telefons

Im WhereAmI-Beispiel wird der Standorttracker verwendet, um den Standort des Telefons anzuzeigen, sowohl als Text als auch auf einer equirektangularen Karte.

Der erforderliche Mehraufwand

Damit WhereAmI den Standorttracker verwenden kann, ist ein gewisser Mehraufwand erforderlich. Zunächst müssen alle Projekte in der Projektmappe WhereAmI Verweise auf die entsprechenden Projekte in Xamarin.FormsBook.Platform enthalten, und jedes WhereAmI-Projekt muss die Toolkit.Init-Methode aufrufen.

Ein gewisser plattformspezifischer Mehraufwand in Form von Standortberechtigungen ist erforderlich.

Standortberechtigungen für iOS

Bei iOS muss die Datei info.plist Elemente einschließen, die den Text einer Frage enthalten, mit der der Benutzer aufgefordert wird, das Abrufen des Benutzerstandorts zuzulassen.

Standortberechtigungen für Android

Android-Anwendungen, die den Standort des Benutzers abrufen, müssen über eine ACCESS_FILE_LOCATION-Berechtigung in der Datei „AndroidManifest.xml“ verfügen.

Standortberechtigungen für UWP

Eine universelle Windows-Plattformanwendung muss über eine location-Gerätefunktion verfügen, die in der Datei „Package.appxmanifest“ gekennzeichnet ist.

Arbeiten mit Xamarin.Forms.Maps

Bei der Verwendung der Map-Klasse gibt es mehrere Anforderungen.

Das NuGet-Paket

Die NuGet-Bibliothek Xamarin.Forms.Maps muss der Anwendungsprojektmappe hinzugefügt werden. Die Versionsnummer sollte mit der des derzeit installierten Xamarin.Forms -Pakets identisch sein.

Initialisieren des Maps-Pakets

Die Anwendungsprojekte müssen die Xamarin.FormsMaps.Init-Methode ausrufen, nachdem Xamarin.Forms.Forms.Init aufgerufen wurde.

Aktivieren von Kartendiensten

Da die Map den Standort des Benutzers ermitteln kann, muss die Anwendung die Berechtigung für den Benutzer in der weiter oben in diesem Kapitel beschriebenen Art abrufen:

Aktivieren von iOS-Karten

Eine iOS-Anwendung, die Map verwendet, benötigt zwei Zeilen in der Datei „info.plist“.

Aktivieren von Android-Karten

Für die Verwendung der Google Maps-Dienste ist ein Autorisierungsschlüssel erforderlich. Dieser Schlüssel wird in die Datei AndroidManifest.xml eingefügt. Zusätzlich erfordert die Datei AndroidManifest.xmlmanifest-Tags, die am Ermitteln des Standorts des Benutzers beteiligt sind.

Aktivieren von UWP-Karten

Eine universelle Windows-Plattformanwendung benötigt für die Verwendung von Bing Maps einen Autorisierungsschlüssel. Dieser Schlüssel wird als Argument an die Xamarin.FormsMaps.Init-Methode übergeben. Die Anwendung muss auch für Ortungsdienste aktiviert werden.

Die einfache Karte

Das MapDemos-Beispiel besteht aus einer Datei MapsDemoHomePage.xaml und einer CodeBehind-Datei MapsDemoHomePage.xaml.cs, die das Navigieren zu verschiedenen Demonstrationsprogrammen ermöglicht.

In der Datei BasicMapPage.xaml wird gezeigt, wie Sie die Map-Ansicht anzeigen. Standardmäßig wird in dieser die Stadt Rom angezeigt, aber die Karte kann vom Benutzer geändert werden.

Um horizontales und vertikales Scrollen zu deaktivieren, legen Sie die HasScrollEnabled-Eigenschaft auf false fest. Um Zoomen zu deaktivieren, legen Sie HasZoomEnabled auf false fest. Diese Eigenschaften funktionieren vielleicht nicht auf allen Plattformen.

Straßen und Gelände

Sie können verschiedene Typen von Karten anzeigen, indem Sie die Map-Eigenschaft MapType vom Typ MapType festlegen, eine Enumeration mit drei Membern:

In der Datei MapTypesPage.xaml wird gezeigt, wie Sie ein Optionsfeld verwenden, um den Kartentyp auszuwählen. Es verwendet die RadioButtonManager -Klasse in der Xamarin.FormsBook.Toolkit-Bibliothek und eine Klasse, die auf der Datei MapTypeRadioButton.xaml basiert.

Kartenkoordinaten

Ein Programm kann das aktuelle Gebiet, das von der Map angezeigt wird, mithilfe der VisibleRegion-Eigenschaft anzeigen. Diese Eigenschaft wird nicht von einer bindbaren Eigenschaft unterstützt, und es gibt keinen Benachrichtigungsmechanismus, um anzugeben, wenn sie sich geändert hat, sodass ein Programm, das die Eigenschaft überwachen möchte, wahrscheinlich zu diesem Zweck einen Timer verwenden sollte.

VisibleRegion ist vom Typ MapSpan, einer Klasse mit vier schreibgeschützten Eigenschaften:

  • Center vom Typ Position
  • LatitudeDegrees vom Typ double, was die Höhe des auf der Karte angezeigten Gebiets angibt.
  • LongitudeDegrees vom Typ double, was die Breite des auf der Karte angezeigten Gebiets angibt.
  • Radius vom Typ Distance, was die Größe des größten kreisförmigen Gebiets angibt, das auf der Karte sichtbar ist.

Position und Distance sind beides Strukturen. Position definiert über den Position-Konstruktor zwei schreibgeschützte Eigenschaften:

Distance soll eine einheitenunabhängige Entfernung bereitstellen, indem zwischen metrischen und englischen Einheiten konvertiert wird. Ein Distance-Wert kann auf verschiedene Weise erstellt werden:

Der Wert steht über drei Eigenschaften zur Verfügung:

Die Datei MapCoordinatesPage.xaml enthält mehrere Label-Elemente zum Anzeigen der MapSpan-Informationen. Die CodeBehind-Datei MapCoordinatesPage.xaml.cs verwendet einen Timer, um die Informationen aktuell zu halten, wenn der Benutzer die Karte ändert.

Positionserweiterungen

Eine neue Bibliothek für dieses Buch namens Xamarin.FormsBook.Toolkit.Maps enthält kartenspezifische, aber plattformunabhängige Typen. Die PositionExtensions-Klasse besitzt eine ToString-Methode für Position sowie eine Methode zum Berechnen der Entfernung zwischen zwei Position-Werten.

Festlegen eines Ausgangsorts

Sie können die MoveToRegion -Methode von Map aufrufen, um eine Position und einen Zoomfaktor auf der Karte programmgesteuert festzulegen. Das Argument ist vom Typ MapSpan. Sie können auf eine der folgenden Weisen ein MapSpan-Objekt erstellen:

Es ist auch möglich, eine neue MapSpan aus einer vorhandenen zu erstellen, indem Sie die Methoden ClampLatitude oder WithZoom verwenden.

Die Datei WyomingPage.xaml und die CodeBehind-Datei WyomingPage.xaml.cs veranschaulichen, wie Sie die MoveToRegion-Methode verwenden, um den Bundesstaat Wyoming anzuzeigen.

Alternativ können Sie den Map Konstruktor mit einem MapSpan -Objekt verwenden, um die Position der Karte zu initialisieren. Die Datei XamarinHQPage.xaml zeigt, wie Sie dies vollständig in XAML machen, um die Hauptniederlassung von Xamarin in San Francisco anzuzeigen.

Dynamisches Zoomen

Sie können einen Slider verwenden, um eine Karte dynamisch zu zoomen. Due Datei RadiusZoomPage.xaml und die CodeBehind-Datei RadiusZoomPage.xaml.cs zeigen, wie Sie den Radius einer Karte ändern, basierend auf dem Slider-Wert.

Die Datei LongitudeZoomPage.xaml und die CodeBehind-Datei LongitudeZoomPage.xaml.cs zeigen einen alternativen Ansatz, der unter Android besser funktioniert, aber keiner der Ansätze funktioniert gut auf der Windows-Plattform.

Der Standort eines Telefons

Die IsShowingUser-Eigenschaft von Map funktioniert auf jeder Plattform etwas anders, wie die Datei ShowLocationPage.xaml zeigt:

  • Unter iOS zeigt ein blauer Punkt den Standort des Telefons an, aber Sie müssen manuell dorthin navigieren.
  • Unter Android wird ein Symbol angezeigt, das, wenn Sie darauf drücken, die Karte an den Standort des Telefons verschiebt.
  • Die UWP ähnelt iOS, navigiert aber manchmal automatisch zu dem Standort.

Das MapDemos-Projekt versucht, den Android-Ansatz nachzuahmen, indem zuerst eine symbolbasierte Schaltfläche auf Grundlage der Datei MyLocationButton.xaml und der CodeBehind-Datei MyLocationButton.xaml.cs definiert wird.

Die Datei GoToLocationPage.xaml und die CodeBehind-Datei GoToLocationPage.xaml.cs verwenden diese Schaltfläche, um zum Standort des Telefons zu navigieren.

Stecknadeln und Wissenschaftsmuseen

Schließlich definiert die Map-Klasse eine Pins-Eigenschaft vom Typ IList<Pin>. Die Pin-Klasse definiert vier Eigenschaften:

  • Label vom Typ string, eine erforderliche Eigenschaft.
  • Address vom Typ string, eine optionale, lesbare Adresse.
  • Position vom Typ Position, die angibt, wo die Stecknadel auf der Karte angezeigt wird.
  • Type vom Typ PinType, eine Enumeration, die nicht verwendet wird.

Das MapDemos-Projekt enthält die Datei ScienceMuseums.xml, in der Wissenschaftsmuseen der USA aufgelistet werden, sowie Locations und Site-Klassen zum Deserialisieren dieser Daten.

Die Datei ScienceMuseumsPage.xaml und die CodeBehind-Datei ScienceMuseumsPage.xaml.cs zeigen Stecknadeln für diese Wissenschaftsmuseen auf der Karte an. Wenn der Benutzer auf eine Stecknadel tippt, werden die Adresse und eine Website für das Museum angezeigt.

Die Entfernung zwischen zwei Punkten

Die PositionExtensions-Klasse enthält eine DistanceTo-Methode mit einer vereinfachten Berechnung der Entfernung zwischen zwei geografischen Standorten.

Diese wird in der Datei LocalMuseumsPage.xaml und der CodeBehind-Datei LocalMuseumsPage.xaml.cs verwendet, um außerdem die Entfernung zu dem Museum vom Standort des Benutzers aus anzuzeigen:

Dreifacher Screenshot der Seite

Das Programm veranschaulicht außerdem, wie die Anzahl der Stecknadeln auf Grundlage des Standorts der Karte dynamisch eingeschränkt werden kann.

Geocodierung und wieder zurück

Die Xamarin.Forms. Kartenassembly enthält auch eine Geocoder Klasse mit einer GetPositionsForAddressAsync Methode, die eine Textadresse in null oder mehr mögliche geografische Positionen konvertiert, und eine andere Methode GetAddressesForPositionAsync , die in die andere Richtung konvertiert.

Diese Funktion wird in der Datei GeocoderRoundTrip.xaml und der CodeBehind-Datei GeocoderRoundTrip.xaml.cs veranschaulicht.