我正在尝试使用 MKMapView 和 MKMapCamera 。到目前为止,我能够设置所有内容并在3D模式/天桥中配置地图。 我以纽约帝国大厦的地图中心为例,用构造函数设置我的MKMapCamera:
public init(lookingAtCenterCoordinate centerCoordinate:
CLLocationCoordinate2D, fromDistance distance: CLLocationDistance,
pitch: CGFloat, heading: CLLocationDirection)
所以我现在可以正确地看到帝国大厦的中心。现在我想要的是改变标题'我的MKMapCamera的( CLLocationDirection )指向一个不同的方向:意味着没有帝国大厦的中心。
现在,如果我更改相机上的标题,它实际上会移动相机并仍然将帝国大厦保持在我的MKMapView的中心。
查看各种API,我无法找到可用于重新计算'的API。更改标题后,新的 MKMapView 中心。
我想得到当前 MKMapView 的相反行为,我希望 MKMapCamera 修复,其中地图的中心正按照我指定的标题移动。
实现这一目标的正确方法是什么?
答案 0 :(得分: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)