Определение географических координат (XNA)
Дополнительные материалы к занятию можно скачать здесь.
В 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.
. <?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> </Start> <End>~</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); } } }Листинг .
Так как мы находимся в режиме эмулятора, то не можем определить координаты.