Получение координат в J2ME с помощью JSR-179 Location API

Определение координат location apiМногие современные смартфоны имеют встроенный GPS или ГЛОНАСС модуль. Эти устройства позволяют получать данные о местонахождении вашего девайса. Для того чтобы иметь возможность работать с GPS модулем из Java 2ME, необходимо, чтобы ваш телефон поддерживал конфигурацию CLDC 1.1. Пакет javax.microedition.location содержит в себе классы, реализующие JSR-179 Location API.

Что такое географические координаты

Наша планета имеет довольно сложную форму. Если Вы думаете, что Земля – это шар, Вы отстали от науки лет на 70.  Для обозначения  формы Земли ученые придумали специальную фигуру, называемую геоидом. Она имеет довольно сложную математическую формулу, которая, впрочем, не является предметом рассмотрения данной статьи. Так или иначе, для задания положения точки на поверхности удобно использовать, так называемые, сферические координаты, подразумевающие, что положение точки можно определить по двум углам и одному расстоянию. Первый угол, называемый широтой, определяет отклонения луча, проведенного из центра Земли O в искомую точку P от экваториальной плоскости. Второй угол, называемый долготой, определяет отклонение плоскости, образованной осью вращения Земли и лучом OP от плоскости нулевого меридиана. Третий параметр задает расстояние от центра Земли до точки P. На практике вместо длины OP чаще используется высота над уровнем моря относительно Гринвича.

широта и долготаВ математике принято углы, отсчитываемые против часовой стрелки, считать положительными, а по часовой стрелке – отрицательными. В географии, в силу исторических причин, знак минус при обозначении углов не используется. Для определения направления угла, вводится понятие Северной (положительной) и Южной (отрицательной) широты, и восточной (положительной) и западной (отрицательной) долготы. Таким образом, стороны света определяют направление поворота угла, то есть заменяют собой понятные математикам знаки плюс и минус.

В картографии используются довольно извращенные с точки зрения программиста способы задания угла:ГГ°ММ'СС.СС", где ГГ-градусы, ММ-минуты, СС.СС-секунды с секундными долями. Извращение состоит в том, что для обозначения угловых координат используется шестидесятеричная система исчисления, то есть один градус равен шестидесяти минутам, а одна минута – шестидесяти секундам, одна секунда– шестидесяти секундным долям.  Для современного человека намного понятнее альтернативная система, когда угол записывается просто как десятичная дробь, при этом для обозначения направления используются знаки плюс и минус. Этот способ получил широкое  распространение в современной мобильной навигации.

Теперь, когда мы разобрались что такое координаты точки и как они задаются, поговорим о технических способах получения координат.

Как определяются координаты

На орбите нашей планеты находится большое количество различных спутников. Среди них есть и те, которые представляют  навигационные системы, такие как GPS и ГЛОНАСС. Принцип их работы довольно прост. Дело в том, что благодаря эффекту Доплера, происходит некоторая задержка при передаче сигнала на большие расстояния, и чем больше расстояние, тем больше и задержка. Пользуясь этим свойством можно определить точное расстояние до от устройства до спутника. Но для привязки этого расстояния к географическим координатам необходимо как минимум три таких спутника. Также, для более точного определения каждый из объектов системы имеет связь с остальными и свои собственные атомные часы.

Для использования систем глобальной навигации GPS и ГЛОНАСС необходимо, чтобы в телефоне был установлен специальный приемник.  Существуют и отдельные GPS модули, которые можно  подключать к телефону по Bluetooth, но мы оставим эти устройства за рамками данной статьи. Перечислим достоинства и недостатки данного способа определения координат:
Плюсы: с большой точностью позволяет определять положение на равнине; трафик не расходуется, то есть координаты можно определять бесплатно.
Минусы: продолжительное время подключения; могут возникать проблемы при работе в горах, лесах и городах с небоскребами.

Многие вышки мобильных операторов, а также Wi-Fi роутеры в общественных местах знают свое точное местоположение, и могут поделиться этой информацией со своими пользователями.
Плюсы: быстрое подключение.
Минусы: возможно получение неточных координат, может потребоваться доступ к Интернету, или наличие в телефоне специальных систем распознавания

В настоящее время довольно распространен комбинированный способ определения координат, получивший название A-GPS.
Плюсы: быстрое подключение, большая точность определения местоположения (даже в здании).
Минусы: система подключается к сети Интернет, а за его использование может взыматься плата.

A-GPS - схема работы

Описание пакета, реализующего JSR-179 Location API

Все, что связано с определением географических координат, в j2me собрано в пакет javax.microedition.location. Ниже я представляю таблицу, содержащую информацию о классах этого пакета.

  • AddressInfo- Данный класс содержит текстовую информацию об адресе запрошенном положении.
  • Coordinates- Класс предоставляет нам информацию о местоположении (долгота, широта, высота над морем).
  • Criteria- Данный класс содержит критерии, по которым определяется положение.
  • Landmark- Данный класс предоставляет информацию о ориентирах для определённой локации с адресом.
  • LandmarkStore- Предоставляет нам возможность изменения системных ориентиров( методы для их создания, редактирования, удаления).
  • Location- Класс предоставляет базовую информацию о текущем местоположении.
  • LocationProvider- Данный класс является ключевым пунктом, при определении местоположении.
  • Orientation- Данный класс предоставляет информацию об ориентации по азимуту на север, угле возвышения и положении устройства относительно продольной оси (Для работы требуется встроенный компас, не работает в телефонах Nokia).
  • QualifiedCoordinates- Класс представляющий координаты точки (долгота, широта, высота над морем), вычисляемые с требуемой точностью.


