CLLocation — добавление радиуса 2 км или 2000 м к координате

#iphone #latitude-longitude #cllocation

#iPhone #широта-долгота #cllocation

Вопрос:

Как я могу добавить радиус к CLLocation координате? Я хочу посмотреть, какие клиенты находятся рядом с определенной координатой.

Что мне нужно, так это добавить 2000 метров или 2 км к координате.

Как мне это сделать?

Комментарии:

1. Это ничего не значит, вы хотите добавить значение измерения 1 к значению измерения 2, вы имеете в виду вычисление расстояния между двумя координатами?

2. @jbat100 Нет, я хочу добавить радиус 2000 метров к координате: 2000 к широте и 2000 к долготе, чтобы, вычитая эти значения, я мог сравнить координаты всех клиентов и получить всех, кто находится в пределах 2000 метров от моего местоположения. местоположение.

Ответ №1:

Вы не можете «добавить радиус» к координате. Что вы можете сделать, если у вас есть CLLocation объекты (скажем, loc1 и loc2), это рассчитать расстояние между ними:

 CLLocationDistance dist = [loc1 distanceFromLocation:loc2];
  

и посмотрите, будет ли dist (в метрах) больше или меньше 2000.0.

Преобразование между координатами широты / долготы (которые являются полярными координатами) и расстояниями является сложным, поэтому SDK предоставляет вам эту функциональность.

Комментарии:

1. таким образом, я должен проходить через всех клиентов. Представьте, что у меня есть 40.000 клиентских объектов в CoreData. Если бы я мог преобразовать 2000 метров по широте и долготе, я мог бы сделать NSPredicate и немедленно получить результат. Таким образом, я должен пройти через всех клиентов, что займет некоторое время в приложении… Есть ли какой-нибудь эффективный способ?

2. вы не можете преобразовать 2000 метров в широту и долготу, в этом суть. На экваторе изменение долготы на 180 градусов составляет около 20000 км, на северном полюсе изменение долготы на 180 градусов равно 0 км. Что вы можете сделать, это предварительно рассчитать расстояния и кэшировать их. Или для каждого клиентского объекта есть предварительно рассчитанный диапазон допустимых долгот и широт, тогда вы можете использовать предикаты.

Ответ №2:

Поскольку расстояние невелико, вы можете использовать приближение равноугольного расстояния. Это приближение выполняется быстрее, чем при использовании формулы Haversine. Итак, чтобы получить расстояние от вашей контрольной точки (lat1 / lon1) до точки, которую вы тестируете (lat2 / lon2), используйте приведенную ниже формулу. Важное примечание: вам необходимо преобразовать все широты / широты в радианы:

 R = 6371  // radius of the earth in km
x = (lon2 - lon1) * cos( 0.5*(lat2 lat1) )
y = lat2 - lat1
d = R * sqrt( x*x   y*y )
  

Если d меньше 2, то ваша точка находится в пределах 2 км от вашей контрольной точки.

Чтобы эффективно перемещаться по своим точкам, упорядочивайте точки по долготе. Долготы, удаленные на 2 градуса, будут больше 2 км (если вы не находитесь рядом с полюсом), поэтому вам не нужно перебирать их.

Комментарии:

1. До какого расстояния формула согласуется? Пользователь сможет выбрать расстояние. Какое максимальное расстояние? 100 км?

2. Это скорее вопрос о том, каковы ваши требования к точности.