Добавление GroundOverlay из KML в MKMapView с вращением

У меня есть приложение iOS, где я хочу прочитать KML-файл, содержащий GroundOverlays. Объект GroundOverlay содержит координаты изображения-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); } 

Так я и решил это решить. Во-первых, 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); } 

Прошло довольно много времени с тех пор, как я написал этот код, и я не помню больше деталей, чем это, но поскольку кто-то просто поддержал этот вопрос, я подумал, что, по крайней мере, отправлю код, где я его решил. Надеюсь, поможет! 🙂

Interesting Posts
Давайте будем гением компьютера.