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;
}
Насколько я понимаю, это то, что:
- Мне нужно создать МК Полигон
- Добавьте наложение в MapView
- Это, в свою очередь, вызовет создание 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" - это массив, содержащий словарь с несколькими значениями ключей широты и долготы. // Надеюсь, это поможет вам.