MapKitを学習しようとしていますが、現在、画像をオーバーレイとしてマップビューに追加しようとしています。これを行う方法を説明するのに役立つサンプルコードが見つからないようです。
MKOverlay
sを作成してMKMapKit
に追加する方法を教えてください。
前もって感謝します..
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;
}
それが役に立てば幸い!
ドキュメンテーション:
サンプルコード:
私の問題の解決策を探すために、私はこの質問に戻ってきます、そして ここ そしてまた ここ
彼らは皆、私が答える必要のある質問に答えていましたが、逆でした。
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
}
}
}