Zusammenfassung von Kapitel 28. Standort und Karten
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. In der Konvention sind Längengrade östlich des Prime Meridian positive Werte von 0 Grad bis 180 Grad, und Längengrade westlich des Prime Meridian 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, dies ist jedoch häufig wünschenswert, wenn Sie mit Karten arbeiten, sodass ein Abhängigkeitsdienst sie 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.xml manifest
-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. Dabei wird die RadioButtonManager
-Klasse aus der Bibliothek Xamarin.FormsBook.Toolkit sowie eine Klasse, basierend auf der Datei MapTypeRadioButton.xaml, verwendet.
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 TypPosition
LatitudeDegrees
vom Typdouble
, was die Höhe des auf der Karte angezeigten Gebiets angibt.LongitudeDegrees
vom Typdouble
, was die Breite des auf der Karte angezeigten Gebiets angibt.Radius
vom TypDistance
, 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:
Distance
-Konstruktor mit einer Entfernung in Metern.- Statische Methode
Distance.FromMeters
. - Statische Methode
Distance.FromKilometers
. - Statische Methode
Distance.FromMiles
.
Der Wert steht über drei Eigenschaften zur Verfügung:
Meters
vom Typdouble
Kilometers
vom Typdouble
Miles
vom Typdouble
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 einen Standort und Zoomfaktor programmgesteuert auf der Karte festzulegen. Das Argument ist vom Typ MapSpan
. Sie können auf eine der folgenden Weisen ein MapSpan
-Objekt erstellen:
MapSpan
-Konstruktor mit einerPosition
sowie einem Breiten- und Längengradbereich.MapSpan.FromCenterAndRadius
mit einerPosition
und einem Radius.
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 den Standort 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 Typstring
, eine erforderliche Eigenschaft.Address
vom Typstring
, eine optionale, lesbare Adresse.Position
vom TypPosition
, die angibt, wo die Stecknadel auf der Karte angezeigt wird.Type
vom TypPinType
, 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:
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 Die 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 wird.
Diese Funktion wird in der Datei GeocoderRoundTrip.xaml und der CodeBehind-Datei GeocoderRoundTrip.xaml.cs veranschaulicht.