Pancho - 2 years ago 258
Swift Question

# Calculating MAX and MIN Latitude and Longitude with distance from Location - Objective C

I need to compute MAX and MIN Latitude and Longitude values from a location with certain distance.

I have thousands of locations stored in CoreData, and I want to show only the ones within 5km from users location.

How can I approach this problem?

Here's a possible solution:

1. macros to convert Degrees to Radians

``````#define deg2rad(degrees) ((degrees) / 180.0 M_PI)
``````
2. macros to hold my searching distance

``````#define searchDistance 5.00 //float value in KM
``````
3. set the minimum and maximum Latitude, Longitude values

``````float minLat = userLocation.coordinate.latitude - (searchDistance / 69);
float maxLat = userLocation.coordinate.latitude + (searchDistance / 69);
float minLon = userLocation.coordinate.latitude - searchDistance / fabs(cos(deg2rad(userLocation.coordinate.latitude))*69);
float maxLon = userLocation.coordinate.longitude + searchDistance / fabs(cos(deg2rad(userLocation.coordinate.latitude))*69);
``````
4. create predicate as follows

``````NSPredicate *predicate = [NSPredicate predicateWithFormat:@"latitude <= %f AND latitude >= %f AND longitude <= %f AND longitude >= %f", maxLat, minLat, maxLon, minLon];
``````

This will create a square around `userLocation` and check if a given location falls into its coordinates.

Update: Swift 2.* implementation

First create a function to compute degrees to radians

``````func deg2rad(degrees:Double) -> Double{
return degrees * M_PI / 180
}
``````

Compute and create minimum and maximum `Latitude` and `Longitude` values

``````let searchDistance:Double =  5.00 //float value in KM

let minLat = userLocation.coordinate.latitude - (searchDistance / 69)
let maxLat = userLocation.coordinate.latitude + (searchDistance / 69)

let minLon = userLocation.coordinate.longitude - searchDistance / fabs(cos(deg2rad(userLocation.coordinate.latitude))*69)
let maxLon = userLocation.coordinate.longitude + searchDistance / fabs(cos(deg2rad(userLocation.coordinate.latitude))*69)
``````

Last create `NSPredicate` to query `CoreData` for locations. In my case I am querying for values `latitude` and `longitude` but you should change this to match your `CoreData` object

``````let predicate = NSPredicate(format: "latitude <= \(maxLat) AND latitude >= \(minLat) AND longitude <= \(maxLon) AND longitude >= \(minLon)")
``````
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download