Objective c 将MKMapView渲染为NSImage

Objective c 将MKMapView渲染为NSImage,objective-c,cocoa,maps,mkmapview,render,Objective C,Cocoa,Maps,Mkmapview,Render,我正在为我的四架直升机开发一个导航系统,我需要将MKMapView中显示的航路点路线渲染成NSImage,以便进一步使用 到目前为止,我的情况如下: 正如您可以从中看到的,MKMapView是NSView的子类,因此我能够再次将其子类化以实现鼠标事件等 一切正常,最后一个目标是将该视图渲染到NSImage以供进一步使用,例如通过自己的图像浏览喜爱的路线 我对此做了一些研究,但没有找到我想要的 我能够用这种方法渲染地图,但没有注释/覆盖 - (NSImage *)captureMapView

我正在为我的四架直升机开发一个导航系统,我需要
MKMapView
中显示的航路点路线渲染成
NSImage
,以便进一步使用

到目前为止,我的情况如下:


正如您可以从中看到的,
MKMapView
NSView
的子类,因此我能够再次将其子类化以实现鼠标事件等

一切正常,最后一个目标是将该视图渲染到
NSImage
以供进一步使用,例如通过自己的图像浏览喜爱的路线


我对此做了一些研究,但没有找到我想要的

我能够用这种方法渲染地图,但没有注释/覆盖

- (NSImage *)captureMapView {

    __block NSImage *image;

    /* Note : self is my custom subclass of MKMapKit, where everything is */
    MKMapSnapshotOptions *options = [[MKMapSnapshotOptions alloc] init];
    options.region = self.region;
    options.size = self.frame.size;

    MKMapSnapshotter *snapshotter = [[MKMapSnapshotter alloc] initWithOptions:options];

    [snapshotter startWithCompletionHandler:^(MKMapSnapshot *snapshot, NSError *error) {
        image = snapshot.image;

    }];

    return image;

}
输出:

可以看出,路线不在那里


更具体地说,圆圈由
MKPointAnnotation
s组成,路线为
MKPolyline
。注释(在我的例子中是圆圈)是通过
MKMapKit
方法
-addAnnotation:
添加的,而路由是通过
-addOverlay:
添加的

我肯定错过了一些东西。 谢谢你的帮助



尽管我认为从照片上看这已经足够明显了,但我正在开发10.11.4操作系统,10.8之前的Objective-C
bitmapImageRepForCachingDisplayInRect:
运行良好。似乎在这个版本之后,它停止了使用层备份视图。 请尝试以下操作:

+ (NSImage *)cacheImageForView:(NSView *)aView
{
    NSRect originRect = [aView convertRect:[aView bounds] toView:[[aView window] contentView]];

    NSRect rect = originRect;
    rect.origin.y = 0;
    rect.origin.x += [aView window].frame.origin.x;
    rect.origin.y += [[aView window] screen].frame.size.height - [aView window].frame.origin.y - [aView window].frame.size.height;
    rect.origin.y += [aView window].frame.size.height - originRect.origin.y - originRect.size.height;

    CGImageRef cgimg = CGWindowListCreateImage(rect,
                                           kCGWindowListOptionIncludingWindow,
                                           (CGWindowID)[[aView window] windowNumber],
                                           kCGWindowImageDefault);
    return [[NSImage alloc] initWithCGImage:cgimg size:[aView bounds].size];
}

我们将尽快测试它。同时,无论如何,谢谢你!很高兴能提供帮助,很高兴我看到了关于无人机的这样的项目,我正在考虑自己建造一台FPV250赛车。顺便问一下,当电池耗尽时,你是如何处理这种情况的?嗯,软件功能强大,真的很强大。我可以得到电池电压并控制它。如果低于某一水平,自动程序将使无人机返回。无论如何,这是一个多功能地面站,我将能够在一个混合模式飞行(基于GPS,基于操纵杆)。FPV始终处于活动状态。没有无线电发射机,所有东西都通过TCP/UDP流传输到服务器上,这就是无人机。祝你好运!请随意发表评论和录音,我很想看看。