Resumo do Capítulo 28. Localização e mapas

Baixar exemplo Baixar o exemplo

Observação

Este livro foi publicado na primavera de 2016, e não foi atualizado desde então. Há muito no livro que permanece valioso, mas parte do material está desatualizado, e alguns tópicos não estão mais totalmente corretos ou completos.

Xamarin.Forms dá suporte a um Map elemento que deriva de View. Devido aos requisitos especiais da plataforma envolvidos no uso de mapas, eles são implementados em um assembly separado, Xamarin.Forms. Mapeia e envolve um namespace diferente: Xamarin.Forms.Maps.

O sistema de coordenadas geográficas

Um sistema de coordenadas geográficas identifica posições em um objeto esférico (ou quase esférico) como a Terra. Uma coordenada consiste em uma latitude e longitude expressas em ângulos.

Um grande círculo chamado é equator no meio do caminho entre os dois pólos pelos quais o eixo da Terra se estende conceitualmente.

Paralelos e latitude

Um ângulo medido norte ou sul do equador do centro da Terra marca linhas de latitude igual conhecidas como paralelos. Estes variam de 0 graus no equador a 90 graus nos pólos norte e sul. Por convenção, as latitudes ao norte do equador são valores positivos e as do sul do equador são valores negativos.

Longitude e meridianos

Metades de grandes círculos do pólo norte até o pólo sul são linhas de igual longitude, também conhecidas como meridianos. Estes são relativos ao Primeiro Meridiano em Greenwich, Inglaterra. Por convenção, longitudes a leste do Meridiano Principal são valores positivos de 0 graus a 180 graus, e longitudes a oeste do Meridiano Principal são valores negativos de 0 graus a -180 graus.

A projeção equirectangular

Qualquer mapa plano da Terra introduz distorções. Se todas as linhas de latitude e longitude forem retas e se diferenças iguais em ângulos de latitude e longitude corresponderem a distâncias iguais no mapa, o resultado será uma projeção equirectangular. Este mapa distorce áreas mais próximas dos pólos porque elas estão horizontalmente estendidas.

A projeção do Mercator

A projeção popular do Mercator tenta compensar o alongamento horizontal, alongando também essas áreas verticalmente. Isso resulta em um mapa onde as áreas próximas aos pólos parecem muito maiores do que realmente são, mas qualquer área local está em conformidade com a área real.

Mapear serviços e blocos

Os serviços de mapa usam uma variação da projeção do Mercator chamada Web Mercator. Os serviços de mapa fornecem blocos de bitmap para um cliente com base no local e no nível de zoom.

Obtendo a localização do usuário

As Xamarin.FormsMap classes não incluem um recurso para obter a localização geográfica do usuário, mas isso geralmente é desejável ao trabalhar com mapas, portanto, um serviço de dependência deve lidar com isso.

Observação

Xamarin.Forms Em vez disso, os aplicativos podem usar a Geolocation classe incluída em Xamarin.Essentials.

A API do rastreador de localização

A Xamarin.Formssolução Book.Platform contém código para uma API de rastreador de localização. A GeographicLocation estrutura encapsula uma latitude e longitude. A ILocationTracker interface define dois métodos para iniciar e pausar o rastreador de localização e um evento quando um novo local está disponível.

O gerenciador de localização do iOS

A implementação do iOS de ILocationTracker é uma LocationTracker classe que usa o iOS CLLocationManager.

O gerenciador de localização do Android

A implementação do Android de ILocationTracker é uma LocationTracker classe que usa a classe Android LocationManager .

O localizador geográfico UWP

A implementação Plataforma Universal do Windows de ILocationTracker é uma LocationTracker classe que usa a UWP Geolocator.

Exibir a localização do telefone

O exemplo WhereAmI usa o rastreador de localização para exibir a localização do telefone, tanto no texto quanto em um mapa equirectangular.

A sobrecarga necessária

Alguma sobrecarga é necessária para o WhereAmI usar o rastreador de localização. Primeiro, todos os projetos na solução WhereAmI devem ter referências aos projetos correspondentes em Xamarin.FormsBook.Platform e cada projeto WhereAmI deve chamar o Toolkit.Init método .

