2013-05-07 17 views
5

Ho un raggio e una posizione.Come sovrapporre un cerchio su una mappa iOS

Ecco come sto cercando di ottenere il rettangolo di delimitazione del cerchio.

- (MKMapRect)boundingMapRect{ 

    CLLocationCoordinate2D tmp; 
    MKCoordinateSpan radiusSpan = MKCoordinateRegionMakeWithDistance(self.coordinate, 0, self.radius).span; 
    tmp.latitude = self.coordinate.latitude - radiusSpan.longitudeDelta; 
    tmp.longitude = self.coordinate.longitude - radiusSpanSpan.longitudeDelta; 

    MKMapPoint upperLeft = MKMapPointForCoordinate(tmp); 
    MKMapRect bounds = MKMapRectMake(upperLeft.x, upperLeft.y, self.radius * 2, self.radius * 2); 

    return bounds; 
} 

MKMapRectMake(...) sembra voler misurare larghezza e altezza in Punti mappa. Come posso convertire il raggio in quello?

Alla fine mi sto rendendo in questo modo:

MKMapRect theMapRect = [self.overlay boundingMapRect]; 
CGRect theRect = [self rectForMapRect:theMapRect]; 
CGContextAddEllipseInRect(ctx, theRect); 
CGContextFillPath(ctx); 

Il raggio non sembra uguali metri sulla mappa alla fine, e anche la distanza non sembra essere misurata correttamente. Come farlo bene?

Sarei davvero grato per ogni suggerimento.

risposta

14

Si dovrebbe invece usare MKCircle. Fare qualcosa di simile:

CLLocationDistance fenceDistance = 300; 
CLLocationCoordinate2D circleMiddlePoint = CLLocationCoordinate2DMake(yourLocation.latitude, yourLocation.longitude); 
MKCircle *circle = [MKCircle circleWithCenterCoordinate:circleMiddlePoint radius:fenceDistance]; 
[yourMapView addOverlay: circle]; 

e adottare il metodo MKMapViewDelegate qui sotto e fare qualcosa del genere:

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

{ 
    MKCircleView *circleView = [[[MKCircleView alloc] initWithCircle:(MKCircle *)overlay] autorelease]; 
    circleView.fillColor = [[UIColor redColor] colorWithAlphaComponent:0.9]; 
    return circleView; 
} 
+0

Grazie, esattamente quello che stavo cercando :) – kadrian

+0

Nessun problema. Felice di aiutare! –

+0

Grazie. Funziona bene. – Raja

6

Per iOS7:

Uguale tdevoy in viewDidLoad:

CLLocationDistance fenceDistance = 300; 
CLLocationCoordinate2D circleMiddlePoint = CLLocationCoordinate2DMake(yourLocation.latitude, yourLocation.longitude); 
MKCircle *circle = [MKCircle circleWithCenterCoordinate:circleMiddlePoint radius:fenceDistance]; 
[yourMapView addOverlay: circle]; 

Ma il metodo delegate (perché mapView: viewForOverlay: è deprecato):

- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id <MKOverlay>)overlay 
{ 
    MKCircleRenderer *circleR = [[MKCircleRenderer alloc] initWithCircle:(MKCircle *)overlay]; 
    circleR.fillColor = [UIColor greenColor]; 

    return circleR; 
} 
Problemi correlati