2010-03-10 8 views
5

¿Cómo se determina una distancia de 1000 pies o de media milla con el juego de mapas? Ya sea un radio de un pin o la distancia entre dos pines.Determinar la distancia usando mapkit

Por ejemplo, centro el mapa en el pin A. Los pasadores B, C y D también están en el mapa a varias distancias del pin A. B y C están dentro de 1/2 milla de A, pero D es de 1 milla lejos. Me gustaría saber que B y C están dentro de 1/2 milla de A. ¿Cómo puedo calcular eso?

+0

¿Puede explicar su pregunta más, por lo que podemos entender los requisitos exactos? –

+0

He editado la pregunta. Hágame saber si necesita más información. – user230949

Respuesta

13

Como ha indicado que los dos puntos diferentes son "pines", supongo que está utilizando MKPinAnnotationView (o alguna otra vista de anotación). Si no, vas a tener que obtener la ubicación de otra manera.

Si tiene punteros a los objetos de anotación para estos lugares, entonces se puede llamar fácilmente -coordinate en ellos, crear CLLocations de estas coordenadas (utilizando -initWithLatitude:longitude:), y luego usar el método -getDistanceFrom para recuperar la distancia en metros. A partir de ahí, es una conversión fácil a millas. En total, el código sería algo como esto:

CLLocationCoordinate2D pointACoordinate = [pointAAnnotation coordinate]; 
CLLocation *pointALocation = [[CLLocation alloc] initWithLatitude:pointACoordinate.latitude longitude:pointACoordinate.longitude]; 
CLLocationCoordinate2D pointBCoordinate = [pointBAnnotation coordinate]; 
CLLocation *pointBLocation = [[CLLocation alloc] initWithLatitude:pointBCoordinate.latitude longitude:pointBCoordinate.longitude]; 
double distanceMeters = [pointALocation getDistanceFrom:pointBLocation]; 
double distanceMiles = (distanceMeters/1609.344); 

que va a terminar con la distancia en millas, y se puede comparar a partir de ahí. Espero que esto ayude.

+0

bien, pero de esta manera obtenemos la distancia recta entre esos dos puntos ... no es real cómo encontrar esta distancia real .... – AJPatel

12

getDistanceFrom ahora está en desuso, así que aquí hay una respuesta alternativa para cualquiera que quiera hacer esto.

CLLocationCoordinate2D pointACoordinate = [pointAAnnotation coordinate]; 
CLLocation *pointALocation = [[CLLocation alloc] initWithLatitude:pointACoordinate.latitude longitude:pointACoordinate.longitude]; 

CLLocationCoordinate2D pointBCoordinate = [pointBAnnotation coordinate]; 
CLLocation *pointBLocation = [[CLLocation alloc] initWithLatitude:pointBCoordinate.latitude longitude:pointBCoordinate.longitude]; 

float distanceMeters = [pointALocation distanceFromLocation:pointBLocation]; 
float distanceMiles = (distanceMeters/1609.344); 

[pointALocation release]; 
[pointBLocation release]; 

Como el anterior, se puede utilizar en lugar de floatdouble y se podía emitir los resultados a un int si no se requiere la precisión de la float así:

int distanceCastToInt = (int) [pointALocation distanceFromLocation:pointBLocation]; 

El int es útil si se quería dar una idea aproximada de la distancia en la anotación de este modo:

pointAAnnotation.title = @"Point A"; 
pointAAnnotation.subtitle = [NSString stringWithFormat: @"Distance: %im",distanceCastToInt]; 

el subtítulo de t La anotación decía "Distancia: 50 m" por ejemplo.

0

Esto es equivalente Swift 3 de la respuesta dada:

let pointACoordinate = pointAAnnotation.coordinate 
let pointALocation = CLLocation(latitude: pointACoordinate.latitude, longitude: pointACoordinate.longitude) 
let pointBCoordinate = pointBAnnotation.coordinate 
let pointBLocation = CLLocation(latitude: pointBCoordinate.latitude, longitude: pointBCoordinate.longitude) 
let distanceMeters = pointALocation.distance(from: pointBLocation) 
let distanceMiles = (distanceMeters/1609.344) 
Cuestiones relacionadas