Find nearest by lat/long with Core Data

前端 未结 3 1322
鱼传尺愫
鱼传尺愫 2021-02-10 02:23

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?

相关标签:
3条回答
  • 2021-02-10 02:37

    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
                }
            }   
        }
    
    0 讨论(0)
  • 2021-02-10 02:43

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

    - (CLLocationDistance)getDistanceFrom:(const CLLocation *)location
    
    0 讨论(0)
  • 2021-02-10 02:52

    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

    0 讨论(0)
提交回复
热议问题