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.FormsMapy 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.FormsMapy

W klasie jest zaangażowanych Map kilka wymagań.

Pakiet NuGet

Mapy Xamarin.Forms Bibliotekę NuGet należy dodać do rozwiązania aplikacji. Numer wersji powinien być taki sam jak Xamarin.Forms aktualnie zainstalowany pakiet.

Inicjowanie pakietu Mapy

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 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 Mapy DemoHomePage.xaml i Mapy DemoHomePage.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 falsewartość . Aby wyłączyć powiększanie, ustaw wartość HasZoomEnabledfalse. 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:

Position i Distance są obie struktury. PositionDefiniuje 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:

Wartość jest dostępna z trzech właściwości:

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.Mapy 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:

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 Telefon

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 typu string, wymagana właściwość
  • Address typu string, opcjonalny adres czytelny dla człowieka
  • Position typu Position, wskazujące miejsce wyświetlania pinezki na mapie
  • Type typu PinType, wyliczenie, które nie jest używane

Projekt MapDemos zawiera plik ScienceMuseums.xml, który zawiera listę muzeów nauki w Stany Zjednoczone oraz LocationsSite 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:

Potrójny zrzut ekranu przedstawiający stronę lokalnych muzeów

Program pokazuje również, jak dynamicznie ograniczyć liczbę pinezek na podstawie lokalizacji mapy.

Geokodowanie i powrót ponownie

Zestaw Xamarin.Forms.Mapy zawiera również klasę Geocoder z GetPositionsForAddressAsync 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.