Я хочу сделать так, чтобы он показывал расстояние между двумя координатами CLLocation. Есть ли способ сделать это без сложной математической формулы? Если нет, как бы вы сделали это с помощью формулы?
Как узнать расстояние между координатами?
Ответы (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
}
distanceFromLocation
, будет совершенно неверным. Для расстояния в пути правильной реализацией будет использование MKRoute
, которое даст вам расстояние маршрута distance
в метрах вместе с другими данными, такими как ожидаемое время в пути, тип транспорта и т. д. - developer.apple.com/documentation/mapkit/mkroute
- person AnBisw; 18.07.2017
distanceFromLocation
этого не сделает, поэтому я предлагаю вам обновить свой ответ, чтобы уточнить это, чтобы не сбивать с толку людей, которые попадают на эту страницу через Google.
- person AnBisw; 18.07.2017
Свифт 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))
Попробуйте это:
distanceInMeters = fromLocation.distanceFromLocation(toLocation)
distanceInMiles = distanceInMeters/1609.344
Возвращаемое значение: расстояние (в метрах) между двумя местоположениями.
1609.344
. en.wikipedia.org/wiki/Mile
- person thetrutz; 09.05.2020
Measurement
: let miles = Measurement(value: meters, unit: UnitLength.meters).converted(to: UnitLength.miles).value
- person gyratory circus; 27.12.2020
Для свифт 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"
Для цели-c
Вы можете использовать distanceFromLocation
, чтобы найти расстояние между двумя координатами.
Фрагменты кода:
CLLocation *loc1 = [[CLLocation alloc] initWithLatitude:lat1 longitude:lng1];
CLLocation *loc2 = [[CLLocation alloc] initWithLatitude:lat2 longitude:lng2];
CLLocationDistance distance = [loc1 distanceFromLocation:loc2];
Ваш результат будет в метрах.
Вы также можете использовать алгоритм 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
Свифт 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")