
Первое, что нам потребовалось — точный инструмент для сбора точек и создания маршрутов. Простое указание их на карте не подходило, т.к. погрешность геометок достигает 200 метров — человек мог прийти по координатам в поисках небольшой вещи, а оказывалось, что до места еще сотни шагов. Чтобы не заставлять пользователей бродить, было решено разработать систему снятия координат телефонами прямо на месте.
Имея опыт разработки такой системы под Android и помучившись с ее сервисами геолокации, мы предположили, что сделать это на iOS будет проще (айфоны вроде бы очень похожи) и точнее (в идеале мы должны не бояться бросить айфон в лесу, чтобы потом найти его по компасу).
Для проверки этих предположений мы написали прототип, который приводил пользователя стрелкой к месту снятия координат, а заодно сделали интересные выводы о точности встроенного компаса и GPS.
Точность определения координат
Наши проверки показали, что максимальная точность GPS на разных айфонах разная, все-таки производители чипов не стоят на месте.
Вот какую максимальная точность мы получили в хороших условиях приема:
- iPhone 3Gs — 17м,
- iPhone 4 — 10м,
- iPhone 4s и 5 — 5м (неужели ГЛОНАСС влияет?!).
Эту точность мы спрашивали у самого телефона через location.horizontalAccuracy, а локацию получали от LocationManager-а при максимальной точности и частоте обновления. Все это довольно хорошо соответствовало действительности.
Во многих инструкциях пишут, что хорошие условия предполагают также отсутствие деревьев. Но наши тесты летом в хвойно-лиственном лесу не показали каких-либо заметных отклонений.
Интересно было понять, как айфоны отдают координаты там, где GPS не принимается. Здесь никаких сюрпризов не произошло.
Существует достаточно много хороших статей, которые описывают как работает GPS и геолокация в смартфонах в условиях отсутствующего GPS.
Пример от Яндекса.
Получается, что когда телефон не ловит GPS, то в location.horizontalAcuracy выдается ±1414 метров, используя информацию с базовой станции оператора. Такая точность продуцируется GSM-сетями.
Если рядом есть Wi-Fi точки, в соответствие которым установлены географические координаты, то, как правило, точность увеличивается до сотен метров, если Wi-Fi точка одна, или десятков метров, если их несколько.
Разницы между iPhone 4S и 5 мы не заметили, зато заметили, что они обновляют location значительно чаще. Поэтому, подходя к снятой точке, можно видеть как уменьшается цифра, показывающая расстояние до цели (30, 29, 28...). Это создает приятное ощущение прихода к успеху.
Направление

Для вывода стрелки, указывающей на место, используется информация об ориентации телефона относительно Северного полюса. Эту информацию отдает компас устройства, который появился в айфонах, начиная с 3GS.
На этом мы и построили компас-навигатор, стрелка которого указывает на место.
Что можно улучшить
Интересно, что точность компаса является бутылочным горлышком всей системы указания направления.
Мы можем сколь угодно точно знать, каким курсом движемся в данный момент, но чтобы показать эту информацию пользователю в виде стрелки, необходимо как можно точнее понять ориентацию на север самого аппарата. Хоть у компаса и нет зон, где он не работает, зато он охотно реагирует на разные помехи и аномалии, а также углы наклона аппарата, и это особенно заметно в движении. Мы решили побороться и с этой проблемой.
Для уточнения использовался путевой угол, или location.course, если говорить в терминах iOS API. Это позволило в значительной степени увеличить точность компаса в движении.
Но появились проблемы. Поправка работает исходя из предположения, что люди ходят с телефоном, держа его верхней стороной вперед (по результатам различных экспериментов мы поняли, что для пеших айфоноводов это действительно так). А вот если человек едет на машине или в общественном транспорте, то ситуация, когда телефон расположен боком относительно направления движения, происходит значительно чаще. Следовательно поправку нужно отключать:
- при большой скорости (т.к. телефон быстро пролетает над разными помехами и аномалиями и реагировать на них значит создавать помехи над помехами);
- если поправка более 75гр. (т.к. тут уже придется развести руками, вряд ли можно предложить что-то более точное).
Есть, конечно, и более изощренные методы уточнения показаний стрелки — можно реализовать настоящий dead run (ссылка, которую пока не нашел). Но мы надеемся, что эту задачу лучше решат производители железа. Да и наше тестирование показало что компас-указатель с небольшими программными поправками выполняет свою функцию — приводит человека к месту.
Эксперимент
Для проверки точности работы прототипа решили провести небольшой эксперимент (ох, сколько мы провели экспериментов).
Вера в надежность разработанного прототипа вызывала споры в команде. Поэтому коллега, который больше всех в него верил (он его и разрабатывал), осмелился закопать свой айфон в лесу в качестве доказательства его надежности (ничего необычного, так все делают). Он ушел с двумя аппаратами, снял место и, вернувшись, отдал один айфон мне.
Я шел по лесу, следуя стрелке на экране. Когда экран показал оставшееся расстояние 0 метров, я посмотрел вниз и увидел сфотографированное место. Оказалось, коллега все же решил не рисковать своим телефоном, а подложил муляж (негодяй), но эксперимент безусловно удался.

Из этого прототипа получилось полезное приложение для шаринга мест, но оно — тема другого поста.
UPD
Небольшое добавление, в ответ на полученные комментарии.
Мы не стремились сравнить показания GPS iPhon-а с какими либо эталонными значениями.
Пытались оценить результаты, полученные с разных iPhon-ов, находившихся в одной ситуации, но в разное время.
Мы исследовали то, насколько результаты первого измерения отличаются от результатов последующих, сделанных на схожие или одинаковые телефоны.
Были проведены десятки тестов в различных условиях. Коротко резюмировать полученный опыт можно двумя предложениями:
- Если снять координаты на один телефон, и прийти к ним с помощью другого, то при хороших условиях, вы будите находиться на расстоянии до 3-10м от цели.
- Значение location.horizontalAccuracy достаточно точно отражает действительность, если предположить что оно показывает, максимальное расстояние до точки полученной с помощью другого телефона.