distanceFromLocation-calculer la distance entre deux points
juste une question rapide sur L'emplacement du cœur, j'essaie de calculer la distance entre deux points, le code est ci-dessous:
-(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.
}
j'obtiens l'erreur suivante sur les deux dernières lignes:
erreur: ne peut pas convertir en un type de pointeur
j'ai cherché sur Google, mais je ne trouve rien.
7 réponses
essayez plutôt ceci:
CLLocationDistance meters = [newLocation distanceFromLocation:oldLocation];
la méthode que vous essayez d'utiliser est une méthode sur un CLLocation objet:)
la distance est calculée entre 2 positions et non entre les coordonnées to.
vous devez utiliser ces coordonnées pour obtenir les CLLocations pour les coordonnées respectives en utilisant la ligne de code suivante
CLLocation *newLocation = [[CLLocation alloc] initWithCoordinate: newCoordinate altitude:1 horizontalAccuracy:1 verticalAccuracy:-1 timestamp:nil];
de la même façon pour l'autre coordonnée et alors vous pouvez calculer la distance entre ces deux endroits en utilisant la ligne de code suivante
CLLocationDistance kilometers = [newLocation distanceFromLocation:oldLocation] / 1000;
espérons que cela vous aidera.
Mise À Jour: Swift 3.0
let distanceKiloMeters = (newLocation.distance(from: oldLocation))/1000
Swift
créons une fonction de méthode qui calcule la distance entre deux emplacements:
func distanceBetweenTwoLocations(source:CLLocation,destination:CLLocation) -> Double{
var distanceMeters = source.distanceFromLocation(destination)
var distanceKM = distanceMeters / 1000
let roundedTwoDigit = distanceKM.roundedTwoDigit
return roundedTwoDigit
}
si vous voulez seulement deux chiffres:
extension Double{
var roundedTwoDigit:Double{
return Double(round(100*self)/100)
}
}
si vous allez faire avec 2 valeurs CLLocationCoordinate2D, alors vous pouvez utiliser ceci.
ici Swift 2.1 sur 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)
}
}
le problème ici est que vous appelez un objet méthode :
- (CLLocationDistance)distanceFromLocation:(const CLLocation *)location;
de la classe CLLocation.
CLLocationCoordinate2D est en fait une structure, composée de deux doubles:
typedef struct
{
CLLocationDegrees latitude;
CLLocationDegrees longitude;
} CLLocationCoordinate2D;
la bonne façon de faire ceci est d'obtenir un objet CLLocation
et d'appeler distanceFromLocation
dessus. Comme ceci:
CLLocation* newLocation;
CLLocation* oldLocation;
CLLocationDistance distance = [newLocation distanceFromLocation:oldLocation];
bien sûr, vous devez d'abord initialiser les deux ces valeurs (de CLLocationManager
, par exemple).
#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
tiré de l'excellent libary utitlities CoreLocation :
- (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
}