#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. Это скорее вопрос о том, каковы ваши требования к точности.