2013-03-21 2 views
2

Я часто использую метод distanceFromLocation для объектов CLLocation, чтобы добраться до других мест. Перечисляя через массив CLLocations, я затем сравниваю каждое с моим ссылочным местоположением с помощью этого метода.Как работает метод distanceFromLocation?

Мне любопытно узнать последствия обработки/памяти для использования distanceFromLocation, особенно для большого количества объектов CLLocation. Как работает этот метод - подключается ли он к серверу для получения данных или вычисляет расстояние на основе некоторой математической формулы, такой как Haversine Formula?

Есть ли более эффективный метод для сравнения расстояний между 1 опорным местоположением и массивом объектов CLLocation?

ответ

4

Скорее всего, они используют Сферический закон косинусов вместо Хаверсина (why? see this question).

Если все, что вы хотите сделать, это сравнить много точек с одной точкой, чтобы увидеть, что ближе всего, тогда, возможно, вам не нужна точность вычисленного расстояния и просто производительность. В этом случае, возможно, использование теоремы Пифагора будет работать для вас.

Все эти алгоритмы подробно описаны на this web page, который говорит в части:

If performance is an issue and accuracy less important, for small 
distances Pythagoras’ theorem can be used on an equirectangular 
projection:* 

Вы могли бы реализовать функцию, используя теорему Пифагора, то Benchmark его против одного в CLLocation и против моей реализации distanceInMetersFromRadians, который использует Сферический закон косинусов, чтобы увидеть, насколько разница в производительности.

+0

Следует отметить, что формула Хаверсина и все формулы, основанные на Меркаторе, которые предполагают Землю, являются сфероидом (который используется картами Google, Apple и Bing) являются приблизительными для расстояний и не должны использоваться для критических вычислений длины ГИС, где вы необходимо точное измерение земли. Достаточно, чтобы 99% приложений использовали Haversine и полагались на встроенные вычисления, однако ... это +/- 1 м для большинства приложений с погрешностью 0,1%, что на коротких расстояниях и вдали от полюсов. Если вы хотите получить точную точность, вам нужно рассчитать расстояния в проекциях UTM или Lambert. – JasonD

2

Из документации:

distanceFromLocation:

Этот метод измеряет расстояние между двумя точками, прослеживая линию между ними, который следует за кривизну Земли. Полученная дуга является гладкой кривой и не учитывает изменения конкретной высоты между двумя местоположениями.

Так что да, я предполагаю, что он использует Формулу Хаверсина (или ее модификацию).

+0

Также в Руководстве по программированию местоположения: Сбор данных о местоположении является энергоемкой работой. Это включает в себя включение бортовых радиоприемников и запрос доступных сотовых вышек, точек доступа Wi-Fi или спутников GPS, что может занять несколько секунд. – petert

+0

@petert Я предполагаю, что мой вопрос не был чистым, я знаю, что сбор данных о местоположении является энергоемким. Я хотел спросить: использует метод 'distanceFromLocation' для большого массива объектов местоположения неэффективно? Есть ли лучший способ сравнить места, где меньше процессор/память? – zdestiny

0

Вы использовали Инструменты и измерили его? Пока вы не сделали этого, это бессмысленно.

Вы можете воспользоваться ярлыками. Допустим, вам нужен ближайший пункт. Найдите формулу, которая дает вам примерно правильный результат. Обычно есть квадратный корень, поэтому получите формулу для квадрата расстояния - это быстрее и работает так же хорошо. Найдите ближайшую точку с вашей формулой. Теперь скажите, что ближайшая точка составляет 178,96 метра в зависимости от вашей формулы. Затем вы можете проверить все точки, которые говорят менее 180 метров, с помощью точной формулы.

0

Для небольших расстояний и на iOS 9 я обнаружил, что значения, полученные distanceFromLocation, надежно близки к найденным формулой Винценти с использованием эллипсоида WGS-84. По моему опыту, они точны в пределах приблизительно 7 или 8 значимых цифр.

Сферическая модель, такая как закон косинусов или формула Хаверсина, плохо сравнивается на малых расстояниях.

Для получения дополнительной информации см. geopy documentation и table of values for comparison.

Смежные вопросы