MKMapCamera 改变航向以查看不同的地图中心

MKMapCamera changing heading to look at different map center

我正在尝试使用 MKMapViewMKMapCamera。到目前为止,我能够设置所有内容并配置 3D 地图 mode/flyover。 我以纽约市的帝国大厦作为地图的中心,并使用构造函数设置我的 MKMapCamera:

public init(lookingAtCenterCoordinate centerCoordinate:
   CLLocationCoordinate2D, fromDistance distance: CLLocationDistance, 
   pitch: CGFloat, heading: CLLocationDirection)

所以我现在可以在中央正确地看到帝国大厦了。现在我希望能够将我的 MKMapCamera 的 'heading' (CLLocationDirection) 更改为指向不同的方向:这意味着帝国大厦不在中心.

现在,如果我更改相机的航向,它实际上会四处移动相机,但仍会将帝国大厦保持在我的 MKMapView 的中心。

查看各种 API,我找不到 API 可以用于 'recompute' 新的 MKMapView 中心更改标题。

我想获得与当前 MKMapView 相反的行为,我希望我的 MKMapCamera 固定 地图中心根据我指定的航向移动。

实现该目标的正确方法是什么?

当您更改注视地图中心的 MKMapCamera 对象的航向时,您正在更改相机围绕该中心点的旋转角度。想象一下,相机用一根绳子系在中心点上。相机只能围绕中心点做圆周运动。相机围绕中心点移动的距离由相机的航向控制。在您的示例中,中心点是帝国大厦,因此更改摄像机的航向将使摄像机绕着帝国大厦移动一圈,同时保持摄像机朝向建筑物。

如果我对您的要求理解正确,您希望保持相机位置固定,并使用相机的航向更改地图中心显示的位置。为此,您需要为地图计算一个新的中心坐标。新的中心坐标将是以您的相机为中心的假想圆的圆周上的一个点。圆的半径是地图中心点到相机的距离。

此计算使用相机的位置、相机的航向和相机的距离来计算将作为地图新中心的纬度和经度坐标。 GreatCircle is an Objective-C library that provides the locationWithBearing:distance: method as an extension of CLLocation 执行您需要的计算:

- (nonnull CLLocation *)locationWithBearing:(CLLocationDirection)bearing
                                   distance:(CLLocationDistance)distance;

因此,根据相机的位置 c、航向(方位角)h(以度为单位)和距离 d(以米为单位),新的中心地图 m 将是(在 Swift 中):

let m = c.locationWithBearing(h, distance: d)