mastersoftna
@mastersoftna

Ошибка определения местоположения по базовым станциям?

Для определения местоположения в приложениях для мобильных устройств, как известно можно использовать встроенный GPS – приемник или определять местоположение по базовым станциям. В моем приложении мне было необходимо использовать оба варианта, так как второй вариант должен был автоматически заменять первый при отсутствии GPS – данных (например, в помещении).


Мобильное устройство с системой Windows Mobile 6.1 Pro. Язык: C#. Проблем с определением местоположения по GPS не возникло. Для определения местоположения по базовым станциям я решил использовать библиотеку cellid.dll. Как оказалось она очень удобная для применения.


Все было написано и отлично работало, мобильный клиент получал координаты, адрес (вплоть до улицы, где находится базовая станция) и все отправлял в удаленную базу на сервере. К базе был привязан сайт, который выводил информацию о местоположении на Google Maps. Однажды просматривая базу я увидел, что в течении одной минуты мои координаты изменились довольно сильно, а затем вернулись на место. Просматриваю на карте и вижу, что я находился в Новороссийске (так оно и есть), затем в течении минуты я оказался в Можайском районе Московской области и вернулся назад в Новороссийск. Местоположение определялось по базовым станциям с использованием библиотеки сellid.dll.


Вопрос: возможно ли что это просто ошибка в библиотек, или сотовая станция выдала неверные данные, или телефон периодически посещает роуминг сам по себе? Будьте внимательны те, кто разрабатывает подобные приложения, используя данные технологии. У меня простое приложение, от которого ничего серьезного не зависит, а если точность координат влияет на что либо?


Это повторялось несколько раз с большими интервалами времени.


Вот изображения карты и базы данных:

c166a8.jpg

2.JPG


Функция для получения местоположения:

private void GetGPSTowerGEO()<br/>
 {<br/>
 try<br/>
 {<br/>
 CellTower ct = RIL.GetCellTowerInfo();<br/>
 GeoService gs = new GeoService();<br/>
 GeoLocation gl = gs.GSM2Geo(ct);<br/>
 LatLonLocation ll = new LatLonLocation();<br/>
 ll.Latitude = gl.Latitude;<br/>
 ll.Longitude = gl.Longitude;<br/>
<br/>
if (gl != null)<br/>
 {<br/>
 //получаю данные с базовой станции<br/>
 Latitude = gl.Latitude;<br/>
 Longitude = gl.Longitude;<br/>
 country = gs.Geo2Address(ll).address[0].Country;<br/>
 town = gs.Geo2Address(ll).address[0].Full;<br/>
 }<br/>
 else<br/>
 {<br/>
 //не могу получить данные с базовой станции<br/>
 WriteLog(&quot;Address: GetGPSTowerGEO. Message: &quot; + &quot; No data from the base station.&quot;);<br/>
 }<br/>
 }<br/>
 catch (Exception e)<br/>
 {<br/>
 WriteLog(&quot;Address: GetGPSTowerGEO. Message: &quot; + e.Message);<br/>
 }<br/>
 }


Эта тема на сайте nansoft.ru
  • Вопрос задан
  • 3969 просмотров
Решения вопроса 1
Kindman
@Kindman
Я думаю, что можно коррекцию вводить после обнаружения «скачка» на более чем 100 км с учетом «градиента» средней скорости изменения предыдущего местоположения, и считать такой замер — недостоверным (и отбрасывать), а вместо этого функция должна вернуть предыдущий (более правдоподобный) замер (с установленной пометкой «устаревшие данные»).
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
YasonBy
@YasonBy
Вот несколько возможных причин:
1. Оператор может менять структуру сети. Таким образом, ID станций могут со временем меняться, а гео-базы обновляются с задержкой.
2. Не исключено, что библиотеки учитывают не все ID-параметры (MCC, MNC, LAC, CellID, BSID). Соответственно, возможна неоднозначность.

а если точность координат влияет на что либо?
Значит, придётся учитывать возвращаемую оценку точности, если система позиционирования такое поддерживает.

GeoLocation gl = gs.GSM2Geo(ct);

if (gl != null)
Это условие всегда выполняется. Если gl было null, то в строке
ll.Latitude = gl.Latitude;
вылетел NullPointerException, и до if'а дело не дошло.
Ответ написан
Комментировать
@mylnikov
Можно использовать api получения местоположения GSM сот Публичная база телефонных станций мира OpenCellID ...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы