计算MKMapView中的方位在穿过180经线时给出错误的值

时间:2018-05-21 11:02:36

标签: ios swift mapkit mkmapview

我需要绘制线条来展示苹果地图上的货物运输。为了澄清起点和终点,我在目的地一侧画了一个小箭头。箭头是单独绘制的,但在一个案例中它是相反的。

>-->-->-->- 

而不是

<--<--<--<-

我使用MKMapView和MKPolyline绘制线条。我正在使用MKOverlay添加方向箭头。我遵循的步骤是,

  1. 计算

    的方位

    资料来源:CLLocationCoordinate2D(纬度:-33.8392932,经度:151.21519799999999)  目的地:CLLocationCoordinate2D(北纬:39.645516999999998,经度:-104.598724)

    使用以下功能

    open static func getDirectionOf( _ supplyLineWithCoordinates: [CLLocationCoordinate2D]) -> CGFloat {
    guard let sourceCoordniate = supplyLineWithCoordinates.first,
        let destinationCoordniate = supplyLineWithCoordinates.last  else {
            fatalError("Coordinates of supply line not found")
    }
    let sourcePoint: MKMapPoint = MKMapPointForCoordinate(sourceCoordniate)
    let destinationPoint: MKMapPoint = MKMapPointForCoordinate(destinationCoordniate)
    let x: Double = destinationPoint.x - sourcePoint.x
    let y: Double = destinationPoint.y - sourcePoint.y
    var arrowDirection = CGFloat(fmod(atan2(y, x), 360.0))
    if arrowDirection < 0.0 {
        arrowDirection += 2 * .pi
    }
    return arrowDirection 
    

    }

  2. 旋转箭头图像并将其添加为地图叠加层。在大多数情况下,正确计算方向,但是,当我选择下面显示的线时,方向显示为180相反。它始于澳大利亚悉尼,最后在美国丹佛

  3. enter image description here

    当试图在mapView.setVisibleMapRect中显示这两个位置的区域时,不会显示这些区域,mapview会尝试显示从悉尼(澳大利亚)到丹佛(美国)通过亚洲和欧洲的区域,同时它应显示我上面附上的地图区域。如果您有优化建议,请随时提及。

    我认为这可能是原因,方向应沿红线计算,但沿绿线计算。通过连接地图中的相同位置坐标来绘制两条线。任何已知的解决方法吗?

    enter image description here

1 个答案:

答案 0 :(得分:0)

我通过将坐标转换为CGPoint然后计算点之间的方位,以一种肮脏的方式解决了它。

let destinationPoint = mapView.convert(destination, toPointTo: nil)
let sourcePoint = mapView.convert(source, toPointTo: nil)

let bearing = atan2(sourcePoint.y - destinationPoint.y, sourcePoint.x - destinationPoint.x) - .pi

警告:旋转地图时,此计算会出错