Cómo garantizar la visualización de superposiciones en iOS MapKit

He mirado varias publicaciones de StackOverflow y la documentation de Apple sobre cómo implementar superposiciones en MKMapView. Para mí, estoy interesado específicamente en mostrar objects MKPolygon en mi map. He descubierto que, fundamentalmente, el process se networkinguce a lo siguiente:

  • Enlace a los frameworks de MapKit y CoreLocation
  • Haga una salida a un object MKMapKit y declare el controller de vista como delegado
  • Declare una matriz CLLocationCoordinate2D que contenga los puntos de un polígono y cree un object MKPolygon con el método de class polygonWithCoordinates: count:
  • Llamar addOverlay: del map y pasar el object MKPolygon recién creado como el parámetro
  • Implementar (MKOverlayView *) mapView: (MKMapView *) mapView viewForOverlay: (id) overlay

Más tarde, probablemente tendré que mostrar 20-30 polígonos en un momento dado en el map. Sin embargo, en mi exploración de cómo mostrar superposiciones (ejemplos de testing de hardcoding en este momento, en lugar de leer en los datos de un file), he descubierto que puedo get algunas superposiciones para que aparezcan, pero no otras. Leyendo la guía de progtwigción de la conciencia de la location de Apple, encontré un ejemplo de un polígono superpuesto sobre el estado de Colorado. Eso funciono. Pero cuando traté de hacer un polígono que cubriera Kansas, no pude lograr que funcionara. Parece que cualquier polígono que intenté crear por mi count (el polígono de la Universidad Aeronáutica Embry-Riddle y el polígono de Kansas) no se mostrará, pero los que obtuve en línea funcionan perfectamente. Utilicé Google Earth para crear los polígonos y luego los exporté como files KML para get las coorderadas.

El código para la implementación de mi ViewController se encuentra a continuación. Solo trato de averiguar qué puede estar haciendo involuntariamente equivocadamente para crear este problema. Gracias de antemano por la ayuda.

#import "ViewController.h" #import <CoreLocation/CoreLocation.h> @interface ViewController () @end @implementation ViewController @synthesize mapView; - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. // Array of coordinates for polygon covering state of Colorado ... DISPLAYS PERFECTLY CLLocationCoordinate2D points[4]; points[0] = CLLocationCoordinate2DMake(41.000512, -109.050116); points[1] = CLLocationCoordinate2DMake(36.99892, -109.045267); points[2] = CLLocationCoordinate2DMake(36.993076, -102.041981); points[3] = CLLocationCoordinate2DMake(41.002371, -102.052066); MKPolygon *polygon = [MKPolygon polygonWithCoordinates:points count:4]; [mapView addOverlay:polygon]; [polygon release]; // Array of coordinates for polygon covering state of Kansas ... DOESN'T DISPLAY CLLocationCoordinate2D kansasPoints[9]; kansasPoints[0] = CLLocationCoordinate2DMake(-102.0595440241806, 39.99774930940907); kansasPoints[1] = CLLocationCoordinate2DMake(-102.0424467175215, 36.99846609483674); kansasPoints[2] = CLLocationCoordinate2DMake(-94.62550551403953, 36.98936020770036); kansasPoints[3] = CLLocationCoordinate2DMake(-94.58798745384412, 39.11683771419185); kansasPoints[4] = CLLocationCoordinate2DMake(-94.79955391183, 39.21290793052091); kansasPoints[5] = CLLocationCoordinate2DMake(-95.13489191971419, 39.51613476830012); kansasPoints[6] = CLLocationCoordinate2DMake(-94.86553124171813, 39.78380472206268); kansasPoints[7] = CLLocationCoordinate2DMake(-95.02618283417986, 39.89072859904893); kansasPoints[8] = CLLocationCoordinate2DMake(-95.31904155494097, 39.99390420513669); MKPolygon *kansasPolygon = [MKPolygon polygonWithCoordinates:kansasPoints count:9]; [mapView addOverlay:kansasPolygon]; [kansasPolygon release]; // Array of coordinates for polygon covering part of Daytona Beach, FL campus // of Embry-Riddle Aeronautical University... DOESN'T DISPLAY CLLocationCoordinate2D erauPoints[7]; erauPoints[0] = CLLocationCoordinate2DMake(-81.05176, 29.18492); erauPoints[1] = CLLocationCoordinate2DMake(-81.04409, 29.18801); erauPoints[2] = CLLocationCoordinate2DMake(-81.05166, 29.19293); erauPoints[3] = CLLocationCoordinate2DMake(-81.05365, 29.19536); erauPoints[4] = CLLocationCoordinate2DMake(-81.05465, 29.19493); erauPoints[5] = CLLocationCoordinate2DMake(-81.05376, 29.19323); erauPoints[6] = CLLocationCoordinate2DMake(-81.05506, 29.19188); MKPolygon *erauPolygon = [MKPolygon polygonWithCoordinates:erauPoints count:7]; [mapView addOverlay:erauPolygon]; [erauPolygon release]; // Array of coordinates taken from http://www.shawngrimes.me/2011/04/adding-polygon-map-overlays/ // for commuter parking lot at Capitol College in Maryland ... DISPLAYS PERFECTLY CLLocationCoordinate2D commuterLotCoords[5]={ CLLocationCoordinate2DMake(39.048019,-76.850535), CLLocationCoordinate2DMake(39.048027,-76.850234), CLLocationCoordinate2DMake(39.047407,-76.850181), CLLocationCoordinate2DMake(39.047407,-76.8505), CLLocationCoordinate2DMake(39.048019,-76.850535) }; MKPolygon *commuterPoly1 = [MKPolygon polygonWithCoordinates:commuterLotCoords count:5]; [mapView addOverlay:commuterPoly1]; [commuterPoly1 release]; } - (void)viewDidUnload { [super viewDidUnload]; // Release any retained subviews of the main view. } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown); } - (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id<MKOverlay>)overlay { if ([overlay isKindOfClass:[MKPolygon class]]) { MKPolygonView *polygonView = [[[MKPolygonView alloc] initWithOverlay:overlay] autorelease]; polygonView.fillColor = [[UIColor cyanColor] colorWithAlphaComponent:0.3f]; polygonView.strokeColor = [UIColor networkingColor]; polygonView.lineWidth = 1.0f; return polygonView; } return nil; } @end 

Parece que los parameters de latitud y longitud de las coorderadas para los polígonos que no se muestran están al revés.

Por ejemplo, esto:

 kansasPoints[0] = CLLocationCoordinate2DMake(-102.0595440241806, 39.99774930940907); 

debiera ser

 kansasPoints[0] = CLLocationCoordinate2DMake(39.99774930940907, -102.0595440241806); 

Además, no debería llamar al release en los objects MKPolygon que está creando utilizando polygonWithCoordinates ya que serán autoelegidos.