web-dev-qa-db-ja.com

画像オーバーレイを作成してMKMapViewに追加するにはどうすればよいですか?

MapKitを学習しようとしていますが、現在、画像をオーバーレイとしてマップビューに追加しようとしています。これを行う方法を説明するのに役立つサンプルコードが見つからないようです。

MKOverlaysを作成してMKMapKitに追加する方法を教えてください。

前もって感謝します..

14
Jr Ntr Achanta

UIImageMKMapViewオーバーレイに設定する方法の例を次に示します。一部のパラメータ(座標と画像パス)は固定されていますが、コードは簡単に変更できると思います。

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;

}

それが役に立てば幸い!

25

ドキュメンテーション:

  • オーバーレイを管理するMKMapView関数 マップビューにオーバーレイを追加できるようにします。
  • MKOverlay は、オーバーレイオブジェクトが準拠する必要のあるプロトコルです。
  • MKOverlayView は、実際にオーバーレイを描画するために使用されます。上記の単純な形状ごとにサブクラスが存在します。

サンプルコード:

2
Anomie

私の問題の解決策を探すために、私はこの質問に戻ってきます、そして ここ そしてまた ここ

彼らは皆、私が答える必要のある質問に答えていましたが、逆でした。

UIView、つまりMapViewの正方形の描画にマップピンが含まれているかどうかを判断する必要がありました。含まれている場合は、削除または選択できるように通知されます。

最後に、UIViewをMKCoordinateRegionなどに変換しようとした後、逆方向に機能すると思いました。 UIViewまたは正方形をマップの狂気に変える代わりに、ピンを単純なCGPointに変え、単純なRectcontainsポイントを実行しました。それが私の解決策になりました..約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
        }
    }
}
0
DogCoffee