iPhone MKMapView - Проблемы MKPolygon

Я пытаюсь построить 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. Мне нужно создать МК Полигон
  2. Добавьте наложение в MapView
  3. Это, в свою очередь, вызовет создание MKPolygonView.

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

3 ответа

Решение

Метод 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;
}

Для 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;
}

Код в 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()
}

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" - это массив, содержащий словарь с несколькими значениями ключей широты и долготы. // Надеюсь, это поможет вам.

Другие вопросы по тегам