我需要绘制线条来展示苹果地图上的货物运输。为了澄清起点和终点,我在目的地一侧画了一个小箭头。箭头是单独绘制的,但在一个案例中它是相反的。
>-->-->-->-
而不是
<--<--<--<-
我使用MKMapView和MKPolyline绘制线条。我正在使用MKOverlay添加方向箭头。我遵循的步骤是,
计算
的方位资料来源: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
}
旋转箭头图像并将其添加为地图叠加层。在大多数情况下,正确计算方向,但是,当我选择下面显示的线时,方向显示为180相反。它始于澳大利亚悉尼,最后在美国丹佛
当试图在mapView.setVisibleMapRect
中显示这两个位置的区域时,不会显示这些区域,mapview会尝试显示从悉尼(澳大利亚)到丹佛(美国)通过亚洲和欧洲的区域,同时它应显示我上面附上的地图区域。如果您有优化建议,请随时提及。
我认为这可能是原因,方向应沿红线计算,但沿绿线计算。通过连接地图中的相同位置坐标来绘制两条线。任何已知的解决方法吗?
答案 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
警告:旋转地图时,此计算会出错