Algumas sobrecargas adicionais específicas da plataforma, na forma de permissões de localização, são necessárias.

Permissão de localização para iOS

Para iOS, o arquivo info.plist deve incluir itens que contenham o texto de uma pergunta que faça ao usuário permitir a obtenção da localização desse usuário.

Permissões de localização para Android

Os aplicativos Android que obtêm a localização do usuário devem ter uma permissão ACCESS_FILE_LOCATION no arquivo AndroidManifest.xml.

Permissões de localização para a UWP

Um aplicativo Plataforma Universal do Windows deve ter uma location funcionalidade de dispositivo marcada no arquivo Package.appxmanifest.

Trabalhando com Xamarin.Forms. Mapas

Vários requisitos estão envolvidos no uso da Map classe .

O pacote NuGet

O Xamarin.Forms. A biblioteca do NuGet de mapas deve ser adicionada à solução de aplicativo. O número de versão deve ser o mesmo que o Xamarin.Forms pacote instalado no momento.

Inicializando o pacote mapas

Os projetos de aplicativo devem chamar o Xamarin.FormsMaps.Init método depois de fazer uma chamada para Xamarin.Forms.Forms.Init.

Habilitando serviços de mapa

Como o Map pode obter a localização do usuário, o aplicativo deve obter permissão para o usuário da maneira descrita anteriormente neste capítulo:

Habilitando mapas do iOS

Um aplicativo iOS que usa Map precisa de duas linhas no arquivo info.plist.

Habilitando mapas do Android

Uma chave de autorização é necessária para usar os serviços do Google Map. Essa chave é inserida no arquivo AndroidManifest.xml . Além disso, o arquivo AndroidManifest.xml requer marcas envolvidas manifest na obtenção da localização do usuário.

Habilitando mapas UWP

Um aplicativo Plataforma Universal do Windows requer uma chave de autorização para usar Bing Mapas. Essa chave é passada como um argumento para o Xamarin.FormsMaps.Init método . O aplicativo também deve ser habilitado para serviços de localização.

O mapa não adornado

O exemplo mapDemos consiste em um arquivo MapsDemoHomePage.xaml e um arquivo code-behind MapsDemoHomePage.xaml.cs que permite navegar para vários programas de demonstração.

O arquivo BasicMapPage.xaml mostra como exibir a Map exibição. Por padrão, ele exibe a cidade de Roma, mas o mapa pode ser manipulado pelo usuário.

Para desabilitar a rolagem horizontal e vertical, defina a HasScrollEnabled propriedade como false. Para desabilitar o zoom, defina como HasZoomEnabledfalse. Essas propriedades podem não funcionar em todas as plataformas.

Ruas e terrenos

Você pode exibir diferentes tipos de mapas definindo a Map propriedade MapType do tipo MapType, uma enumeração com três membros:

O arquivo MapTypesPage.xaml mostra como usar um botão de opção para selecionar o tipo de mapa. Ele usa a RadioButtonManager classe na Xamarin.Formsbiblioteca Book.Toolkit e uma classe baseada no arquivo MapTypeRadioButton.xaml .

Coordenadas do mapa

Um programa pode obter a área atual que o Map está exibindo por meio da VisibleRegion propriedade . Essa propriedade não tem o apoio de uma propriedade associável e não há nenhum mecanismo de notificação para indicar quando ela foi alterada, portanto, um programa que deseja monitorar a propriedade provavelmente deve usar um temporizador para essa finalidade.

VisibleRegion é do tipo MapSpan, uma classe com quatro propriedades somente leitura:

Position e Distance são estruturas. Position define duas propriedades somente leitura definidas por meio do Position construtor:

Distance destina-se a fornecer uma distância independente de unidade convertendo entre unidades de métrica e inglês. Um Distance valor pode ser criado de várias maneiras:

O valor está disponível em três propriedades:

O arquivo MapCoordinatesPage.xaml contém vários Label elementos para exibir as MapSpan informações. O arquivo code-behind MapCoordinatesPage.xaml.cs usa um temporizador para manter as informações atualizadas à medida que o usuário manipula o mapa.

