Riepilogo del capitolo 28. Posizione e mappe

Download Sample Scaricare l'esempio

Nota

Questo libro è stato pubblicato nella primavera del 2016, e non è stato aggiornato da allora. C'è molto nel libro che rimane prezioso, ma alcuni materiali sono obsoleti, e alcuni argomenti non sono più completamente corretti o completi.

Xamarin.Forms supporta un Map elemento che deriva da View. A causa dei requisiti speciali della piattaforma coinvolti nell'uso delle mappe, vengono implementati in un assembly separato, Xamarin.Formscon estensione Mappe e comportano uno spazio dei nomi diverso: Xamarin.Forms.Maps.

Sistema di coordinate geografiche

Un sistema di coordinate geografiche identifica le posizioni su un oggetto sferico (o quasi sferico) come la Terra. Una coordinata è costituita sia da una latitudineche dalla longitudine espresse in angoli.

Un grande cerchio chiamato è equator a metà strada tra i due poli attraverso cui l'asse della Terra si estende concettualmente.

Paralleli e latitudine

Un angolo misurato a nord o a sud dell'equatore dal centro della Terra segna linee di latitudine uguale note come paralleli. Questi intervalli vanno da 0 gradi all'equatore a 90 gradi ai poli nord e sud. Per convenzione, le latitudine a nord dell'equatore sono valori positivi e quelli a sud dell'equatore sono valori negativi.

Longitudine e meridiani

Metà di grandi cerchi dal polo nord al polo sud sono linee di uguale longitudine, note anche come meridiani. Questi sono relativi al Primo Meridiano di Greenwich, Inghilterra. Per convenzione, le longitudini a est del Meridiano primo sono valori positivi compresi tra 0 e 180 gradi e le longitudini a ovest del Meridiano primo sono valori negativi compresi tra 0 e -180 gradi.

Proiezione equiretangulare

Qualsiasi mappa piatta della Terra introduce distorsioni. Se tutte le linee di latitudine e longitudine sono dritte e se le differenze uguali negli angoli di latitudine e longitudine corrispondono a distanze uguali sulla mappa, il risultato è una proiezione equiretangulare. Questa mappa distorce le aree più vicine ai poli perché si estendono orizzontalmente.

Proiezione mercator

La popolare proiezione mercator tenta di compensare l'estensione orizzontale estendendo anche queste aree verticalmente. Ciò comporta una mappa in cui le aree vicino ai poli appaiono molto più grandi di quanto siano realmente, ma qualsiasi area locale è molto conforme con l'area effettiva.

Eseguire il mapping di servizi e riquadri

I servizi mappa usano una variante della proiezione Mercator denominata Web Mercator. I servizi mappa forniscono riquadri bitmap a un client in base alla posizione e al livello di zoom.

Recupero della posizione dell'utente

Le Xamarin.FormsMap classi non includono una funzionalità per ottenere la posizione geografica dell'utente, ma è spesso consigliabile quando si usano le mappe, quindi un servizio di dipendenza deve gestirlo.

Nota

Xamarin.Forms le applicazioni possono invece usare la Geolocation classe inclusa in Xamarin.Essentials.

API di rilevamento della posizione

La Xamarin.Formssoluzione Book.Platform contiene il codice per un'API di rilevamento della posizione. La GeographicLocation struttura incapsula una latitudine e una longitudine. L'interfaccia ILocationTracker definisce due metodi per avviare e sospendere lo strumento di rilevamento della posizione e un evento quando è disponibile una nuova posizione.

Gestione della posizione iOS

L'implementazione iOS di ILocationTracker è una LocationTracker classe che usa iOS CLLocationManager.

Gestione posizioni Android

L'implementazione Android di ILocationTracker è una LocationTracker classe che usa la classe Android LocationManager .

Localizzatore geografico UWP

L'implementazione piattaforma UWP (Universal Windows Platform) di ILocationTracker è una LocationTracker classe che usa la piattaforma UWPGeolocator.

Visualizzare la posizione del telefono

L'esempio WhereAmI usa il localizzatore di posizione per visualizzare la posizione del telefono, sia nel testo che in una mappa equiretangulare.

Sovraccarico necessario

È necessario un sovraccarico per WhereAmI per usare lo strumento di rilevamento della posizione. Innanzitutto, tutti i progetti nella soluzione WhereAmI devono avere riferimenti ai progetti corrispondenti inXamarin.Forms Book.Platform e ogni progetto WhereAmI deve chiamare il Toolkit.Init metodo .

