Как узнать расстояние между координатами?

Я хочу сделать так, чтобы он показывал расстояние между двумя координатами CLLocation. Есть ли способ сделать это без сложной математической формулы? Если нет, как бы вы сделали это с помощью формулы?


person John Doe    schedule 23.10.2015    source источник
comment
Пожалуйста, прочитайте документ, прежде чем спрашивать   -  person Cosyn    schedule 23.10.2015
comment
@Cosyn Хорошо, я буду в следующий раз. Извини за это.   -  person John Doe    schedule 23.10.2015


Ответы (9)


CLLocation имеет метод DistanceFromLocation, поэтому при наличии двух CLLocations:

CLLocationDistance distanceInMeters = [location1 distanceFromLocation:location2];

или в Свифт 4:

//: Playground - noun: a place where people can play

import CoreLocation


let coordinate₀ = CLLocation(latitude: 5.0, longitude: 5.0)
let coordinate₁ = CLLocation(latitude: 5.0, longitude: 3.0)

let distanceInMeters = coordinate₀.distance(from: coordinate₁) // result is in meters

вы получаете здесь расстояние в метрах, поэтому 1 миля = 1609 метров

if(distanceInMeters <= 1609)
 {
 // under 1 mile
 }
 else
{
 // out of 1 mile
 }
