Геолокация

Последнее обновление: 31.10.2015

Одной из отличительных черт смартфонов является возможность использования систем навигации типа GSM или GLONASS для определения координат. Рассмотрим, как мы в приложении на Windows Phone 8.1 можем осуществлять геолокацию.

Среди стандартных элементов управления в Visual Studio нам доступен такой элемент как Map, представляющий географическую карту. Чтобы его использовать, создадим по шаблону Blank App новый проект, который назовем MapApp. Изменим, стандартную разметку xaml страницы MainPage.xaml на следующую:

<Page
    x:Class="MapApp.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:MapApp"
    xmlns:Maps="using:Windows.UI.Xaml.Controls.Maps"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">

    <Grid>
        <Maps:MapControl x:Name="map"></Maps:MapControl>
    </Grid>
</Page>

В отличие от стандартной разметки здесь добавлены две строчки. Во-первых, импортировано пространство имен xmlns:Maps="using:Windows.UI.Xaml.Controls.Maps". Во-вторых, добавлен собственно элемент map: <Maps:MapControl x:Name="map"></Maps:MapControl>

Если мы запустим приложение, то увидим фактически готовую карту:

Maps in Windows Phone 8.1

Но просто созерцать карту не очень интересно, поэтому попробуем с ней что-нибудь сделать. Для начала мы можем установить свое местоположение. Для этого первым делом перейдем к файлу Package.appxmanifest. В нем перейдем на вкладку Capabilities. На ней установим отметку в поле Location:

Определение местоположения Windows Phone 8.1

Далее перейдем к файлу кода MainPage.xaml.cs и изменим в нем метод OnNavigatedTo(), который срабатывает при переходе к данной странице:

protected override async void OnNavigatedTo(NavigationEventArgs e)
{
    map.MapServiceToken = "mapToken";
	// получаем инструмент геолокации
    var geolocator = new Geolocator();
	//точность геолокации до 150 метров
    geolocator.DesiredAccuracyInMeters = 150;
    // получаем позицию
    var position = await geolocator.GetGeopositionAsync();
	// установка этой позиции на карте
    await map.TrySetViewAsync(position.Coordinate.Point, 19);
}

Свойство MapServiceToken устанавливает токен аутентификации, который при релизе приложения задается через Центр Разработчика Windows Phone, но для целей тестирования здесь мы можем указать любое значение.

Вначале надо получить объект геолокатора, который позволяет установить координаты телефона. В качестве точности геолокации я использовал 150 метров, хотя можно использовать и другие значения. После получения координат, надо определить эти координаты на карте. Для этого в метод map.TrySetViewAsync() передаются координаты и значение приближения.

И затем карта отобразит наше текущее местонахождение, причем точность определения довольно высока:

Теперь изменим приложение. Во-первых, изменим файл MainPage.xaml следующим образом:

<Page
    x:Class="MapApp.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:MapApp"
    xmlns:Maps="using:Windows.UI.Xaml.Controls.Maps"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition Height="50" />
            <RowDefinition Height="60" />
            <RowDefinition Height="60" />
        </Grid.RowDefinitions>
        <Maps:MapControl x:Name="map" Grid.Row="0" MapTapped="map_MapTapped"
                         ZoomLevelChanged="map_ZoomLevelChanged" MapServiceToken="mytoken" />
        <Slider x:Name="slider1" Minimum="0" Maximum="20" Value="5" Grid.Row="1" ValueChanged="slider1_ValueChanged" />
        <StackPanel Grid.Row="2" Orientation="Horizontal">
            <TextBlock Text="Широта" Height="40" FontSize="30" Margin="15" />
            <TextBlock x:Name="latitudeBox" Width="Auto" FontSize="30" Margin="15" />
        </StackPanel>
        <StackPanel Grid.Row="3" Orientation="Horizontal">
            <TextBlock Text="Долгота" Height="40" FontSize="30" Margin="15" />
            <TextBlock x:Name="longtitudeBox" Width="Auto" FontSize="30" Margin="15" />
        </StackPanel>
    </Grid>
</Page>

Кроме элемента карты здесь определен слайдер для динамической настройки масштаба карты, также здесь определены два текстовых поля для отображения текущих географических координат.

Также добавим в файл MainPage.xaml.cs обработчики событий:

// обработка ручного изменения масштаба на карте
private void map_ZoomLevelChanged(Windows.UI.Xaml.Controls.Maps.MapControl sender, object args)
{
    if(map!=null && slider1!=null)
        slider1.Value = map.ZoomLevel;
}
// изменение значения слайдера
private void slider1_ValueChanged(object sender, RangeBaseValueChangedEventArgs e)
{
    if (map != null && slider1 != null)
        map.ZoomLevel=slider1.Value;
}
// обработка нажатия на точку на карте
private void map_MapTapped(MapControl sender, MapInputEventArgs args)
{
    latitudeBox.Text = args.Location.Position.Latitude.ToString();
    longtitudeBox.Text = args.Location.Position.Longitude.ToString();
}

Также в начале файле в секции using подключим пространство имен Windows.UI.Xaml.Controls.Maps

И теперь мы можем динамически контролировать текущие координаты на карте и изменение масштаба через слайдер:

Свойства элемента Map

Рассмотрим некоторые свойства элемента Map:

  • Center: центральная точка на карте. Мы можем как получить ее значения, так и установить:

    map.Center = new Geopoint(new BasicGeoposition()
    {
        Latitude = 47.604,
        Longitude = -122.329
    });
    
  • ZoomLevel: масштаб, например, map.ZoomLevel = 18

  • Style: стиль карты, использует константы из перечисления MapStyle, например, map.Style = MapStyle.Terrain

  • ColorScheme: цветовая схема карты, использует константы перечисления MapColorScheme: map.ColorScheme = MapColorScheme.Dark

  • TrafficFlowVisible: указывает, надо ли отображать интенсивность дорожного трафика, например, map.TrafficFlowVisible = true - в этом случае дороги на карте будут отображены в том или ином цвете, сигнализирующем об интенсивности движения на дорогах

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850