Extensões de posição

Uma nova biblioteca para este livro chamada Xamarin.FormsBook.Toolkit.Maps contém tipos específicos do mapa, mas independentes da plataforma. A PositionExtensions classe tem um ToString método para Positione um método para calcular a distância entre dois Position valores.

Definindo um local inicial

Você pode chamar o MoveToRegion método de Map para definir programaticamente um local e um nível de zoom no mapa. O argumento é do tipo MapSpan. Você pode criar um MapSpan objeto usando um dos seguintes:

Também é possível criar um novo MapSpan de um existente usando os métodos ClampLatitude ou WithZoom.

O arquivo WyomingPage.xaml e o arquivo code-behind WyomingPage.xaml.cs demonstram como usar o MoveToRegion método para exibir o estado de Wyoming.

Como alternativa, você pode usar o Map construtor com um MapSpan objeto para inicializar o local do mapa. O arquivo XamarinHQPage.xaml mostra como fazer isso inteiramente no XAML para exibir a sede da Xamarin em São Francisco.

Zoom dinâmico

Você pode usar um Slider para ampliar dinamicamente um mapa. O arquivo RadiusZoomPage.xaml e o arquivo code-behind RadiusZoomPage.xaml.cs mostram como alterar o raio de um mapa com base no Slider valor .

O arquivo LongitudeZoomPage.xaml e o arquivo code-behind LongitudeZoomPage.xaml.cs mostram uma abordagem alternativa que funciona melhor no Android, mas nenhuma abordagem funciona bem nas plataformas Windows.

A localização do Telefone

A IsShowingUser propriedade de Map funciona um pouco diferente em cada plataforma, como demonstra o arquivo ShowLocationPage.xaml :

  • No iOS, um ponto azul indica a localização do telefone, mas você deve navegar manualmente para lá
  • No Android, é exibido um ícone que, quando enviado por push, move o mapa para a localização do telefone
  • A UWP é semelhante ao iOS, mas às vezes navega automaticamente para o local

O projeto MapDemos tenta imitar a abordagem do Android definindo primeiro um botão baseado em ícone com base no arquivo MyLocationButton.xaml e no arquivo code-behind MyLocationButton.xaml.cs .

O arquivo GoToLocationPage.xaml e o arquivo code-behind GoToLocationPage.xaml.cs usam esse botão para navegar até a localização do telefone.

Alfinetes e museus de ciência

Por fim, a Map classe define uma Pins propriedade do tipo IList<Pin>. A Pin classe define quatro propriedades:

  • Label do tipo string, uma propriedade necessária
  • Address do tipo string, um endereço legível por humanos opcional
  • Position do tipo Position, indicando onde o pino é exibido no mapa
  • Type do tipo PinType, uma enumeração, que não é usada

O projeto MapDemos contém o arquivo ScienceMuseums.xml, que lista museus de ciência no Estados Unidos e LocationsSite classes para desserializar esses dados.

O arquivo ScienceMuseumsPage.xaml e o arquivo code-behind ScienceMuseumsPage.xaml.cs exibem pinos para esses museus de ciência no mapa. Quando o usuário toca em um pino, ele exibe o endereço e um site para o museu.

A distância entre dois pontos

A PositionExtensions classe contém um DistanceTo método com um cálculo simplificado da distância entre duas localizações geográficas.

Isso é usado no arquivo LocalMuseumsPage.xaml e no arquivo code-behind LocalMuseumsPage.xaml.cs para também exibir a distância até o museu da localização do usuário:

captura de tela tripla de localização da distância da página museus locais

O programa também demonstra como restringir dinamicamente o número de pinos com base no local do mapa.

Geocodificação e voltar novamente

O Xamarin.Forms. O assembly mapas também contém uma Geocoder classe com um GetPositionsForAddressAsync método que converte um endereço de texto em zero ou mais posições geográficas possíveis e outro método GetAddressesForPositionAsync que se converte na outra direção.

O arquivo GeocoderRoundTrip.xaml e o arquivo code-behind GeocoderRoundTrip.xaml.cs demonstram essa instalação.