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
}
Trate de usar el código del ejemplo de Apple Breadcrumb
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