GPS - это просто


5 июля 2007

GPS - Global Positioning System, благодаря которой можно запросто определить свое местоположение.
Все, что нам понадобиться - это сам GPS приемник. Напишем небольшую программу для получения своих координат.
Порядок действий:
1. Открываем порт (в большинстве случаев "COM5", в спецификации устройства указывается)
2. Читаем из него построчно. Пока не находим строку с нашими координатами.
3. Переводим координаты в десятичный вид.

Получаемые строки будут в формате NMEA (это формат передачи сообщений между корабельными приборами). Все сообщения относящиеся к GPS начинаються с $GP. В последнем поле сообщения может быть указана контрольная сумма, которая начинается с символа *.
Для целей определения своих координат мы будет использовать сообщение
$GPRMC (известное как Recommended Minimum), содержит информацию о времени, местоположении, состоянии, шируте, долготе. Контрольная сумма обязательна для этого сообщения.

Пример строки

$GPRMC,151445.000,A,5023.7675,N,03037.4083,E,0.00,,040707,,,A*7B ,где
1,2,3,4,5,6,7,8,9,10,11,12
1. Время в формате UTC
2. Состояние: А = действительный, V = предупреждение навигационного приёмника
3. Широта
4. Север/Юг (N/S)
5. долгота
6. Запад/Восток (E/W)
7. Скорость над поверхностью (SOG) в узлах
8. направление курса в градусах
9. Дата: dd/mm/yy
10. Магнитное склонение в градусах
11. Запад/Восток (E/W)
12. Контрольная сумма строки

Пример кода на C#

m_serialPort1 = new System.IO.Ports.SerialPort("COM5");
m_serialPort1.Open();
run = true;
m_th = new Thread(methodTh);
m_th.Start();


private void methodTh()
{
while (run)
{
string m_readed = m_serialPort1.ReadLine();
string[] parts = m_readed.Split(',');
if (parts[0] == "$GPRMC")
{
if (parts[3].Length>0) {
if (parts[5].Length>0) {
run = false;
double retx, rety;
convertgps(parts[3], parts[5], out retx, out rety);
}
}
}
}
if (m_serialPort1.IsOpen)
{
m_serialPort1.Close();
}
if (m_th != null)
{
m_th.Abort();
m_th = null;
}
}

И переводим в десятичный формат. При переводе следует помнишь что широта (Latitude - координата y) представлена в виде ddmm.mmmm, тогда как долгота (Longitude - координата х) - dddmm.mmmm

private void convertgps(string y, string x, out double retx, out double rety)
{
NumberFormatInfo nfi = new NumberFormatInfo();
nfi.NumberDecimalSeparator = ".";
rety = Double.Parse(y.Substring(0, 2),nfi) + (Double.Parse((y.Substring(2, 2) + "." + y.Substring(5, 4)),nfi) / 60);
retx = Double.Parse(x.Substring(0, 3),nfi) + (Double.Parse((x.Substring(3, 2) + "." + x.Substring(6, 4)),nfi) / 60);
}

Вот так просто мы определили свои координаты :)

google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru
          0 голосов

14 Комментариев на “GPS - это просто”

  1. GLad сказал:

    Собственно вопрос - как известно оператор мобсвязи может определить местоположения любого абонента, если абонент стоит - то вплоть до метров.

    Как с обычного телефона узнать своё месторасположение?

  2. old man сказал:

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

  3. pamella сказал:

    2 Glad:
    насколько мне известно - нельзя.

    2 old man:
    :) код на пальцах - только для того, чтобы легче было уловить суть :)

  4. Fritz сказал:

    т.е. про нахождение украденных телефонов боян? вроде как нет..
    Базовых станций 6 наверное по времени прохождения сигнала?(голое имхо)

  5. pamella сказал:

    не путайте грешное с праведным :)
    GPS представляет собой систему из искусственных спутников земли (для работы системы необходимо 24, реально же спутников гораздо больше). Спутники непрерывно передают данные на нескольких частотах.Приемник GPS, получает эти данные и вычисляет время прохождения сигнала от спутника. Таким образом он может определить свои координаты и т.д.
    нет, не боян. но имея только один телефон в руках Вы (тоесть самостоятельно) не сможете определить свое моестоположение.

  6. Fritz сказал:

    а ну понятно :) хотя некоторые модели Nokia показывают в дев режиме расстояние до базовой станции :) т.е. если есть связь и карта станций.... :)))))

  7. Rayan сказал:

    а точность попадания какая?

  8. Rayan сказал:

    а растояние до базы я думаю можно проверить и без ЖПС. Просто по силе сигнала. Телефон ведь не покажет координаты а просто радиусное растояние

  9. zeroreturn сказал:

    получается зная координаты всех баз города можно все таки с некоторой погрешностью превратить мобтел в навигационный прибор

  10. Rayan сказал:

    Это в том случае если есть информация на какой станции абонент висит

    та и геморно это

  11. hsm сказал:

    >>Открываем порт (в большинстве случаев "COM5", в спецификации устройства указывается)
    Зависит не от устройства а от компа/кпк. Со стороны устройства это первый порт.

    Протокол NMEA ниразу не секретный и спецификация доступна ровно как и готовые парсеры.

    2GLAD Выцепить координаты телефона достаточно просто. Для Киева, например, давно известны координаты базовых станций. Осталось написать софт для трубы который по расстояниям до станций посчитает координаты. Кста, скорее всего киевстар подобным образом вычисляет координаты телефона и может выслать фрагмент карты. Есть у них такая услуга.

    2Rayan Точность попадания для GPS 15м. Хотя в реальных ситуациях может быть и хуже и лучше. Это уже зависит от интеллекта приёмника.

    2Pamella Зачёт

  12. usix сказал:

    спасибо :idea:

  13. Руслан Пилин сказал:

    Отличная статья. Теперь я понимаю почему Ява так популярна.

    Если у нас J2ME MIDP 2.0, то в него входит Location API, который поддерживается некоторыми продвинутыми телефонами и большинством КПК. Я даже видел сайт, на котором тестировались телефоны на предмет поддержки разных фич. К сожалению, быстро не смогу его найти. Так в этом локейшин апи координата получается буквально банальным вызовом метода getLocation. Данный апи позволяет определить координаты девайса с помощью GPS или по базовым станциям. Для GPS в чистом поле, насколько мне известно, точность порядка 4 метров. Для города значительно меньше. Все зависит от количества спутников видимых из этой точки и количества помех. Обычно видно порядка 7-ми спутников из любой точки. Для работы системы достаточно видеть 4. По базовым станциям точность определения местоположения значительно ниже порядка 50-150 метров, что в условиях города делает эту фичу не очень полезной.

    Для большого брата наличием таких Апи не интересовался, скорее всего они тоже есть.

    PS: Acer n311 + Tom tom + GPS отличная навигационная связка для большого мегаполиса. Проверено опытом. Жаль батареи быстро садятся. :cool:

  14. tin сказал:

    Ого, очень интересный материал, да и комментарии. Спасибо за информацию. Отдельно Руслану Пилину.





Оставте свое мнение