如何创建图像叠加并添加到MKMapView?

时间:2011-03-12 16:23:50

标签: iphone cocoa-touch mkmapview

我正在尝试学习MapKit,现在正尝试将图像添加为地图视图的叠加层。 我似乎无法找到任何示例代码来帮助解释如何执行此操作。

你们可以帮助我们如何创建MKOverlay并将其添加到MKMapKit

提前致谢..

4 个答案:

答案 0 :(得分:25)

以下是如何将UIImage设置为MKMapView叠加层的示例。一些参数(坐标和图像路径)是固定的,但我猜想代码可以很容易地改变。

创建符合MKOverlay的类:

MapOverlay.h

@interface MapOverlay : NSObject <MKOverlay> {

}

- (MKMapRect)boundingMapRect;
@property (nonatomic, readonly) CLLocationCoordinate2D coordinate;

@end

MapOverlay.m

@implementation MapOverlay

- (id)initWithCoordinate:(CLLocationCoordinate2D)coordinate {
    self = [super init];
    if (self != nil) {


    }
    return self;
}

- (CLLocationCoordinate2D)coordinate
{
    CLLocationCoordinate2D coord1 = {
        37.434999,-122.16121
    };

    return coord1;
}

- (MKMapRect)boundingMapRect
{

    MKMapPoint upperLeft = MKMapPointForCoordinate(self.coordinate);

    MKMapRect bounds = MKMapRectMake(upperLeft.x, upperLeft.y, 2000, 2000);
    return bounds;
}


@end

创建一个符合MKOverlayView的类:

MapOverlayView.h

@interface MapOverlayView : MKOverlayView {

}

@end

MapOverlayView.m

@implementation MapOverlayView

- (void)drawMapRect:(MKMapRect)mapRect
          zoomScale:(MKZoomScale)zoomScale
          inContext:(CGContextRef)ctx
{

    UIImage *image          = [[UIImage imageNamed:@"image.png"] retain];

    CGImageRef imageReference = image.CGImage;

    MKMapRect theMapRect    = [self.overlay boundingMapRect];
    CGRect theRect           = [self rectForMapRect:theMapRect];
    CGRect clipRect     = [self rectForMapRect:mapRect];

    CGContextAddRect(ctx, clipRect);
    CGContextClip(ctx);

    CGContextDrawImage(ctx, theRect, imageReference);

    [image release]; 

}


@end

将叠加层添加到MKMapView:

MapOverlay * mapOverlay = [[MapOverlay alloc] init];
[mapView addOverlay:mapOverlay];
[mapOverlay release];

在mapView委托上,实现viewForOverlay:

- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay {

    MapOverlay *mapOverlay = overlay;
    MapOverlayView *mapOverlayView = [[[MapOverlayView alloc] initWithOverlay:mapOverlay] autorelease];

    return mapOverlayView;

}

希望它有所帮助!

答案 1 :(得分:2)

文档:

示例代码:

答案 2 :(得分:0)

在搜索我的问题的解决方案时,我不断回到这个问题,here以及here

他们都在回答我需要回答的问题,但反之亦然。

我需要确定UIView,即我的MapView上的绘制方格是否包含地图引脚,如果它确实让我知道,那么我可以删除它或选择它等。

最后,在尝试将我的UIView转换为某些MKCoordinateRegion或类似之后,我认为向后工作。我没有将我的UIView或方块变成地图疯狂,而是将引脚​​转换为简单的CGPoints并做了一个简单的Rect包含点。最终成为我的解决方案......大约2小时后!

希望这有助于某人下线

 func findMapPinsWithinBox() {

    guard let myBox = myBox else { return } // some UIView you have drawn or placed on map

    let visibleMapRect = mapView.visibleMapRect
    let visibleAnnotations =  mapView.annotationsInMapRect(visibleMapRect)

    for pin in visibleAnnotations {

        // depending on design you may need to do some casting here
        // ie let pin = pin as! MyMapAnnotation

        let pinsCGPoint = mapView.convertCoordinate(pin.coordinate, toPointToView: self.view)

        if myBox.frame.contains(pinsCGPoint) {
            print("Pin Found within the Box")
            // select pin or delete etc
        }
    }
}

答案 3 :(得分:-1)

从仅查看Apple的MKOverlay协议文档来看,它看起来并不复杂。只需创建一个类来完成计算叠加层所需的任何内容,并确保它符合该协议。这意味着您必须拥有coordinateboundingMapRect属性以及intersectsMapRect:的实现。 Apple文档解释了这一切。

查看Apple的HazardMap示例代码。它使用您想要的自定义叠加视图来在叠加层中显示图像。您只需在mapView:viewForOverlay:类中实现MKMapViewDelegate并返回MKOverlayView子类的新实例,即可在屏幕上绘制自定义叠加层。