Опубликован: 01.11.2011 | Уровень: специалист | Доступ: платный
Практическая работа 19:

Определение географических координат (XNA)

Аннотация: Целью данной работы является разработка приложения, использующего технологию A-GPS.

Дополнительные материалы к занятию можно скачать здесь.

В Windows Phone 7 имеется возможность определять географические координаты по методу Assisted-GPS. Система Assisted-GPS определяет координаты по ретрансляторам сотовой связи. Основным классом для определения координат является GeoCoordinateWatcher. После создания объекта GeoCoordinateWatcher нужно задать обработчик события PositionChanged и вызвать метод Start.

Приложение Windows Phone 7 может определять свои координаты с помощью метода Assisted-GPS, использующего сотовую связь для уменьшения времени "холодного старта". Метод определения координат A-GPS быстрее классического GPS, хотя и менее точен.

Точность зависит от плотности установки базовых станций. Больше всего станций располагается в центре города. Точность в этом случае колеблется от 200 до 500 метров. На окраине города точность составляет 1500 - 2000 метров. Вне зоны приема сети A-GPS не работает.

Для определения координат в Windows Phone 7 используется класс GeoCoordinateWatcher. Перед его использованием нужно добавить к проекту ссылку на библиотеку System.Device. В файле кода нужно добавить директиву using System.Device.Location;. Для определения координат потребителя нужно создать объект GeoCoordinateWatcher, задать обработчик события PositionChanged и вызвать метод Start [25]. Событие PositionChanged возвращает объект GeoCoordinate, имеющий свойства: Latitude, Longitute, Altitude, HorizontalAccuracy, Course, Speed, IsUnknown.

В предлагаемой работе мы воспользуемся примером, описанном в книге Чарльза Петзольда [25].

Итак, создаем новое приложение practice_19 XNA Windows Phone 7.

Добавляем ссылку на библиотеку System.Device.


Добавляем шрифт Lindsey:

Шрифт Lindsey:

. <?xml version="1.0" encoding="utf-8"?>
<XnaContent xmlns:Graphics="Microsoft.Xna.Framework.Content.Pipeline.Graphics">
  <Asset Type="Graphics:FontDescription">
    <FontName>Lindsey</FontName>
    <Size>32</Size>
    <Spacing>0</Spacing>
    <UseKerning>true</UseKerning>
    <Style>Regular</Style>
    <CharacterRegions>
      <CharacterRegion>
        <Start>&#32;</Start>
        <End>&#126;</End>
      </CharacterRegion>
    </CharacterRegions>
  </Asset>
</XnaContent>
    

Вводим следующий код в файле Game1.cs

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Input.Touch;
using Microsoft.Xna.Framework.Media;
using System.Device.Location;

namespace Practice_19
{
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;

        SpriteFont Lindsey;
        string text = "Determining Location...";
        Viewport viewport;
        Vector2 textPosition;

        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";

            TargetElapsedTime = TimeSpan.FromTicks(333333);
        }

        protected override void Initialize()
        {
            GeoCoordinateWatcher geoWatcher = new GeoCoordinateWatcher();
            geoWatcher.PositionChanged += OnGeoWatcherPositionChanged;
            geoWatcher.Start();
            base.Initialize();
        }

        void OnGeoWatcherPositionChanged(object sender,
 GeoPositionChangedEventArgs<GeoCoordinate> args)
        {
            text = String.Format("Latitude: {0}\r\n" +
            "Longitude: {1}\r\n" +
            "Altitude: {2}\r\n\r\n" +
            "{3}",
            args.Position.Location.Latitude,
            args.Position.Location.Longitude,
            args.Position.Location.Altitude,
            args.Position.Timestamp);
        }

        protected override void LoadContent()
        {
            spriteBatch = new SpriteBatch(GraphicsDevice);
            Lindsey = this.Content.Load<SpriteFont>("Lindsey");
            viewport = this.GraphicsDevice.Viewport;
            System.Diagnostics.Debug.WriteLine(viewport);
        }

        protected override void UnloadContent()
        {

        }

        protected override void Update(GameTime gameTime)
        {
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                this.Exit();
            Vector2 textSize = Lindsey.MeasureString(text);
            textPosition = new Vector2((viewport.Width - textSize.X) / 2,
            (viewport.Height - textSize.Y) / 2);
            base.Update(gameTime);
        }

        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.White);
            spriteBatch.Begin();
            spriteBatch.DrawString(Lindsey, text, textPosition, Color.Red);
            spriteBatch.End();
            base.Draw(gameTime);
        }
    }

}
    
Листинг .

Так как мы находимся в режиме эмулятора, то не можем определить координаты.

Игорь Белов
Игорь Белов
Россия, г. Ейск
Александр Гринёв
Александр Гринёв
Украина, Днепропетрвск, Шаг