【问题标题】:Calculate lat/long coords a specific distance away from another pair of lat/long coords [duplicate]计算距另一对纬度/经度坐标特定距离的纬度/经度坐标[重复]
【发布时间】:2014-12-16 21:23:24
【问题描述】:

我的应用需要能够获取用户的起始位置,然后计算纬度/经度坐标与该点的特定距离(在所有方向上)。有谁知道我如何做到这一点?

【问题讨论】:

标签: ios objective-c xcode swift latitude-longitude


【解决方案1】:

距中心点固定距离的点集具有无限的成员,因此不可能列出每一个。但是,给定一个点,您可以使用 distanceFromLocation: 方法检查它是否在集合内。

在数学上,给定一个半径坐标(经纬度)并假设地球是平的,半径(距离)为 r 的圆的方程为

r^2 = (x - long)^2 + (y - lat)^2

使用一些魔法,这变成了

x = r cosθ - long; y = r sinθ - lat

因此,现在您可以在任意角度打孔,并且对于已知的距离/半径,在圆的边缘获得一个点。在地图方面,角度 0 将为您提供圆心正东的圆上的点。正角绕中心逆时针旋转。

在代码中:

-(CLLocation*)locationForAngle:(float)angle fromCenterLocation:(CLLocation *)center withDistance:(float)distance {
    //angle must be in radians
    float longitude = distance * cosf(angle) - center.coordinate.longitude;
    float latitude = distance * sinf(angle) - center.coordinate.latitude;
    return [[CLLocation alloc] initWithLatitude:latitude longitude:longitude];
}

编辑:我不小心删除了一些术语

【讨论】:

  • 你的locationForAngle: 方法根本没有使用给定的center 参数,所以肯定有问题...
  • 我修好了。我心不在焉地放弃了几个词
  • 添加为已接受,因为它与我在下面发布的内容基本相同,但更深入。
  • 这是一个好的开始,但是如果传入一个南半球的坐标,返回的坐标会转置到北半球。这个答案效果更好:stackoverflow.com/a/20241963/2269574
【解决方案2】:

我在此链接 Moving a CLLocation by x meters 上找到了我的答案,并将其移植到 Swift 中。

func locationWithBearing(bearing:Double, distanceMeters:Double, origin:CLLocationCoordinate2D) -> CLLocationCoordinate2D {
    let distRadians = distanceMeters / (6372797.6) // earth radius in meters

    let lat1 = origin.latitude * M_PI / 180
    let lon1 = origin.longitude * M_PI / 180

    let lat2 = asin(sin(lat1) * cos(distRadians) + cos(lat1) * sin(distRadians) * cos(bearing))
    let lon2 = lon1 + atan2(sin(bearing) * sin(distRadians) * cos(lat1), cos(distRadians) - sin(lat1) * sin(lat2))

    return CLLocationCoordinate2D(latitude: lat2 * 180 / M_PI, longitude: lon2 * 180 / M_PI)
}

摩根陈写道:

此方法中的所有数学运算都以弧度为单位。在开始时 为此,将 lon1 和 lat1 转换为弧度为 好吧。方位也是弧度。请记住,此方法需要考虑 考虑地球的曲率,您实际上并不需要这样做 适合小距离。

【讨论】:

  • 此方法中的所有数学运算都以弧度为单位。在方法开始时, lon1 和 lat1 也为此目的转换为弧度。方位也是弧度。请记住,此方法考虑了地球的曲率,对于小距离,您实际上不需要这样做。
猜你喜欢
  • 2016-02-03
  • 1970-01-01
  • 1970-01-01
  • 2010-12-13
  • 1970-01-01
  • 2011-09-16
  • 1970-01-01
  • 2018-04-01
  • 2016-01-25
相关资源
最近更新 更多