Нарисуйте круг радиусом 1000 м вокруг местоположения пользователя в MKMapView - PullRequest
58 голосов
/ 30 января 2012

(с использованием iOS 5 и Xcode 4.2)

У меня есть MKMapView и я хочу нарисовать круг радиусом 1000 м вокруг местоположения пользователя.

На поверхностиКазалось бы, реализация mapView: viewForAnnotation: метод делегата представления карты и добавление пользовательского MKAnnotationView для местоположения пользователей, было бы идеальным решением.Это будет выглядеть примерно так:

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

Однако аннотации на карте не масштабируются при увеличении и уменьшении масштаба карты.

Итак, я попытался добавить наложение (потому что накладывает масштаб на карту), используя класс MKCircle и установив в его координатах самые последние координаты из моего делегата locationManger / map view,Однако поскольку свойство координат в MKCircle доступно только для чтения, мне приходится удалять наложение, а затем добавлять новое при каждом перемещении пользователя.Вызывая заметное мерцание, как это происходит.

Есть ли способ плавно масштабировать аннотации при увеличении и уменьшении вида карты?Или есть хороший способ плавного перемещения наложения с изменением местоположения пользователей?

Буду очень признателен за вашу помощь:)

Ответы [ 8 ]

79 голосов
/ 10 февраля 2012

Попробуйте пользовательское наложение.Добавьте это в viewDidLoad:

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

userLocation можно получить, сохранив MKUserLocationAnnotation в качестве свойства.Затем, чтобы нарисовать круг, поместите его в делегат вида карты:

- (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;
}
45 голосов
/ 25 сентября 2014

Обновленная версия для iOS 8.0 с использованием 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
        }
    }
}
17 голосов
/ 14 декабря 2016

Swift 3 / Xcode 8 здесь:

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

Тогда звоните так:

self.addRadiusCircle(location: CLLocation(latitude: YOUR_LAT_HERE, longitude: YOUR_LNG_HERE))
3 голосов
/ 30 января 2012

Попробуйте использовать код из Пример Apple Breadcrumb

2 голосов
/ 21 декабря 2014

Я не понял ответа Бенвада. Так вот, более понятный ответ :

Довольно просто добавить круг. Соответствует MKMapViewDelegate

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

В viewDidLoad создайте аннотацию круга и добавьте ее на карту:

CLLocationCoordinate2D center = {39.0, -74.00};

// Add an overlay
MKCircle *circle = [MKCircle circleWithCenterCoordinate:center radius:150000];
[self.mapView addOverlay:circle];

Затем реализуйте mapView: viewForOverlay: для возврата представления.

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

Но если вы хотите, чтобы круг всегда был одинакового размера, независимо от уровня масштабирования, вам придется сделать что-то другое. Как вы говорите, в regionDidChange: animated :, получите latitudeDelta, затем создайте новый круг (с радиусом, который соответствует ширине), удалите старый и добавьте новый.

Примечание от меня: не забудьте связать mapview с вашим представителем контроллера представления. В противном случае viewForOverlay не будет вызываться.

0 голосов
/ 10 октября 2018

Все, что я сделал, это, После отображения местоположения на карте, в конце вызывается функция ниже.

@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
  }
0 голосов
/ 14 сентября 2015
- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id<MKOverlay>)overlay

устарело с iOS 4.0

0 голосов
/ 02 сентября 2015

Круг легко добавить. Соответствует MKMapViewDelegate. следуйте ниже шагов ,,,

Шаг 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];

Шаг 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;
 }
...