Найти ближайший по широте / долготе с Core Data - PullRequest
5 голосов
/ 20 октября 2011

У меня есть приложение для iPhone с базой данных Core Data, содержащей список местоположений, каждое из которых имеет координаты широты и долготы. Как мне найти, скажем, 10 ближайших к моему текущему местоположению?

Я новичок в Core Data, поэтому мой вопрос на самом деле заключается в том, как выполнить поиск, я знаю, как определить свое текущее местоположение и т. Д. Я считаю, что мне нужно настроить NSP-предикат с термином запроса, но не уверен, как именно быть написано.

Спасибо, J

Ответы [ 3 ]

8 голосов
/ 07 августа 2012

Существует также функция CoreLocation, которая решает эту конкретную проблему:

- (CLLocationDistance)getDistanceFrom:(const CLLocation *)location
5 голосов
/ 20 октября 2011

Вы можете попробовать это ( ссылка )

double M_PI = 3.141592653589793;
#define d2r (M_PI / 180.0)

    double haversine_km(double lat1, double long1, double lat2, double long2) {
        double dlong = (long2 - long1) * d2r;
        double dlat = (lat2 - lat1) * d2r;
        double a = pow(sin(dlat/2.0), 2) + cos(lat1*d2r) * cos(lat2*d2r) * pow(sin(dlong/2.0), 2);
        double c = 2 * atan2(sqrt(a), sqrt(1-a));
        double distance = 6367 * c;

        return distance;
    }

    - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
        /*Calculate distance of all locations in DB and current location. If diff. between any stop is less than x meters, perform desired operation*/
        NSArray *listLocationsFromDB = [self getLocations]; //Get all locations from DB
        for (Location *location in listLocationsFromDB) {
            double distance = haversine_km(newLocation.coordinate.latitude, newLocation.coordinate.longitude, [location.latitude doubleValue], [location.longitude doubleValue]);
            distance *= 1000;
            if (distance <= 200) {  //200 meters
                //Your code here
            }
        }   
    }
4 голосов
/ 20 октября 2011

Вам нужна формула Haversine для расстояния между широтой и длинной парой.Вы можете иметь вычисляемое поле для каждого объекта, которое возвращает его расстояние от заданной точки, а затем упорядочить по этому расстоянию, чтобы получить ближайшее -> самое дальнее.

См. эту статью о Haversine

А вот и версия Objective-c ...

Objective-c Haversine

...