GPS или триангуляция при установке положения пользователя на карте?

Я программировал приложение, используя мапкит и SDK 3.0. Все работает хорошо, кроме одной детали. Я заметил, что при отображении местоположения пользователя я получаю разные позиции пользователя на карте в зависимости от текущей сети. Я прочитал об этой проблеме и понимаю, что она распространена? В моей WLAN правильно отображается позиция пользователя. При использовании сети 3G (T-Mobile) положение находится примерно в 100 метрах от моего фактического местоположения. Я понимаю, что это связано с сетью сотового телефона, использующей триангуляцию, а в WLAN используется точка доступа GPS или WiFi. Итак, на мой вопрос. Есть ли способ обойти это? Мое приложение показывает позиции в городе, а также расстояние до этих позиций. Это очень очевидно, а также вводит в заблуждение, если позиция ложная из-за коротких расстояний. Есть ли способ (в коде) установить, какой метод использовать для получения позиции пользователя? Я протестировал все другие приложения на своем iPhone с использованием карт, и проблема у них у всех одна и та же. (Если кто-то хочет протестировать мое приложение, оно есть в магазине приложений бесплатно под car2go, и другие комментарии, конечно, интересны) Заранее спасибо! -петля-


person Community    schedule 25.08.2009    source источник


Ответы (3)


Core Location предоставляет информацию о вертикальной и горизонтальной точности местоположения, о котором сообщается. Следует использовать эту точность, чтобы сообщить пользователю, если местоположение подозрительно. Карты Google делают это, увеличивая размер синего круга вокруг маркера местоположения. Существуют и другие способы указать пользователю, что местоположение является подозрительным, предупреждающие окна, не показывать местоположение, если оно выходит за пределы некоторой заданной точности и т. д.

См.: http://developer.apple.com/iphone/library/documentation/CoreLocation/Reference/CLLocation_Class/CLLocation/CLLocation.html#//apple_ref/occ/instp/CLLocation/horizontalAccuracy

person Jack Cox    schedule 25.08.2009

Использовать альтернативный источник для вашего местоположения? Портативные устройства GPS помогут.

Реальный вопрос заключается в том, как вы можете исправить данные, указанные триангуляцией 3G. Интересно, можете ли вы сделать дифференциал, чтобы исправить ошибки местоположения 3G.

1) В заданном городе откалибруйте ошибки местоположения 3G, нанеся график города. Это может быть исправлено сетями 3G в любое время, поэтому у вас должен быть способ проверки и повторной калибровки.

2) Откалибруйте местоположение сети 3G, используя известное местоположение — местоположение 3G вместе с местоположением GPS. Воспринимайте это как разницу, которую можно применить к другим местоположениям 3G. Это предполагает постоянное смещение в расчете триангуляции, что, вероятно, не соответствует действительности.

3) Подождите, пока 3G-сети исправят это, и ничего не делайте в это время.

4) Предоставьте провайдеру сети 3G информацию об ошибках в их триангуляции и посмотрите, является ли это приоритетом для них.

Других приемлемых вариантов не могу придумать...

person Kieveli    schedule 25.08.2009
comment
Спасибо за быстрый ответ! Что ж, идея с информированием провайдера здесь кажется удачным выбором. Я думал о том, чтобы рассчитать какое-то смещение для исправления данных, но я думаю, что это не очень надежное решение. И я не знаю, есть ли способ узнать, какую сеть использует мой iPhone? Это? Например, если (я нахожусь в сети T-Mobile) добавить некоторую константу к координатам, иначе прочитайте координаты, как они есть... -loop- - person ; 25.08.2009

Возможно, вы можете использовать CoreLocation напрямую. CLLocationManager дает вам CLLocation объектов, кроме их точности. Если вы получаете точность ниже 50 метров, это местоположение, вероятно, пришло из GPS.

person Will Harris    schedule 25.08.2009
comment
Хорошо, как я могу вставить позицию пользователя на карту без использования менеджера местоположений? Это кажется интересным решением, которое вы там представляете! - person ; 25.08.2009
comment
Я использовал этот код для установки расстояния: clm.desiredAccuracy = kCLLocationAccuracyNearestTenMeters; где clm — экземпляр диспетчера местоположений - person ; 25.08.2009
comment
Вы не обязательно получите местоположения желаемой точности. Я предлагаю вам проверить полученное значение horizontalAccuracy и предупредить пользователя, если оно слишком велико. - person Will Harris; 25.08.2009
comment
Моя проблема в том, что он почти всегда слишком велик. Это приложение для использования на ходу, где пользователь находится в мобильной сети. Ваша идея хороша, и я, возможно, попробую это, но было бы интересно получить правильное значение... - person ; 25.08.2009