person Glenn Howes    schedule 23.10.2015
comment
Как мне преобразовать это в мили? - person John Doe; 23.10.2015
comment
О, подождите, я понял! Спасибо. (: - person John Doe; 23.10.2015
comment
Согласно Google, в метре 0,000621371 мили. Итак, я бы предложил умножить его на 0,000621371. - person Glenn Howes; 23.10.2015
comment
Ок, отлично, спасибо! Я приму ваш ответ через несколько минут, когда он позволит мне. - person John Doe; 23.10.2015
comment
несколько раз он показывает неправильное расстояние, которое я проверил с помощью карты Google с теми же местоположениями, которые я указал в коде. пожалуйста, любой другой способ рассчитать расстояние, дайте мне знать, пожалуйста. - person vijay; 24.02.2017
comment
Ну как далеко? - person Glenn Howes; 24.02.2017
comment
Это не истинное расстояние. По дороге Согласно Apple Docs — этот метод измеряет расстояние между двумя точками, проводя линию между ними, которая повторяет кривизну Земли. Полученная дуга представляет собой гладкую кривую и не учитывает конкретных изменений высоты между двумя точками. developer.apple.com/documentation/corelocation/cllocation/ .. поэтому, если вы ищете расстояние в пути, надежным способом найти правильное расстояние до сих пор был Google Maps Distance Matrix API или MKRoute. - person AnBisw; 18.07.2017
comment
@Annjawn Это действительно не имеет ничего общего с заданным вопросом. - person Glenn Howes; 18.07.2017
comment
@GlennHowes да, есть вероятность, что OP пытается найти расстояние вождения (или другого вида транспорта) между двумя точками, и в этом случае просто геопространственное расстояние, полученное с помощью distanceFromLocation, будет совершенно неверным. Для расстояния в пути правильной реализацией будет использование MKRoute, которое даст вам расстояние маршрута distance в метрах вместе с другими данными, такими как ожидаемое время в пути, тип транспорта и т. д. - developer.apple.com/documentation/mapkit/mkroute - person AnBisw; 18.07.2017
comment
И, как сообщил @vijay (в комментариях выше), это причина того, что его расстояния неверны по сравнению с Google Map. Карта Google и MKRoute будут учитывать информацию о маршруте для расчета фактического расстояния транспортировки, тогда как простой distanceFromLocation этого не сделает, поэтому я предлагаю вам обновить свой ответ, чтобы уточнить это, чтобы не сбивать с толку людей, которые попадают на эту страницу через Google. - person AnBisw; 18.07.2017
comment
Как я могу сделать это с местом с двумя координатами? - person Muhammed; 01.01.2018
comment
Нет, это просто математический расчет. Это не пошаговый поиск в базе данных. - person Glenn Howes; 29.04.2018
comment
let DistanceInMiles = координата.расстояние (от: currentDeviceCoordinate) / 1609,344 // результат в милях - person Gurjinder Singh; 24.05.2018

Свифт 4.1

import CoreLocation

//My location
let myLocation = CLLocation(latitude: 59.244696, longitude: 17.813868)

//My buddy's location
let myBuddysLocation = CLLocation(latitude: 59.326354, longitude: 18.072310)

//Measuring my distance to my buddy's (in km)
let distance = myLocation.distance(from: myBuddysLocation) / 1000

//Display the result in km
print(String(format: "The distance to my buddy is %.01fkm", distance))
person Mohammed Abunada    schedule 21.06.2018


Для свифт 4

   let locationOne = CLLocation(latitude: lat, longitude: long)
   let locationTwo = CLLocation(latitude: lat,longitude: long)

  let distance = locationOne.distance(from: locationTwo) * 0.000621371

  distanceLabel.text = "\(Int(round(distance))) mi"
person Faris    schedule 07.04.2019

Для цели-c

Вы можете использовать distanceFromLocation, чтобы найти расстояние между двумя координатами.

Фрагменты кода:

CLLocation *loc1 = [[CLLocation alloc] initWithLatitude:lat1 longitude:lng1];

CLLocation *loc2 = [[CLLocation alloc] initWithLatitude:lat2 longitude:lng2];

CLLocationDistance distance = [loc1 distanceFromLocation:loc2];

Ваш результат будет в метрах.

person Vijay    schedule 23.10.2015
comment
вопрос здесь подписан словом «быстро». Так что, возможно, вам нужно обновить свой ответ или добавить For Objective-c: @Vijay - person Dory Daniel; 01.03.2017

Вы также можете использовать алгоритм HaversineDistance точно так же, как разработчики Android, это полезно, когда у вас есть другой приложение в Android похоже на него, иначе ответ выше для вас верен.

import UIKit

func haversineDinstance(la1: Double, lo1: Double, la2: Double, lo2: Double, radius: Double = 6367444.7) -> Double {

let haversin = { (angle: Double) -> Double in
    return (1 - cos(angle))/2
}

let ahaversin = { (angle: Double) -> Double in
    return 2*asin(sqrt(angle))
}

// Converts from degrees to radians
let dToR = { (angle: Double) -> Double in
    return (angle / 360) * 2 * .pi
}

let lat1 = dToR(la1)
let lon1 = dToR(lo1)
let lat2 = dToR(la2)
let lon2 = dToR(lo2)

return radius * ahaversin(haversin(lat2 - lat1) + cos(lat1) * cos(lat2) * haversin(lon2 - lon1))
}

let amsterdam = (52.3702, 4.8952)
let newYork = (40.7128, -74.0059)

// Google says it's 5857 km so our result is only off by 2km which could be due to all kinds of things, not sure how google calculates the distance or which latitude and longitude google uses to calculate the distance.
haversineDinstance(la1: amsterdam.0, lo1: amsterdam.1, la2: newYork.0, lo2: newYork.1)

Я взял код, написанный выше, по справочной ссылке https://github.com/raywenderlich/swift-algorithm-club/blob/master/HaversineDistance/HaversineDistance.playground/Contents.swift

person Sazid Iqabal    schedule 24.02.2020

Свифт 5.

func calculateDistance(mobileLocationX:Double,mobileLocationY:Double,DestinationX:Double,DestinationY:Double) -> Double {

        let coordinate₀ = CLLocation(latitude: mobileLocationX, longitude: mobileLocationY)
        let coordinate₁ = CLLocation(latitude: DestinationX, longitude:  DestinationY)

        let distanceInMeters = coordinate₀.distance(from: coordinate₁)

        return distanceInMeters
    }

использовать для

let distance = calculateDistance("add parameters")
person ikbal    schedule 14.05.2019

person    schedule
comment
Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, почему и/или как этот код отвечает на вопрос, повышает его ценность в долгосрочной перспективе. - person rollstuhlfahrer; 27.04.2018

person    schedule
comment
Хотя этот код может ответить на вопрос, было бы лучше объяснить, как он решает проблему, не вводя других, и зачем его использовать. Ответы, содержащие только код, в долгосрочной перспективе бесполезны. - person koen; 21.11.2019