Podsumowanie rozdziału 28. Lokalizacja i mapy
Uwaga
Ta książka została opublikowana wiosną 2016 roku i od tego czasu nie została zaktualizowana. Jest wiele w książce, która pozostaje cenna, ale niektóre materiały są nieaktualne, a niektóre tematy nie są już całkowicie poprawne ani kompletne.
Xamarin.FormsMap
program obsługuje element pochodzący z elementu View
. Ze względu na specjalne wymagania dotyczące platformy związane z używaniem map są one implementowane w osobnym zestawie . Xamarin.Forms Mapy i obejmują inną przestrzeń nazw: Xamarin.Forms.Maps
.
System współrzędnych geograficznych
System współrzędnych geograficznych identyfikuje położenie obiektu kulistego (lub prawie spherical), takiego jak Ziemia. Współrzędna składa się zarówno z szerokości geograficznej, jak i długości geograficznej wyrażonej w kątach.
Wielki okrąg zwany equator
jest w połowie drogi między dwoma biegunami, przez które oś Ziemi koncepcyjnie rozciąga się.
Równoległe i szerokość geograficzna
Kąt mierzony na północ lub południe od równika z środka Ziemi oznacza linie równej szerokości geograficznej znanej jako równoległe. Wahają się one od 0 stopni na równiku do 90 stopni na biegunach północnych i południowych. Zgodnie z konwencją szerokości geograficzne na północ od równika są wartościami dodatnimi, a te na południe od równika są wartościami ujemnymi.
Długość geograficzna i szerokość geograficzna
Połówki wielkich kręgów z bieguna północnego do bieguna południowego to linie równej długości geograficznej, znane również jako południa. Są one względne wobec Prime England w Greenwich w Anglii. Zgodnie z konwencją długości geograficzne na wschód od Prime Południa są wartościami dodatnimi z 0 stopni do 180 stopni, a długości geograficzne na zachód od Prime Południa są wartościami ujemnymi z 0 stopni do –180 stopni.
Projekcja równoczesna
Każda płaska mapa Ziemi wprowadza zniekształcenia. Jeśli wszystkie linie szerokości geograficznej i długości geograficznej są proste, a jeśli równe różnice w kątach szerokości i długości geograficznej odpowiadają równym odległościom na mapie, wynik jest równoczesnym projekcją. Ta mapa zniekształca obszary bliżej biegunów, ponieważ są one rozciągnięte poziomo.
Projekcja Mercatora
Popularna projekcja Mercator próbuje zrekompensować poziome rozciąganie poprzez również rozciąganie tych obszarów w pionie. Wynika to z mapy, w której obszary w pobliżu biegunów wydają się znacznie większe niż naprawdę, ale każdy obszar lokalny jest ściśle zgodny z rzeczywistym obszarem.
Mapuj usługi i kafelki
Usługi mapy używają odmiany projekcji Mercator o nazwie Web Mercator
. Usługi mapy dostarczają kafelki map bitowych do klienta na podstawie lokalizacji i poziomu powiększenia.
Pobieranie lokalizacji użytkownika
Klasy Xamarin.FormsMap
nie obejmują obiektu w celu uzyskania lokalizacji geograficznej użytkownika, ale jest to często pożądane podczas pracy z mapami, więc usługa zależności musi ją obsłużyć.
Uwaga
Xamarin.Forms aplikacje mogą zamiast tego używać klasy dołączonej Geolocation
do klasy Xamarin.Essentials.
Interfejs API trackera lokalizacji
Rozwiązanie Xamarin.FormsBook.Platform zawiera kod interfejsu API trackera lokalizacji. Struktura GeographicLocation
hermetyzuje szerokość geograficzną i długość geograficzną. Interfejs ILocationTracker
definiuje dwie metody uruchamiania i wstrzymania monitora lokalizacji oraz zdarzenia, gdy jest dostępna nowa lokalizacja.
Menedżer lokalizacji systemu iOS
Implementacja ILocationTracker
systemu iOS to LocationTracker
klasa, która korzysta z systemu iOS CLLocationManager
.
Menedżer lokalizacji systemu Android
Implementacja ILocationTracker
systemu Android to LocationTracker
klasa, która korzysta z klasy systemu Android LocationManager
.
Lokalizator geograficzny platformy UNIWERSALNEJ systemu Windows
Implementacja LocationTracker
platforma uniwersalna systemu Windows ILocationTracker
klasy, która korzysta z platformy UWPGeolocator
.
Wyświetlanie lokalizacji telefonu
Przykład WhereAmI używa monitora lokalizacji do wyświetlania lokalizacji telefonu, zarówno w tekście, jak i na równokątnej mapie.
Wymagane obciążenie
Aby usługa WhereAmI korzystała z monitora lokalizacji, wymagane jest pewne obciążenie. Po pierwsze, wszystkie projekty w rozwiązaniu WhereAmI muszą mieć odwołania do odpowiednich projektów wXamarin.Forms book.platform, a każdy projekt WhereAmI musi wywołać metodę Toolkit.Init
.
Wymagane jest pewne dodatkowe obciążenie specyficzne dla platformy, w postaci uprawnień do lokalizacji.
Uprawnienie do lokalizacji dla systemu iOS
W przypadku systemu iOS plik info.plist musi zawierać elementy zawierające tekst pytania zadającego użytkownikowi, aby umożliwić uzyskanie lokalizacji tego użytkownika.
Uprawnienia lokalizacji dla systemu Android
Aplikacje systemu Android, które uzyskują lokalizację użytkownika, muszą mieć uprawnienia ACCESS_FILE_LOCATION w pliku AndroidManifest.xml.
Uprawnienia lokalizacji dla platformy UWP
Aplikacja platforma uniwersalna systemu Windows musi mieć funkcję urządzenia oznaczoną location
w pliku Package.appxmanifest.
Praca z Xamarin.Formsprogramem . Mapy
W klasie jest zaangażowanych Map
kilka wymagań.
Pakiet NuGet
Element Xamarin.Forms. Do rozwiązania aplikacji należy dodać bibliotekę NuGet map . Numer wersji powinien być taki sam jak Xamarin.Forms aktualnie zainstalowany pakiet.
Inicjowanie pakietu Maps
Projekty aplikacji muszą wywołać metodę Xamarin.FormsMaps.Init
po wywołaniu metody .Xamarin.Forms.Forms.Init
Włączanie usług mapy
Map
Ponieważ użytkownik może uzyskać lokalizację użytkownika, aplikacja musi uzyskać uprawnienia dla użytkownika w sposób opisany wcześniej w tym rozdziale:
Włączanie map systemu iOS
Aplikacja systemu iOS używająca Map
wymaga dwóch wierszy w pliku info.plist.
Włączanie map systemu Android
Klucz autoryzacji jest wymagany do korzystania z usług Google Map. Ten klucz jest wstawiany w pliku AndroidManifest.xml . Ponadto plik AndroidManifest.xml wymaga manifest
tagów związanych z uzyskaniem lokalizacji użytkownika.
Włączanie map platformy UWP
Aplikacja platforma uniwersalna systemu Windows wymaga klucza autoryzacji do korzystania z usługi Mapy Bing. Ten klucz jest przekazywany jako argument do Xamarin.FormsMaps.Init
metody . Aplikacja musi być również włączona dla usług lokalizacji.
Nieadorowana mapa
Przykład MapDemos składa się z pliku MapsDemoHomePage.xaml i MapsDemoHomePage.xaml.cs pliku za pomocą kodu, który umożliwia przechodzenie do różnych programów demonstracyjnych.
Plik BasicMapPage.xaml pokazuje, jak wyświetlić Map
widok. Domyślnie wyświetla miasto Rzym, ale mapa może być manipulowana przez użytkownika.
Aby wyłączyć przewijanie w poziomie i w pionie, ustaw HasScrollEnabled
właściwość na false
wartość . Aby wyłączyć powiększanie, ustaw wartość HasZoomEnabled
false
. Te właściwości mogą nie działać na wszystkich platformach.
Ulice i teren
Można wyświetlić różne typy map, ustawiając Map
właściwość MapType
typu MapType
, wyliczenie z trzema elementami członkowskimi:
Plik MapTypesPage.xaml pokazuje, jak wybrać typ mapy za pomocą przycisku radiowego. RadioButtonManager
Używa klasy w Xamarin.Formsbibliotece Book.Toolkit i klasy opartej na pliku MapTypeRadioButton.xaml.
Współrzędne mapy
Program może uzyskać bieżący obszar wyświetlany Map
za pośrednictwem VisibleRegion
właściwości . Ta właściwość nie jest wspierana przez właściwość, którą można powiązać, i nie ma mechanizmu powiadamiania wskazującego, kiedy uległa zmianie, więc program, który chce monitorować właściwość, powinien prawdopodobnie używać czasomierza do tego celu.
VisibleRegion
jest typu MapSpan
, klasa z czterema właściwościami tylko do odczytu:
Center
typuPosition
LatitudeDegrees
typudouble
, wskazujące wysokość wyświetlanego obszaru mapyLongitudeDegrees
typudouble
, wskazując szerokość wyświetlanego obszaru mapyRadius
typuDistance
, wskazujący rozmiar największego okrągłego obszaru widocznego na mapie
Position
i Distance
są obie struktury. Position
Definiuje dwie właściwości tylko do odczytu ustawione za pomocą konstruktoraPosition
:
Distance
ma na celu zapewnienie niezależnej od jednostki odległości przez konwersję między metryką a jednostkami angielskimi. Distance
Wartość można utworzyć na kilka sposobów:
Distance
konstruktor o odległości w metrachDistance.FromMeters
statyczna metodaDistance.FromKilometers
statyczna metodaDistance.FromMiles
statyczna metoda
Wartość jest dostępna z trzech właściwości:
Meters
typudouble
Kilometers
typudouble
Miles
typudouble
Plik MapCoordinatesPage.xaml zawiera kilka Label
elementów do wyświetlania MapSpan
informacji. Plik MapCoordinatesPage.xaml.cs kodu używa czasomierza, aby informacje były aktualizowane, gdy użytkownik manipuluje mapą.
Rozszerzenia położenia
Nowa biblioteka dla tej książki o nazwie Xamarin.FormsBook.Toolkit.Maps zawiera typy specyficzne dla mapy, ale niezależne od platformy. Klasa PositionExtensions
ma metodę Position
, i metodę ToString
obliczania odległości między dwiema Position
wartościami.
Ustawianie lokalizacji początkowej
Możesz wywołać metodę MoveToRegion
, Map
aby programowo ustawić lokalizację i poziom powiększenia na mapie. Argument jest typu MapSpan
. Obiekt można utworzyć MapSpan
przy użyciu jednego z następujących elementów:
MapSpan
konstruktor z zakresem szerokości geograficznej i szerokości geograficznejPosition
MapSpan.FromCenterAndRadius
z promieniemPosition
i
Istnieje również możliwość utworzenia nowego MapSpan
elementu na podstawie istniejącej przy użyciu metod ClampLatitude
lub WithZoom
.
Plik WyomingPage.xaml i WyomingPage.xaml.cs plik związany z kodem pokazuje, jak za pomocą MoveToRegion
metody wyświetlić stan Wyoming.
Możesz też użyć konstruktora Map
z obiektemMapSpan
, aby zainicjować lokalizację mapy. Plik XamarinHQPage.xaml pokazuje, jak to zrobić całkowicie w języku XAML , aby wyświetlić siedzibę platformy Xamarin w San Francisco.
Dynamiczne powiększanie
Możesz użyć kontrolki , Slider
aby dynamicznie powiększać mapę. Plik RadiusZoomPage.xaml i RadiusZoomPage.xaml.cs plik za kodem pokazują, jak zmienić promień mapy na Slider
podstawie wartości.
Plik LongitudeZoomPage.xaml i LongitudeZoomPage.xaml.cs plik związany z kodem pokazują alternatywne podejście, które działa lepiej w systemie Android, ale żadne podejście nie działa dobrze na platformach Windows.
Lokalizacja telefonu
Właściwość IsShowingUser
funkcji Map
działa nieco inaczej na każdej platformie, ponieważ plik ShowLocationPage.xaml pokazuje:
- W systemie iOS niebieska kropka wskazuje lokalizację telefonu, ale musisz ręcznie nawigować po nim
- W systemie Android jest wyświetlana ikona, która po wypchnięciu przenosi mapę do lokalizacji telefonu
- Platforma UWP jest podobna do systemu iOS, ale czasami automatycznie przechodzi do lokalizacji
Projekt MapDemos próbuje naśladować podejście systemu Android, najpierw definiując przycisk oparty na ikonach na podstawie pliku MyLocationButton.xaml i MyLocationButton.xaml.cs pliku za pomocą kodu.
Plik GoToLocationPage.xaml i GoToLocationPage.xaml.cs za pomocą tego przycisku użyj tego przycisku, aby przejść do lokalizacji telefonu.
Szpilki i muzea naukowe
Map
Na koniec klasa definiuje Pins
właściwość typu IList<Pin>
. Klasa Pin
definiuje cztery właściwości:
Label
typustring
, wymagana właściwośćAddress
typustring
, opcjonalny adres czytelny dla człowiekaPosition
typuPosition
, wskazujące miejsce wyświetlania pinezki na mapieType
typuPinType
, wyliczenie, które nie jest używane
Projekt MapDemos zawiera plik ScienceMuseums.xml, który zawiera listę muzeów nauki w Stany Zjednoczone oraz Locations
Site
klasy do deserializacji tych danych.
Plik ScienceAccesssPage.xaml i ScienceMuseumsPage.xaml.cs kod za plikiem wyświetlają pinezki dla tych muzeów naukowych na mapie. Gdy użytkownik naciągnie pinezkę, wyświetli adres i witrynę internetową muzeum.
Odległość między dwoma punktami
Klasa PositionExtensions
zawiera metodę DistanceTo
z uproszczonym obliczeniem odległości między dwoma lokalizacjami geograficznymi.
Jest on używany w pliku LocalAccesssPage.xaml i LocalMuseumsPage.xaml.cs pliku za pomocą kodu, aby również wyświetlić odległość do muzeum z lokalizacji użytkownika:
Program pokazuje również, jak dynamicznie ograniczyć liczbę pinezek na podstawie lokalizacji mapy.
Geokodowanie i powrót ponownie
Element Xamarin.Forms. Zestaw mapy zawiera również klasę Geocoder
GetPositionsForAddressAsync
z metodą, która konwertuje adres tekstowy na zero lub więcej możliwych pozycji geograficznych, a także inną metodę GetAddressesForPositionAsync
, która konwertuje w innym kierunku.
Plik GeocoderRoundTrip.xaml i GeocoderRoundTrip.xaml.cs plik związany z kodem pokazują ten obiekt.