Compartilhar via


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

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 Suporta um Map elemento que deriva de View. Devido aos requisitos especiais de 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 de é a equator meio caminho entre os dois polos através dos quais o eixo da Terra conceitualmente se estende.

Paralelos e latitude

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

Longitude e meridianos

Metades de grandes círculos do polo norte ao polo sul são linhas de longitude igual, também conhecidas como meridianos. Estes são relativos ao Meridiano de Greenwich, Inglaterra. Por convenção, as longitudes a leste do Meridiano Prime são valores positivos de 0 graus a 180 graus, e as longitudes a oeste do Meridiano Prime são valores negativos de 0 graus a –180 graus.

A projeção equiretangular

Qualquer mapa plano da Terra introduz distorções. Se todas as linhas de latitude e longitude forem retas, e se diferenças iguais nos ângulos de latitude e longitude corresponderem a distâncias iguais no mapa, o resultado será uma projeção equiretangular. Este mapa distorce as áreas mais próximas dos polos porque eles são esticados horizontalmente.

A projeção de Mercator

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

Serviços de mapa e blocos

Os serviços de mapas usam uma variação da projeção de 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 no 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 ILocationTracker iOS é uma LocationTracker classe que faz uso do iOS CLLocationManager.

O gerenciador de localização do Android

A implementação do ILocationTracker Android é uma LocationTracker classe que faz uso da classe Android LocationManager .

O localizador geográfico UWP

A implementação da Plataforma Universal do ILocationTracker Windows é uma LocationTracker classe que faz uso da 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 em texto quanto em um mapa equiretangular.

A sobrecarga necessária

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

É necessária alguma sobrecarga adicional específica da plataforma, na forma de permissões de localização.

Permissão de localização para iOS

Para iOS, o arquivo info.plist deve incluir itens que contenham o texto de uma pergunta solicitando que o usuário permita obter a 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 de ACCESS_FILE_LOCATION no arquivo AndroidManifest.xml.

Permissões de localização para a UWP

Um aplicativo da Plataforma Universal do Windows deve ter um location recurso de dispositivo marcado 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 NuGet do Google Maps deve ser adicionada à solução do aplicativo. O número da versão deve ser o mesmo que o Xamarin.Forms pacote atualmente instalado.

Inicializando o pacote de 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:

Ativando mapas do iOS

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

Ativando 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 manifest marcas envolvidas na obtenção da localização do usuário.

Habilitando mapas UWP

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

O mapa sem adornos

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

O arquivo BasicMapPage.xaml mostra como exibir o Map modo de 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 desativar o zoom, defina HasZoomEnabled como false. 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 faz uso da 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 está Map exibindo através da VisibleRegion propriedade. Essa propriedade não é apoiada por uma propriedade vinculá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 ambas as estruturas. Position Define duas propriedades somente leitura definidas por meio do Position construtor:

Distance destina-se a fornecer uma distância independente da unidade, convertendo entre unidades métricas e inglesas. 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 de mapa, mas independentes de plataforma. A PositionExtensions classe tem um ToString método para Position, e um método para calcular a distância entre dois Position valores.

Definindo um local inicial

Você pode chamar o MoveToRegion método de para definir programaticamente um local e nível de Map 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 a partir de um existente usando os métodos ClampLatitude ou WithZoom.

O arquivo WyomingPage.xaml e WyomingPage.xaml.cs arquivo code-behind demonstra como usar o MoveToRegion método para exibir o estado do 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 em XAML para exibir a sede do Xamarin em São Francisco.

Zoom dinâmico

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

O arquivo LongitudeZoomPage.xaml e LongitudeZoomPage.xaml.cs arquivo code-behind 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 de forma 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 até lá
  • No Android, é exibido um ícone que, quando pressionado, 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 MyLocationButton.xaml.cs arquivo code-behind.

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

Pins e museus de ciência

Finalmente, 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 opcional legível por humanos
  • 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 nos Estados Unidos, e LocationsSite classes para desserializar esses dados.

O arquivo ScienceMuseumsPage.xaml e ScienceMuseumsPage.xaml.cs arquivo code-behind exibem pinos para esses museus de ciência no mapa. Quando o usuário toca em um alfinete, ele exibe o endereço e um site do 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 LocalMuseumsPage.xaml.cs arquivo code-behind para também exibir a distância até o museu do local do usuário:

Captura de tela tripla da página Museus locais

O programa também demonstra como restringir dinamicamente o número de pinos com base na localização do mapa.

Geocodificação e vice-versa

O Xamarin.Forms. O assembly Maps 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 converte na outra direção.

O arquivo GeocoderRoundTrip.xaml e GeocoderRoundTrip.xaml.cs arquivo code-behind demonstram esse recurso.