Find nearest by lat/long with Core Data

99封情书 提交于 2019-12-04 12:49:25

问题


I have an iPhone app with a Core Data database containing a list of locations, each with lat/long coordinates. How can I search for say the nearest 10 to my current location?

I'm new to Core Data so my question is really how to do the lookup, I know how to get my current location etc. I believe I need to setup an NSPredicate with a query term but not sure exactly how that should be written.

Thanks, J


回答1:


You may try this (reference)

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
            }
        }   
    }



回答2:


There is also a CoreLocation function which solves that particular issue :

- (CLLocationDistance)getDistanceFrom:(const CLLocation *)location



回答3:


You need the Haversine formula for distance between lat / long pairs. You can have a calculated field for each object which returns it's distance from a set point, then order by this distance to get the nearest -> farthest.

See this article on Haversine

And here is an Objective-c version...

Objective-c Haversine



来源:https://stackoverflow.com/questions/7833895/find-nearest-by-lat-long-with-core-data

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!