when usage objective manager description ios objective-c core-location

ios - objective - location when in use usage description



distanceFromLocation-Calcular la distancia entre dos puntos (7)

Solo una pregunta rápida sobre la Ubicación del Núcleo, estoy tratando de calcular la distancia entre dos puntos, el código está abajo:

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

Recibo el siguiente error en las dos últimas líneas:

error: no se puede convertir a un tipo de puntero

He estado buscando en Google, pero no puedo encontrar nada.


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

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

de clase CLLocation.

CLLocationCoordinate2D es, de hecho, una estructura que consta de dos dobles:

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

La forma correcta de hacer esto es obtener un objeto CLLocation y llamar a distanceFromLocation en él. Me gusta esto:

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

Por supuesto, primero debe inicializar ambos valores (desde CLLocationManager , por ejemplo).


Intenta esto en su lugar:

CLLocationDistance meters = [newLocation distanceFromLocation:oldLocation];

El método que intentas usar es un método en un objeto CLLocation :)


La distancia se calcula entre 2 CLLocations y no entre las coordenadas.

Debe usar estas coordenadas para obtener las CLLocations para las coordenadas respectivas usando la siguiente línea de código

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

De manera similar para la otra coordenada, y luego puede calcular la distancia entre estas dos ubicaciones utilizando la siguiente línea de código

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

Espero que esto te ayudará.

Actualización: Swift 3.0

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


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

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


Tomado de las excelentes utilidades de CoreLocation de la biblioteca:

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


En Swift

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

func distanceBetweenTwoLocations(source:CLLocation,destination:CLLocation) -> Double{ var distanceMeters = source.distanceFromLocation(destination) var distanceKM = distanceMeters / 1000 let roundedTwoDigit = distanceKM.roundedTwoDigit return roundedTwoDigit }

Si quieres solo dos dígitos:

extension Double{ var roundedTwoDigit:Double{ return Double(round(100*self)/100) } }


#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