【问题标题】:Finding distance between CLLocationCoordinate2D points查找 CLLocationCoordinate2D 点之间的距离
【发布时间】:2012-06-20 02:27:55
【问题描述】:

我从文档中知道我们可以使用函数distanceFromLocation: 找到两个CLLocation 点之间的距离。但我的问题是我没有 CLLocation 数据类型,我有 CLLocationCoordinate2D 点。那么如何找到两个 CLLocationCoordinate2D 点之间的距离。我看过post 的帖子,但对我没有帮助。

【问题讨论】:

  • 距离计算实际上相当棘手。你真的应该再看看 CLLocation。
  • 你有 lat 和 long 然后创建 cllocation 然后使用 CLLocationDistance 米 = [newLocation distanceFromLocation:oldLocation];
  • 检查这个:[distanceFromLocation - 计算两点之间的距离][1] [1]:stackoverflow.com/questions/3905896/…

标签: ios iphone core-location


【解决方案1】:

CLLocationCoordinate2D+Distance.swift 用于基于 MapKit 的 Swift 5.5:

import MapKit

extension CLLocationCoordinate2D {

    /// Returns the distance between two coordinates in meters.
    func distance(to: CLLocationCoordinate2D) -> CLLocationDistance {
        MKMapPoint(self).distance(to: MKMapPoint(to))
    }

}

基于CLLocation的版本:

import CoreLocation

extension CLLocationCoordinate2D {

    /// Returns the distance between two coordinates in meters.
    func distance(to: CLLocationCoordinate2D) -> CLLocationDistance {
        CLLocation(latitude: latitude, longitude: longitude)
            .distance(from: CLLocation(latitude: to.latitude, longitude: to.longitude))
    }

}

这两种扩展都有性能开销,如果处理大量坐标,这可能与此相关。在这些情况下:

Euclid package 中有一个对 CLLocationCoordinate2D 的扩展,它直接执行计算,请参阅:distance(to:)

【讨论】:

    【解决方案2】:

    Swift 5:CLLocationCoordinate2D 扩展来计算距离:

    extension CLLocationCoordinate2D {
        /// Returns distance from coordianate in meters.
        /// - Parameter from: coordinate which will be used as end point.
        /// - Returns: Returns distance in meters.
        func distance(from: CLLocationCoordinate2D) -> CLLocationDistance {
            let from = CLLocation(latitude: from.latitude, longitude: from.longitude)
            let to = CLLocation(latitude: self.latitude, longitude: self.longitude)
            return from.distance(from: to)
        }
    }
    

    用法:

    let coordinate = CLLocationCoordinate2D(latitude: 11, longitude: 39)
    let from = CLLocationCoordinate2D(latitude: 30, longitude: 43)
    let distance = coordinate.distance(from: from)
    

    【讨论】:

      【解决方案3】:

      斯威夫特 5:

      extension CLLocation {
          
          /// Get distance between two points
          ///
          /// - Parameters:
          ///   - from: first point
          ///   - to: second point
          /// - Returns: the distance in meters
          class func distance(from: CLLocationCoordinate2D, to: CLLocationCoordinate2D) -> CLLocationDistance {
              let from = CLLocation(latitude: from.latitude, longitude: from.longitude)
              let to = CLLocation(latitude: to.latitude, longitude: to.longitude)
              return from.distance(from: to)
          }
      }
      

      【讨论】:

      • 但我觉得更像这样: extension CLLocationCoordinate2D { // 以米为单位 func distance(#to:CLLocationCoordinate2D) -> CLLocationDistance { let from = CLLocation(latitude: self.latitude, longitude: self.longitude ) 让 to = CLLocation(latitude: to.latitude, longitude: to.longitude) return from.distanceFromLocation(to) } }
      【解决方案4】:

      CLLocationDistance 以米为单位。

      let point1 = CLLocationCoordinate2D(latitude: lat1, longitude: lon1)
      let point2 = CLLocationCoordinate2D(latitude: lat2, longitude: lon2)
      let distance = point1.distance(to: point2)
      

      【讨论】:

      • 没有必要仅仅为了计算距离而导入另一个框架(MapKit)。 CLLocation 确实有一个 distance(from:) 方法来计算两个 CLLocation 对象之间的距离,它是纯 CoreLocation。
      • Swift 4+:只需使用 let distance = aLocation.distance(from: anotherLocation) developer.apple.com/documentation/corelocation/cllocation/…
      【解决方案5】:

      您应该使用 CLLocation 创建一个对象,

      - (id)initWithLatitude:(CLLocationDegrees)latitude
          longitude:(CLLocationDegrees)longitude;
      

      然后,您应该能够使用计算距离

      [location1 distanceFromLocation:location2];
      

      【讨论】:

      • 带代码 CLLocationDistance 距离 = [aCLLocationA distanceFromLocation:aCLLocationB]; // distance 是一个以米为单位的双精度数(来源 - stackoverflow.com/a/10432069/1364174
      • 无需创建 CLLocation 来获取点之间的距离。请看我在底部的回答
      【解决方案6】:

      Swift4:结合以上想法

      extension CLLocationCoordinate2D {
          //distance in meters, as explained in CLLoactionDistance definition
          func distance(from: CLLocationCoordinate2D) -> CLLocationDistance {
              let destination=CLLocation(latitude:from.latitude,longitude:from.longitude)
              return CLLocation(latitude: latitude, longitude: longitude).distance(from: destination)
          }
      }
      

      【讨论】:

        【解决方案7】:
            let point1 = MKMapPointForCoordinate(myLocation)
            let point2 = MKMapPointForCoordinate(friendLocation)
            let distance = MKMetersBetweenMapPoints(point1, point2)/1000
            let distanceStr = NSString(format: "%.3f", distance)
        

        Valleri 答案的简单版本。除以 1000 得到 KM,然后转换为字符串。

        【讨论】:

          【解决方案8】:

          如果您可以获取点之间的距离(以米为单位),那么

          CLLocationCoordinate2D coordinate1 = <some value>
          CLLocationCoordinate2D coordinate2 = <some value>
          …
          MKMapPoint point1 = MKMapPointForCoordinate(coordinate1);
          MKMapPoint point2 = MKMapPointForCoordinate(coordinate2);
          CLLocationDistance distance = MKMetersBetweenMapPoints(point1, point2);
          

          将返回两点之间的距离。无需通过给定的CLLocationCoordinate2D 创建CLLocation。此定义自 iOS 4.0 起可用

          【讨论】:

          • 很好,但需要链接 MapKit。使用 CLLocation 然后距离不需要它。
          猜你喜欢
          • 2013-12-27
          • 2019-09-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-01
          • 2021-11-04
          • 1970-01-01
          • 2018-03-01
          相关资源
          最近更新 更多