Расшифруем некоторые упомянутые выше термины
Локация/положение – определённая точка на карте имеющая свои координаты (долгота, широта, высота над уровнем моря);
Критерии– сводка правил, по которым определяется текущее положение (точность, предпочтительное время отклика и т. д.)
Ориентиры– своеобразная база данных, в которой содержатся все созданные пользователем точки на карте. Ориентир состоит из текстового описания, координат точки и информации AddressInfo.
Текущее местоположение – положение, в котором находился телефон на момент определения его координат.
Провайдер– класс предоставляющий пользователю необходимую информацию (в данном случае о текущем местоположении). Именно он является источником информации о местоположении телефона, позволяющим получить текущий объект Location.

Практическое использование Location API

Главным целью приведенного ниже примера является иллюстрация процедуры получения координат местоположения. Реализация подключения содержит довольно много нюансов, поэтому я постараюсь как можно яснее объяснить весь процесс. Во время работы Вашего будущего приложения, скорее всего, будет необходимо периодически обращаться за получением новых координат, поэтому я советую оформить код в отдельную процедуру. Советую заранее импортировать весь пакет и забыть по эти мелочи
import javax.microedition.location.*;

Процесс получения координат довольно прост. Для его реализации необходимо:

  1. Создать объект класса Criteria, с помощью которого можно задать требуемую нам точность.
  2. Используя этот объект создать Провайдер. То есть, через поля объекта Criteria мы говорим с какими допусками провайдер должен предоставить нам информацию.
  3. Получить от провайдера объект Location, содержащий информацию о текущей точке.
  4. Вытащить из объекта Location текущие координаты, текстовое описание точки и прочую информацию

Ниже приведен пример, реализующий описанный алгоритм

Но для начала объявим переменные, в которые будут записываться данные.

double lat, lng, alt;//широта долгота высота

Создадим процедуру

public void GPS() throws Exception{}

Процедура подразумевает обработку исключений пользователем, поэтому не забывайте про блок Try-catch, хотя NetBeans не даст про него забыть.

Приступим к написанию кода процедуры. Создадим объект с критериями, по которым будет определяться местоположение.

Criteria c=new Criteria();

 Теперь нужно создать провайдер местоположения, по нашим критериям.

LocationProvider lp= LocationProvider.getInstance(c);

Время подключения к спутникам может быть очень долгим, особенно если GPS или ГЛОНАСС давно не использовались. В этом случае подключение может составлять более 10 минут. Если же вы пользуетесь  A-GPS, то задержка будет меньшей, но тем не менее она все равно будет присутствовать. Чтобы избежать подвисания приложения время подключения желательно минимизировать. При первом запросе оно может составлять от 10 секунд до 20 минут, а при последующих - не более 5 секунд. Оно указывается при получении местоположении в секундах: lp.getLocation(int delay);

Location l= lp.getLocation(5);//Время в секундах
Coordinates co= l.getQualifiedCoordinates();//Получаем координаты из текущего местоположения

Советую создать это подключение в отдельном потоке, который будет потихоньку работать, независимо от главного потока.

Возможно и такое, что местоположение не было определено в указанный промежуток времени, тогда переменной “l” будет присвоено значение null.
Случай таймаута лучше обрабатывать отдельной переменной.

Ну а в случае получения значений без ошибок, просто присваиваем значения нашим переменным.

if(l!=null){
lat=c.getLatitude();
lng=c.getLongitude();
alt= c.getAltitude();
}else{
//Обработка если что-то не пошло, про неё не следует забывать!
//Оно же таймаут соединения.
}

Файл с примером, реализующим получение всевозможных данных о положении тут.


P. S. В java организована очень грамотная и простая система подсчёта расстояний в метрах, что очень удобно, т. к. нельзя просто провести прямую из точки А в точку Б. Для этого потребуются сложные расчёты, в которых необходимо находить длину дуги в пространстве, просто, хочу сказать, что в VS Basic у меня на это ушло  43 операции.

Co_1.distance(Co_2);

Co_1 и Co_2 являются объектами класса Coordinates.
Например, если дополнить нашу программу следующей функцией, то она возвратит нам расстояние в метрах от Красной Площади города Москва, до нашего местоположения.

public double ToMoskow(double lat,double lng,float alt){
//Для работы необходимо указать широту, долготу и высоту
Coordinates msk=new Coordinates(55.750921,37.618165, alt);//Координаты Москвы
Coordinates my=new Coordinates(lat, lng, alt);//Ваши координаты
return msk.distance(my);//Просчёт дистанции
}

Автор:Тарасов Андрей ( Этот e-mail адрес защищен от спам-ботов, для его просмотра у Вас должен быть включен Javascript )





Наши соцсети

Подписаться Facebook Подписаться Вконтакте Подписаться Twitter Подписаться Google Подписаться Telegram

Популярное

Ссылки

Новости [1] [2] [3]... Android/ iOS/ J2ME[1] [2] [3]) Android / Архив

Рейтинг@Mail.ru Яндекс.Метрика
MobiLab.ru © 2005-2018
При использовании материалов сайта ссылка на www.mobilab.ru обязательна