distanceFromLocation - Рассчитать расстояние между двумя точками - PullRequest
48 голосов
/ 11 октября 2010

Просто быстрый вопрос о расположении ядра, я пытаюсь вычислить расстояние между двумя точками, код ниже:

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

Я получаю следующую ошибку в последних двух строках:

ошибка: невозможно преобразовать в тип указателя

Я искал в Google, но ничего не могу найти.

Ответы [ 7 ]

111 голосов
/ 11 октября 2010

Попробуйте вместо этого:

CLLocationDistance meters = [newLocation distanceFromLocation:oldLocation];

Метод, который вы пытаетесь использовать, - это метод объекта CLLocation :)

22 голосов
/ 11 октября 2010

Расстояние рассчитывается между 2 CLLocations, а не между координатами.

Эти координаты необходимо использовать для получения CLLocations для соответствующих координат с использованием следующей строки кода

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

Аналогично для другой координаты, а затем вы можете вычислить расстояние между этими двумя точками, используя следующую строку кода

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

Надеюсь, это вам поможет.1012 * Swift 3.0

let distanceKiloMeters = (newLocation.distance(from: oldLocation))/1000
11 голосов
/ 02 июля 2015

In Swift

Давайте создадим функцию метода, которая вычисляет расстояние между двумя местоположениями:

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

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

    }

Если вам нужны только две цифры:

extension Double{

    var roundedTwoDigit:Double{

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

        }
    }
5 голосов
/ 25 октября 2015

Если вы собираетесь использовать 2 значения CLLocationCoordinate2D, вы можете использовать это.

Это Swift 2.1 на 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)
    }

}
4 голосов
/ 29 сентября 2016
#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
4 голосов
/ 11 октября 2010

Проблема в том, что вы вызываете объект метод :

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

класса CLLocation.

CLLocationCoordinate2D фактически является структурой, состоящей из двух двойных чисел:

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

Правильный способ сделать это - получить объект CLLocation и вызвать на нем distanceFromLocation. Как это:

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

Конечно, сначала вам нужно инициализировать оба этих значения (например, с CLLocationManager).

2 голосов
/ 22 января 2014

Взято из превосходной библиотеки 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
}
...