0

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

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

所以我现在可以清楚地看到帝国大厦的中心。现在我希望能够改变我的 MKMapCamera 的“标题”(CLLocationDirection)指向不同的方向:这意味着没有帝国大厦的中心。

现在,如果我改变相机上的航向,它实际上会移动相机并且仍然将帝国大厦保持在我的 MKMapView 的中心。

查看各种 API,我找不到在更改标题后可以使用哪些 API 来“重新计算”新的MKMapView中心。

我想获得当前MKMapView的相反行为,我希望将我的MKMapCamera固定在地图中心根据我指定的标题移动的地方。

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

4

1 回答 1

0

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

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

此计算使用相机的位置、相机的航向和相机的距离来计算将成为地图新中心的纬度和经度坐标。GreatCircle是一个 Objective-C 库,提供该locationWithBearing:distance:方法作为CLLocation执行您需要的计算的扩展:

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

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

let m = c.locationWithBearing(h, distance: d)
于 2016-08-17T10:24:10.153 回答