2010-10-11 29 views
46

Sólo una pregunta rápida sobre Core Location, Estoy tratando de calcular la distancia entre dos puntos, el código es el siguiente:distanceFromLocation - Calcular la distancia entre dos puntos

-(void)locationChange:(CLLocation *)newLocation:(CLLocation *)oldLocation 
    { 

    // Configure the new event with information from the location. 
     CLLocationCoordinate2D newCoordinate = [newLocation coordinate]; 
     CLLocationCoordinate2D oldCoordinate = [oldLocation coordinate]; 

     CLLocationDistance kilometers = [newCoordinate distanceFromLocation:oldCoordinate]/1000; // Error ocurring here. 
     CLLocationDistance meters = [newCoordinate distanceFromLocation:oldCoordinate]; // Error ocurring here. 
} 

Estoy recibiendo el siguiente error en el últimos dos líneas:

error: cannot convert to a pointer type

he estado buscando Google, pero no puedo encontrar nada.

Respuesta

109

Tal vez puedas probar:

CLLocationDistance meters = [newLocation distanceFromLocation:oldLocation]; 

El método que está intentando utilizar es un método en un objeto CLLocation :)

+9

y también mantener en mi mente "Este método mide la distancia entre los dos lugares al trazar una línea entre los que sigue la curvatura de la Tierra" documentos de manzana. Entonces esto no dará la distancia por carretera. –

+1

¿cómo se puede encontrar la distancia por carretera? @deanWombourne – Dalvik

+0

@AnkitSrivastava ¿cómo puedo encontrar la distancia por carretera? – Dalvik

23

Se calcula la distancia entre 2 CLLocations y no entre a las coordenadas.

Es necesario utilizar estas coordenadas para obtener los CLLocations para las respectivas coordenadas utilizando la siguiente línea de código

CLLocation *newLocation = [[CLLocation alloc] initWithCoordinate: newCoordinate altitude:1 horizontalAccuracy:1 verticalAccuracy:-1 timestamp:nil]; 

mismo modo para la otra coordenada y luego se puede calcular la distancia entre estos dos lugares utilizando la siguiente línea de código

CLLocationDistance kilometers = [newLocation distanceFromLocation:oldLocation]/1000; 

Espero que esto te ayude.

Actualización: Swift 3,0

let distanceKiloMeters = (newLocation.distance(from: oldLocation))/1000 
+0

¡Gracias! Está funcionando bien. – Raja

4

El problema aquí es que usted está llamando a un objeto method:

- (CLLocationDistance)distanceFromLocation:(const CLLocation *)location; 

de CLLocation clase.

CLLocationCoordinate2D es de hecho una estructura, que consiste en dos dobles:

typedef struct 
{ 
    CLLocationDegrees latitude; 
    CLLocationDegrees longitude; 
} CLLocationCoordinate2D; 

manera apropiada de hacer esto es para obtener un objeto CLLocation y llame distanceFromLocation en él. De esta manera:

CLLocation* newLocation; 
CLLocation* oldLocation; 
CLLocationDistance distance = [newLocation distanceFromLocation:oldLocation]; 

Por supuesto, primero tiene que inicializar estos dos valores (de CLLocationManager, por ejemplo).

2

Tomado de la excelente libary CoreLocation utitlities:

- (CLLocationDistance) distanceFromCoordinate:(CLLocationCoordinate2D) fromCoord; 
{ 
    double earthRadius = 6371.01; // Earth's radius in Kilometers 

    // Get the difference between our two points then convert the difference into radians 
    double nDLat = (fromCoord.latitude - self.coordinate.latitude) * kDegreesToRadians; 
    double nDLon = (fromCoord.longitude - self.coordinate.longitude) * kDegreesToRadians; 

    double fromLat = self.coordinate.latitude * kDegreesToRadians; 
    double toLat = fromCoord.latitude * kDegreesToRadians; 

    double nA = pow (sin(nDLat/2), 2) + cos(fromLat) * cos(toLat) * pow (sin(nDLon/2), 2); 

    double nC = 2 * atan2(sqrt(nA), sqrt(1 - nA)); 
    double nD = earthRadius * nC; 

    return nD * 1000; // Return our calculated distance in meters 
} 
+1

En caso de que alguien tenga curiosidad, esta es la fórmula [haversine] (http://en.wikipedia.org/wiki/Haversine_formula) –

12

En Swift

Vamos a crear una función método que calcula la distancia entre dos lugares:

func distanceBetweenTwoLocations(source:CLLocation,destination:CLLocation) -> Double{ 

     var distanceMeters = source.distanceFromLocation(destination) 
     var distanceKM = distanceMeters/1000 
     let roundedTwoDigit = distanceKM.roundedTwoDigit 
     return roundedTwoDigit 

    } 

si desea que sólo dos dígitos:

extension Double{ 

    var roundedTwoDigit:Double{ 

     return Double(round(100*self)/100) 

     } 
    } 
+1

Buena respuesta. Solo un punto menor. Debe reemplazar 'var' con' let' iniside distanceBetweenTwoLocations func ;-) –

5

Si va a hacer con 2 valores de CLLocationCoordinate2D, puede usar esto.

Ésta es Swift 2.1 en Xcode 7,1

import CoreLocation 

extension CLLocationCoordinate2D { 

    func distanceInMetersFrom(otherCoord : CLLocationCoordinate2D) -> CLLocationDistance { 
     let firstLoc = CLLocation(latitude: self.latitude, longitude: self.longitude) 
     let secondLoc = CLLocation(latitude: otherCoord.latitude, longitude: otherCoord.longitude) 
     return firstLoc.distanceFromLocation(secondLoc) 
    } 

} 
3
#import <CoreLocation/CoreLocation.h> 

CLLocation *locA = [[CLLocation alloc] initWithLatitude:"Value" longitude:"Value"]; 

CLLocation *locB = [[CLLocation alloc] initWithLatitude:"Value" longitude:"Value"]; 

CLLocationDistance distance = [locA distanceFromLocation:locB]; 
NSLog(@"distance:-%f",distance);//distance in Miter 
+0

Necesita una explicación para esta respuesta –

+0

Hola Burhanuddin Rashid Este no es el código de Desarrollo de Android. es el código de desarrollo ios para el "Calcular distancia entre dos puntos" –

+0

No importa el tiempo en su IOS, Android o cualquier otro campo técnico. La respuesta de Think es que debería tener una pequeña explicación con el código ... simplemente no copie y pegue el código ... tenga cortesía para alguna explicación –

Cuestiones relacionadas