È necessario un sovraccarico aggiuntivo specifico della piattaforma, sotto forma di autorizzazioni per la posizione.

Autorizzazione percorso per iOS

Per iOS, il file info.plist deve includere elementi contenenti il testo di una domanda che chiede all'utente di consentire il recupero della posizione dell'utente.

Autorizzazioni per la posizione per Android

Le applicazioni Android che ottengono il percorso dell'utente devono disporre di un'autorizzazione ACCESS_FILE_LOCATION nel file AndroidManifest.xml.

Autorizzazioni per la posizione per la piattaforma UWP

Un'applicazione piattaforma UWP (Universal Windows Platform) deve avere una location funzionalità del dispositivo contrassegnata nel file Package.appxmanifest.

Uso di Xamarin.Forms.Mappe

Diversi requisiti sono coinvolti nell'uso della Map classe .

Pacchetto NuGet

.Xamarin.FormsMappe La libreria NuGet deve essere aggiunta alla soluzione dell'applicazione. Il numero di versione deve corrispondere al Xamarin.Forms pacchetto attualmente installato.

Inizializzazione del pacchetto Mappe

I progetti dell'applicazione devono chiamare il Xamarin.FormsMaps.Init metodo dopo aver effettuato una chiamata a Xamarin.Forms.Forms.Init.

Abilitazione dei servizi mappa

Map Poiché può ottenere la posizione dell'utente, l'applicazione deve ottenere l'autorizzazione per l'utente nel modo descritto in precedenza in questo capitolo:

Abilitazione delle mappe iOS

Un'applicazione iOS che usa Map richiede due righe nel file info.plist.

Abilitazione delle mappe Android

Per l'uso dei servizi Google Map è necessaria una chiave di autorizzazione. Questa chiave viene inserita nel file AndroidManifest.xml . Inoltre, il file AndroidManifest.xml richiede manifest tag coinvolti nell'ottenere il percorso dell'utente.

Abilitazione delle mappe UWP

Un'applicazione piattaforma UWP (Universal Windows Platform) richiede una chiave di autorizzazione per l'uso di Bing Mappe. Questa chiave viene passata come argomento al Xamarin.FormsMaps.Init metodo . L'applicazione deve essere abilitata anche per i servizi di posizione.

Mappa non adorata

L'esempio MapDemos è costituito da un file Mappe DemoHomePage.xaml e Mappe DemoHomePage.xaml.cs file code-behind che consente di passare a vari programmi dimostrativi.

Il file BasicMapPage.xaml mostra come visualizzare la Map visualizzazione. Per impostazione predefinita, visualizza la città di Roma, ma la mappa può essere modificata dall'utente.

Per disabilitare lo scorrimento orizzontale e verticale, impostare la HasScrollEnabled proprietà su false. Per disabilitare lo zoom, impostare su HasZoomEnabledfalse. Queste proprietà potrebbero non funzionare in tutte le piattaforme.

Strade e terreno

È possibile visualizzare diversi tipi di mappe impostando la Map proprietà MapType di tipo MapType, un'enumerazione con tre membri:

Il file MapTypesPage.xaml mostra come usare un pulsante di opzione per selezionare il tipo di mappa. Usa la RadioButtonManager classe nella Xamarin.Formslibreria Book.Toolkit e una classe basata sul file MapTypeRadioButton.xaml.

Coordinate mappa

Un programma può ottenere l'area Map corrente visualizzata tramite la VisibleRegion proprietà . Questa proprietà non è supportata da una proprietà associabile e non esiste alcun meccanismo di notifica per indicare quando è stata modificata, pertanto un programma che desidera monitorare la proprietà dovrebbe probabilmente usare un timer a tale scopo.

VisibleRegion è di tipo MapSpan, una classe con quattro proprietà di sola lettura:

  • Center di tipo Position
  • LatitudeDegrees di tipo double, che indica l'altezza dell'area visualizzata della mappa
  • LongitudeDegrees di tipo double, che indica la larghezza dell'area visualizzata della mappa
  • Radius di tipo Distance, che indica le dimensioni dell'area circolare più grande visibile sulla mappa

Position e Distance sono entrambe strutture. Position definisce due proprietà di sola lettura impostate tramite il Position costruttore :

Distance è progettato per fornire una distanza indipendente dall'unità di misura convertendo tra le unità di misura metrica e inglese. Un Distance valore può essere creato in diversi modi:

Il valore è disponibile da tre proprietà:

