ios ios5 mkmapview mkannotationview mkoverlay

Dibuje un círculo de 1000 m de radio alrededor de la ubicación de los usuarios en MKMapView



ios5 mkannotationview (9)

Es fácil agregar un círculo. Conforme a MKMapViewDelegate. Sigue los siguientes pasos

Paso 1 :

CLLocationCoordinate2D center= {self.locationManager.location.coordinate.latitude, self.locationManager.location.coordinate.longitude}; // Add an overlay MKCircle *circle= [MKCircle circleWithCenterCoordinate:center radius: 20000];//your distance like 20000(like meters) [myMapView addOverlay:circle];

Paso 2 :

- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id<MKOverlay>)overlay { MKCircleView *C_View = [[MKCircleView alloc] initWithOverlay:overlay]; [C_View setFillColor:[UIColor lightGrayColor]]; [C_View setStrokeColor:[UIColor blackColor]]; [C_View setAlpha:0.5f]; return C_View; }

(Usando iOS 5 y Xcode 4.2)

Tengo un MKMapView y quiero dibujar un círculo de 1000 m de radio alrededor de la ubicación del usuario.

En la superficie, parece que implementar el método delegado mapView:viewForAnnotation: map view, y agregar un MKAnnotationView personalizado para la ubicación de los usuarios, sería una solución perfecta. Se vería algo como esto:

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation { // If it''s the user location, return my custom MKAnnotationView. if ([annotation isKindOfClass:[MKUserLocation class]]) { return myCustomAnnotationView; } else { return nil; } }

Sin embargo, las anotaciones en el mapa no se escalan al acercar o alejar el mapa.

Así que intenté agregar una superposición (porque las superposiciones se escalan con el mapa), usando la clase MKCircle y configurando sus coordenadas con las últimas coordenadas de mi delegado de la vista locationManger / map. Sin embargo, como la MKCircle de MKCircle de MKCircle es de solo lectura, tengo que eliminar la superposición y luego agregar una nueva cada vez que el usuario se mueva. Causando un notable parpadeo a medida que sucede.

¿Hay alguna manera de hacer una escala de anotación sin problemas a medida que la vista del mapa se escala y se reduce? ¿O hay una buena manera de hacer que una superposición se mueva sin problemas con los cambios en la ubicación de los usuarios?

Estaría muy agradecido por su ayuda :)


Intente una superposición personalizada. Agregue esto en viewDidLoad:

MKCircle *circle = [MKCircle circleWithCenterCoordinate:userLocation.coordinate radius:1000]; [map addOverlay:circle];

userLocation se puede obtener almacenando el MKUserLocationAnnotation como una propiedad. Luego, para dibujar realmente el círculo, coloque esto en el delegado de la vista de mapa:

- (MKOverlayRenderer *)mapView:(MKMapView *)map viewForOverlay:(id <MKOverlay>)overlay { MKCircleRenderer *circleView = [[MKCircleRenderer alloc] initWithOverlay:overlay]; circleView.strokeColor = [UIColor redColor]; circleView.fillColor = [[UIColor redColor] colorWithAlphaComponent:0.4]; return circleView; }


No entendí la respuesta. Así que aquí está la respuesta más clara :

Es bastante fácil agregar un círculo. Conforme a MKMapViewDelegate

@interface MyViewController : UIViewController <MKMapViewDelegate> @property (weak, nonatomic) IBOutlet MKMapView *mapView; @end

En viewDidLoad, cree una anotación de círculo y agréguela al mapa:

CLLocationCoordinate2D center = {39.0, -74.00}; // Add an overlay MKCircle *circle = [MKCircle circleWithCenterCoordinate:center radius:150000]; [self.mapView addOverlay:circle];

Luego implementa mapView: viewForOverlay: para devolver la vista.

- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id<MKOverlay>)overlay { MKCircleView *circleView = [[MKCircleView alloc] initWithOverlay:overlay]; [circleView setFillColor:[UIColor redColor]]; [circleView setStrokeColor:[UIColor blackColor]]; [circleView setAlpha:0.5f]; return circleView; }

