如何正确旋转地图上的叠加层?

Posted

技术标签:

【中文标题】如何正确旋转地图上的叠加层?【英文标题】:How do you properly rotate an overlay on the map? 【发布时间】:2011-05-13 16:14:59 【问题描述】:

我为 ios 应用创建了一个包含几何形状的自定义叠加层。我想围绕它的中心(或者更确切地说是boundingMapRect的中心)旋转它。据我了解,使用 CGContextRotateCTM(contextRef, angle) 使用 boundingMapRect 的左上角作为原点旋转叠加层,所以如果我顺时针旋转我的叠加层少量,它会出现在它之前位置的下方和左侧。

我认为如果我可以捕获覆盖边界矩形的初始中心,然后是旋转后的中心,那么我可以计算坐标差并使用 CGContextTranslateCTM 重新定位覆盖。我的问题是中心位置在 CGContextRotateCTM 调用之前和之后是相同的。有什么方法可以强制该调用生效,以便我可以获得新的中心位置?有没有更好的方法来做到这一点?

我看到一些关于使用覆盖层的一半宽度和高度来重新定位的参考,但我不明白这有什么帮助,因为它是恒定的。

谢谢。

【问题讨论】:

【参考方案1】:

这是我的解决方案,在 swift 3 上运行:

假设centerPoint 是您想要旋转的CGPoint

let a = sqrt(pow(centerPoint.x, 2.0) + pow(centerPoint.y, 2.0))

let sub1 = (centerPoint.y / a) * cos(angle / 2.0)
let sub2 = (centerPoint.x / a) * sin(angle / 2.0)
let deltaX = -2 * a * sin((0 - angle) / 2.0) * (sub1 + sub2)

let sub3 = (centerPoint.x / a) * cos(angle / 2.0)
let sub4 = (centerPoint.y / a) * sin(angle / 2.0)
let deltaY = 2 * a * sin((0 - angle) / 2.0) * (sub3 - sub4)

context.translateBy(x: deltaX, y: deltaY)

context.rotate(by: angle)

【讨论】:

【参考方案2】:

您是否尝试过为旋转设置锚点?设置锚点后,旋转将围绕视图中心。

有点像:

[yourView.layer setAnchorPoint:CGPointMake( 0.5, 0.5 )]; // center of the view

有关详细信息,请参阅Apple docs。

【讨论】:

之后如何旋转它?而且您指向 Apple 文档的链接不存在。

以上是关于如何正确旋转地图上的叠加层?的主要内容,如果未能解决你的问题,请参考以下文章

地图组件上的自定义区域叠加层显示 ArcGis + GeoJson

cartopy:NOAA APT 图像上的地图叠加层

如何在 MKMapView 中将图钉和地图保持在移动叠加层上方的中心

自动布局指南:UIImagePickerController W /自定义叠加不会旋转

创建自定义地图叠加层(折线)[Mapbox]

需要在 IOS 的 mapview 上添加一个固定的叠加层