iPhone MKMapView - Проблемы MKPolygon - PullRequest
9 голосов
/ 29 марта 2011

Я пытаюсь нанести MKPolygon на MKMapView в iOS 4.0. У меня есть NSArray, который содержит пользовательские объекты, которые включают свойства для широты / долготы. У меня есть пример кода ниже:

- (void)viewDidLoad {
    [super viewDidLoad];
    dataController = [[DataController alloc] initWithMockData];
    coordinateData = [dataController getCordData];

    CLLocationCoordinate2D *coords = NULL;
    NSUInteger coordsLen = 0;

    /* How do we actually define an array of CLLocationCoordinate2d? */

    MKPolygon *polygon = [MKPolygon polygonWithCoordinates:coords count:coordsLen];
    [mapView addOverlay: polygon];

}

- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay
{
    MKPolygonView *polygonView = [[MKPolygonView alloc] initWithPolygon: routePolygon]; 
    NSLog(@"Attempting to add Overlay View");   
    return polygonView;
}

Я так понимаю, что:

  1. Мне нужно создать MKPolygon
  2. Добавить наложение в MapView
  3. Этот поворот вызовет создание MKPolygonView.

Мой вопрос заключается в том, как мне взять свой пользовательский объект, содержащийся в NSArray (координатные данные), и преобразовать эти объекты в массив CLLocationCoordinate2d, чтобы полигон мог интерпретировать и визуализировать? Я не уверен, как CLLocationCoordinate2d даже массив? Может кто-нибудь прояснить это.

Ответы [ 4 ]

17 голосов
/ 29 марта 2011

Метод polygonWithCoordinates хочет массив C структур CLLocationCoordinate2D. Вы можете использовать malloc для выделения памяти для массива (и free для освобождения памяти). Прокрутите ваш NSArray и установите его для каждого элемента массива struct.

Например:

coordsLen = [coordinateData count];
CLLocationCoordinate2D *coords = malloc(sizeof(CLLocationCoordinate2D) * coordsLen);
for (int i=0; i < coordsLen; i++)
{
    YourCustomObj *coordObj = (YourCustomObj *)[coordinateData objectAtIndex:i];
    coords[i] = CLLocationCoordinate2DMake(coordObj.latitude, coordObj.longitude);
}
MKPolygon *polygon = [MKPolygon polygonWithCoordinates:coords count:coordsLen];
free(coords);
[mapView addOverlay:polygon];

Метод viewForOverlay должен выглядеть следующим образом:

- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay
{
    MKPolygonView *polygonView = [[[MKPolygonView alloc] initWithPolygon:overlay] autorelease]; 
    polygonView.lineWidth = 1.0;
    polygonView.strokeColor = [UIColor redColor];
    polygonView.fillColor = [UIColor greenColor];
    return polygonView;
}
2 голосов
/ 12 ноября 2014

Для iOS 7.0 и более поздних версий мы должны использовать MKPolygonRenderer вместо MKPolygonView,

- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay
{
   MKPolygonRenderer * polygonView = [[MKPolygonRenderer alloc] initWithPolygon:overlay];
   polygonView.fillColor   = [UIColor greenColor];
   polygonView.strokeColor = [UIColor redColor] ;
   polygonView.lineWidth   = 1.0;
   return polygonView;
}
0 голосов
/ 18 июня 2019

Код в Swift 4

Для координат в json:

{
"coordinates": [
    [-73.947676,40.660297],
    [-73.947264,40.656437],
    [-73.947159,40.655594],
    [-73.946479,40.6491],
    [-73.947467,40.649039]
}

Прочитать координаты:

let coordinates = json["coordinates"] as! [[Double]] 

Создать массив точек:

var locationCoordinates = [CLLocationCoordinate2D]()    
for coordinate in coordinates{
   locationCoordinates.append(CLLocationCoordinate2DMake(coordinate.last!, coordinate.first!))
}

Создайте полигон и добавьте его на карту:

map.addOverlay(MKPolyline(coordinates: locationCoordinates, 
                                count: locationCoordinates.count))

Убедитесь, что ваш VC соответствует MKMapViewDelegate

class ViewController: UIViewController, MKMapViewDelegate { ... }

И добавить этот метод:

func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
    if overlay is MKPolygon {
        let polygonView = MKPolygonRenderer(overlay: overlay)
        polygonView.fillColor = .black
        polygonView.strokeColor = .red
        polygonView.lineWidth = 2.0

        return polygonView

    return MKOverlayRenderer()
}
0 голосов
/ 16 января 2017

coordinatesArray;// Ваш массив, содержащий координаты

for (int i=0; i <[coordinatesArray count]; i++) 
{
   float latitude  = [coordinatesArray[i][@"latitude"] floatValue];
   float longitude  = [coordinatesArray[i][@"longitude"] floatValue];
   MKPolygon *polygon;
   CLLocationCoordinate2D coordinates[[coordinatesArray count]];
   coordinates[i] = CLLocationCoordinate2DMake(latitude , longitude);
   polygon = [MKPolygon polygonWithCoordinates:coordinates count:[coordinatesArray count]];
   [self.mapView addOverlay:polygon];
}

// Ваш "argumentsArray" - это массив, содержащий словарь с несколькими значениями ключей широты и долготы.// Надеюсь, это поможет вам.

...