Il file MapCoordinatesPage.xaml contiene diversi Label elementi per la visualizzazione delle MapSpan informazioni. Il MapCoordinatesPage.xaml.cs file code-behind usa un timer per mantenere aggiornate le informazioni man mano che l'utente modifica la mappa.

Estensioni di posizione

Una nuova libreria per questo libro denominata Xamarin.FormsBook.Toolkit.Mappe contiene tipi specifici della mappa, ma indipendenti dalla piattaforma. La PositionExtensions classe ha un ToString metodo per Positione un metodo per calcolare la distanza tra due Position valori.

Impostazione di una posizione iniziale

È possibile chiamare il MoveToRegion metodo di per impostare a livello di Map codice una posizione e un livello di zoom sulla mappa. L'argomento è di tipo MapSpan. È possibile creare un MapSpan oggetto usando una delle opzioni seguenti:

È anche possibile creare un nuovo MapSpan oggetto da un esistente usando i metodi ClampLatitude o WithZoom.

Il file WyomingPage.xaml e WyomingPage.xaml.cs file code-behind illustra come usare il MoveToRegion metodo per visualizzare lo stato del Wyoming.

In alternativa, è possibile usare il Map costruttore con un MapSpan oggetto per inizializzare la posizione della mappa. Il file XamarinHQPage.xaml mostra come eseguire questa operazione interamente in XAML per visualizzare la sede centrale di Xamarin a San Francisco.

Zoom dinamico

È possibile usare un oggetto Slider per eseguire lo zoom dinamico di una mappa. Il file RadiusZoomPage.xaml e RadiusZoomPage.xaml.cs file code-behind mostrano come modificare il raggio di una mappa in base al Slider valore.

Il file LongitudeZoomPage.xaml e LongitudeZoomPage.xaml.cs file code-behind mostrano un approccio alternativo che funziona meglio in Android, ma nessun approccio funziona bene sulle piattaforme Windows.

Posizione del Telefono

La IsShowingUser proprietà di Map funziona in modo leggermente diverso in ogni piattaforma, come illustrato dal file ShowLocationPage.xaml :

  • In iOS, un punto blu indica la posizione del telefono, ma è necessario spostarsi manualmente lì
  • In Android viene visualizzata un'icona che, quando viene premuta, la mappa viene spostata nella posizione del telefono
  • La piattaforma UWP è simile a iOS, ma a volte passa automaticamente alla posizione

Il progetto MapDemos tenta di simulare l'approccio Android definendo innanzitutto un pulsante basato su icona basato sul file MyLocationButton.xaml e MyLocationButton.xaml.cs file code-behind.

Il file GoToLocationPage.xaml e GoToLocationPage.xaml.cs file code-behind usano questo pulsante per passare alla posizione del telefono.

Pin e musei scientifici

Infine, la Map classe definisce una Pins proprietà di tipo IList<Pin>. La Pin classe definisce quattro proprietà:

  • Label di tipo string, una proprietà obbligatoria
  • Address di tipo string, un indirizzo leggibile facoltativo
  • Position di tipo Position, che indica dove viene visualizzato il segnaposto sulla mappa
  • Type di tipo PinType, un'enumerazione che non viene usata

Il progetto MapDemos contiene il file ScienceMuseums.xml, che elenca i musei scientifici nella Stati Uniti e LocationsSite le classi per deserializzare questi dati.

Il file SciencePage.xaml e ScienceMuseumsPage.xaml.cs file code-behind visualizzano i pin per questi musei scientifici nella mappa. Quando l'utente tocca un pin, visualizza l'indirizzo e un sito Web per il museo.

Distanza tra due punti

La PositionExtensions classe contiene un DistanceTo metodo con un calcolo semplificato della distanza tra due posizioni geografiche.

Viene usato nel file LocalDevicesPage.xaml e LocalMuseumsPage.xaml.cs file code-behind per visualizzare anche la distanza dal museo dalla posizione dell'utente:

Triple screenshot of Local Museums Page

Il programma illustra anche come limitare dinamicamente il numero di pin in base alla posizione della mappa.

Geocodifica e ritorno

L'assembly Xamarin.Forms.Mappe contiene anche una Geocoder classe con un GetPositionsForAddressAsync metodo che converte un indirizzo di testo in zero o più posizioni geografiche possibili e un altro metodo GetAddressesForPositionAsync che converte nell'altra direzione.

Il file GeocoderRoundTrip.xaml e GeocoderRoundTrip.xaml.cs file code-behind illustrano questa funzionalità.