Come posso creare un’immagine sovrapposta e aggiungerla a MKMapView?

Sto cercando di imparare MapKit e ora sto provando ad aggiungere un’immagine come una sovrapposizione alla vista mappa. Non riesco a trovare alcun codice di esempio per aiutare a spiegare come farlo.

Ragazzi, potete aiutarmi come creare MKOverlay e aggiungerli a MKMapKit .

Grazie in anticipo..

Ecco un esempio su come impostare un UIImage su un overlay MKMapView . Alcuni parametri (coordinate e percorso dell’immagine) sono fissi, ma il codice può essere facilmente modificato, credo.

Crea una class conforms a MKOverlay :

MapOverlay.h

 @interface MapOverlay : NSObject  { } - (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 

Crea una class conforms a 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 

Aggiungi la sovrapposizione a MKMapView:

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

Sul delegato mapView, implementare viewForOverlay:

 - (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id )overlay { MapOverlay *mapOverlay = overlay; MapOverlayView *mapOverlayView = [[[MapOverlayView alloc] initWithOverlay:mapOverlay] autorelease]; return mapOverlayView; } 

Spero che sia d’aiuto!

Documentazione:

  • Le funzioni di MKMapView per gestire gli overlay consentono di aggiungerli a una visualizzazione mappa.
  • MKOverlay è il protocollo a cui deve essere conforms l’object di sovrapposizione.
    • MKPolygon , MKPolyLine , MKCircle implementano questo protocollo per forms semplici.
  • MKOverlayView è usato per disegnare effettivamente la sovrapposizione; esistono sottoclassi per ognuna delle forms semplici sopra menzionate.

Codice d’esempio:

  • HazardMap
  • KMLViewer

Nella ricerca di una soluzione per il mio problema, continuo a tornare a questa domanda, e qui e anche qui

Stavano tutti rispondendo alla domanda a cui avevo bisogno di rispondere, ma al contrario.

Avevo bisogno di determinare se un UIView, cioè un quadrato di pareggio sul mio MapView contiene un pin di mappa, se lo fa fammi sapere così posso rimuoverlo o selezionarlo ecc.

Alla fine, dopo aver provato a convertire il mio UIView in qualche MKCoordinateRegion o simili, ho pensato di lavorare all’indietro. Invece di trasformare il mio UIView o quadrato in follia mappa, ho trasformato i pin in semplici CGPoints e ho fatto un semplice Rect contiene punti. Che ha finito per essere la mia soluzione .. dopo circa 2 ore!

Spero che questo aiuti qualcuno in prima linea

  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 } } } 

Solo guardando la documentazione di Apple per il protocollo MKOverlay , non sembra molto complesso. Basta fare una lezione per fare tutto il necessario per calcolare l’overlay e assicurarsi che sia conforms a quel protocollo. Ciò significa che devi avere le proprietà coordinate e boundingMapRect e un’implementazione per intersectsMapRect: I documenti Apple spiegano tutto.

Dai un’occhiata al codice di esempio HazardMap di Apple. Usa una vista sovrapposta personalizzata come vuoi fare per visualizzare un’immagine nell’overlay. È sufficiente implementare mapView:viewForOverlay: nella class MKMapViewDelegate e restituire una nuova istanza della sottoclass di MKOverlayView per ottenere la sovrapposizione personalizzata disegnata sullo schermo.