Pero si desea que el círculo siempre tenga el mismo tamaño, sin importar el nivel de zoom, tendrá que hacer algo diferente. Como usted dice, en regionDidChange: animated :, obtenga la latitudeDelta, luego cree un nuevo círculo (con un radio que se ajuste al ancho), elimine el antiguo y agregue el nuevo.

Nota mía: no olvide conectar mapview con su delegado de controlador de vista. De lo contrario, no se llamará a viewForOverlay.


Swift 3 / Xcode 8 aquí:

func addRadiusCircle(location: CLLocation){ if let poll = self.selectedPoll { self.mapView.delegate = self let circle = MKCircle(center: location.coordinate, radius: 10) self.mapView.add(circle) } } func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer { if overlay is MKCircle { let circle = MKCircleRenderer(overlay: overlay) circle.strokeColor = UIColor.red circle.fillColor = UIColor(red: 255, green: 0, blue: 0, alpha: 0.1) circle.lineWidth = 1 return circle } else { return MKPolylineRenderer() } }

Entonces llama así:

self.addRadiusCircle(location: CLLocation(latitude: YOUR_LAT_HERE, longitude: YOUR_LNG_HERE))


Todo lo que hice fue: Después de mostrar la ubicación en el kit de mapa, se llama la siguiente función al final.

@IBOutlet weak var mapView: GMSMapView! var cirlce: GMSCircle! override func viewDidLoad() { super.viewDidLoad() mapView.delegate = self circleview(redius: 5000) } //used this func to draw the circle func circleview(redius:Double) { let circleCenter = CLLocationCoordinate2D(latitude: 13.3450223, longitude: 74.7512519) cirlce = GMSCircle(position: circleCenter, radius: redius) cirlce.fillColor = UIColor(red: 230.0/255.0, green: 230.0/255.0, blue: 250.0/255.0, alpha:1.0) cirlce.strokeColor = .blue cirlce.strokeWidth = 2 cirlce.map = mapView }



Una versión actualizada para iOS 8.0 usando Swift.

import Foundation import MapKit class MapViewController: UIViewController, CLLocationManagerDelegate, MKMapViewDelegate{ var locationManager: CLLocationManager = CLLocationManager() @IBOutlet var mapView: MKMapView! override func viewDidLoad() { super.viewDidLoad() // We use a predefined location var location = CLLocation(latitude: 46.7667 as CLLocationDegrees, longitude: 23.58 as CLLocationDegrees) addRadiusCircle(location) } func addRadiusCircle(location: CLLocation){ self.mapView.delegate = self var circle = MKCircle(centerCoordinate: location.coordinate, radius: 10000 as CLLocationDistance) self.mapView.addOverlay(circle) } func mapView(mapView: MKMapView!, rendererForOverlay overlay: MKOverlay!) -> MKOverlayRenderer! { if overlay is MKCircle { var circle = MKCircleRenderer(overlay: overlay) circle.strokeColor = UIColor.redColor() circle.fillColor = UIColor(red: 255, green: 0, blue: 0, alpha: 0.1) circle.lineWidth = 1 return circle } else { return nil } } }


Usando MKCircleRenderer , puedes agregarlo de la siguiente manera.

Declare las variables de nivel de clase para la superposición y su procesador:

MKCircle circleOverlay; MKCircleRenderer circleRenderer;

Implemente MKMapView.OverlayRenderer para proporcionar un renderizador para la superposición:

mapView.OverlayRenderer = (m, o) => { if(circleRenderer == null) { circleRenderer = new MKCircleRenderer(o as MKCircle); circleRenderer.FillColor = UIColor.Green; circleRenderer.Alpha = 0.5f; } return circleRenderer; };

Cree una superposición, en este caso un círculo ubicado cerca de la ubicación del usuario (latitud, longitud), y agréguelo al mapa:

var coords = new CLLocationCoordinate2D(39.11, 30.13); //user location circleOverlay = MKCircle.Circle (coords, 1000); mapView.AddOverlay (circleOverlay);


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

está obsoleto desde iOS 4.0