我有一个iOS应用,我想阅读包含GroundOverlays的KML文件。 GroundOverlay包含一个image-href,北,南,东,西坐标,以及一个旋转。
我已按照本教程(http://www.raywenderlich.com/30001/overlay-images-and-overlay-views-with-mapkit-tutorial)在地图上显示图像。我可以成功解析KML并正确显示非旋转图像。问题是,我不知道如何显示旋转的图像。
要旋转自己,我需要知道两件事:第一,如何在绘图代码中旋转图像。这个问题只是在iOS中旋转。其次,我需要知道KML坐标如何受到旋转的影响。北,南,东和西坐标是旋转或非旋转图像的坐标吗?
我已经广泛搜索了有关如何执行此操作的示例,但没有发现任何有用的内容。一些教程/代码的链接可以很棒!
KML的相关部分如下所示:
<GroundOverlay>
<Icon>
<href>http://developers.google.com/kml/documentation/images/etna.jpg</href>
</Icon>
<LatLonBox>
<north>37.91904192681665</north>
<south>37.46543388598137</south>
<east>15.35832653742206</east>
<west>14.60128369746704</west>
<rotation>-0.1556640799496235</rotation>
</LatLonBox>
</GroundOverlay>
我的绘图代码(我猜旋转应该在哪里):
- (void)drawMapRect:(MKMapRect)mapRect
zoomScale:(MKZoomScale)zoomScale
inContext:(CGContextRef)context {
CGImageRef imageReference = self.overlayImage.CGImage;
// TODO: rotate image by self.rotation degrees around center.
MKMapRect theMapRect = self.overlay.boundingMapRect;
CGRect theRect = [self rectForMapRect:theMapRect];
CGContextScaleCTM(context, 1.0, -1.0);
CGContextTranslateCTM(context, 0.0, -theRect.size.height);
CGContextDrawImage(context, theRect, imageReference);
}
答案 0 :(得分:2)
这就是我最终解决它的方式。首先,KML坐标是未旋转图像的坐标,因此没有必要做任何事情来使它们与旋转一起工作。这是完成的drawMapRect:zoomScale:inContext
- (void)drawMapRect:(MKMapRect)mapRect
zoomScale:(MKZoomScale)zoomScale
inContext:(CGContextRef)context {
CGImageRef imageReference = self.overlayImage.CGImage;
MKMapRect theMapRect = self.overlay.boundingMapRect;
CGRect theRect = [self rectForMapRect:theMapRect];
CGContextScaleCTM(context, 1.0, -1.0);
CGContextTranslateCTM(context, 0.0, -theRect.size.height);
// Translate to center of image. This is done to rotate around the center,
// rather than the edge of the picture
CGContextTranslateCTM(context, theRect.size.width / 2, theRect.size.height / 2);
// _rotation is the angle from the kml-file, converted to radians.
CGContextRotateCTM(context, _rotation);
// Translate back after the rotation.
CGContextTranslateCTM(context, -theRect.size.width / 2, -theRect.size.height / 2);
CGContextDrawImage(context, theRect, imageReference);
}
我写这段代码已经有一段时间了,我真的不记得比这更多的细节,但是因为有人刚刚提出这个问题,我想我至少会把代码发布到解决它的地方。希望能帮助到你! :)