Riepilogo del capitolo 28. Posizione e mappe
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 HasZoomEnabled
false
. 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 tipoPosition
LatitudeDegrees
di tipodouble
, che indica l'altezza dell'area visualizzata della mappaLongitudeDegrees
di tipodouble
, che indica la larghezza dell'area visualizzata della mappaRadius
di tipoDistance
, 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:
Distance
costruttore con una distanza in metriDistance.FromMeters
metodo staticoDistance.FromKilometers
metodo staticoDistance.FromMiles
metodo statico
Il valore è disponibile da tre proprietà:
Meters
di tipodouble
Kilometers
di tipodouble
Miles
di tipodouble
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 Position
e 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:
MapSpan
costruttore con unPosition
intervallo di latitudine e longitudineMapSpan.FromCenterAndRadius
con unPosition
raggio e
È 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 tipostring
, una proprietà obbligatoriaAddress
di tipostring
, un indirizzo leggibile facoltativoPosition
di tipoPosition
, che indica dove viene visualizzato il segnaposto sulla mappaType
di tipoPinType
, un'enumerazione che non viene usata
Il progetto MapDemos contiene il file ScienceMuseums.xml, che elenca i musei scientifici nella Stati Uniti e Locations
Site
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:
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à.