0

我在另一个主题中找到了我的问题的答案,并根据我的需要更改了功能。但我没有达到预期的结果。我使用这个功能,我想得到半径上的点。

   func radiusSearchPoint(coordinate: CLLocationCoordinate2D, radius: CLLocationDistance) -> CLLocationCoordinate2D {

    let earthRadius = 6_378_100.0
    let π = Double.pi
    let lat = coordinate.latitude * π / 180.0
    let lng = coordinate.longitude * π / 180.0

    let t: Double = 0

    let pointLat = lat + (radius / Double(earthRadius)) * sin(t)
    let pointLng = lng + (radius / Double(earthRadius)) * cos(t)
    let point = CLLocationCoordinate2D(latitude: pointLat * 180 / π, longitude: pointLng * 180 / π)

    return point
}

红线由两点组成:圆心和函数执行后收到的点,但第二个点应该在圆上

我怎样才能在圆的半径上正确地得到这个点?

4

1 回答 1

0

欢迎来到stackoverflow。检查你的函数值,在我看来红线应该在圆圈内结束(而不是在圆圈上)。

您遇到的问题是用于计算经度角度的半径随纬度而变化。随着纬度角的增加,您定义的恒定纬度圆圈越来越小。纬度圆的半径为 R * cos(lat)。其中R是地球的半径。改成pointLng这样:

let pointLng = lng + (radius / Double(earthRadius * cos(lat))) * cos(t)

还值得一提的是,地球不是一个球体,所以这个计算会出错,在两极附近会变得更糟。要准确地执行此操作,您需要转换为ECEF坐标以获得准确的半径值,然后再转换回 WGS84(纬度、经度)。

于 2020-03-12T11:46:54.640 回答