Вот как сгенерировать путь и добавить его как оверлей к MKMapView
.Я собираюсь использовать MKPolylineView
, который является подклассом MKOverlayPathView
и защищает вас от необходимости ссылаться на любой CGPath
, так как вместо этого вы создаете MKPolyline
(содержащий данные пути) и используете этодля создания MKPolylineView
(визуальное представление данных на карте).
* MKPolyline
должен быть создан с массивом точек C (MKMapPoint
) или массивом координат C(CLLocationCoordinate2D
).Жаль, что MapKit не использует более сложные структуры данных, такие как NSArray
, но так и будет!Я собираюсь предположить, что у вас есть NSArray
или NSMutableArray
из CLLocation
объектов, чтобы продемонстрировать, как преобразовать в массив данных C, подходящий для MKPolyline
.Этот массив называется locations
, и способ его заполнения будет зависеть от вашего приложения - например, заполнение путем обработки сенсорных местоположений пользователем или заполнение данными, загруженными из веб-службы и т. Д.
В представленииконтроллер, отвечающий за MKMapView
:
int numPoints = [locations count];
if (numPoints > 1)
{
CLLocationCoordinate2D* coords = malloc(numPoints * sizeof(CLLocationCoordinate2D));
for (int i = 0; i < numPoints; i++)
{
CLLocation* current = [locations objectAtIndex:i];
coords[i] = current.coordinate;
}
self.polyline = [MKPolyline polylineWithCoordinates:coords count:numPoints];
free(coords);
[mapView addOverlay:self.polyline];
[mapView setNeedsDisplay];
}
Обратите внимание, что self.polyline объявлен в .h как:
@property (nonatomic, retain) MKPolyline* polyline;
Этот контроллер представления также должен реализовывать MKMapViewDelegate
method:
- (MKOverlayView*)mapView:(MKMapView*)theMapView viewForOverlay:(id <MKOverlay>)overlay
{
MKPolylineView* lineView = [[[MKPolylineView alloc] initWithPolyline:self.polyline] autorelease];
lineView.fillColor = [UIColor whiteColor];
lineView.strokeColor = [UIColor whiteColor];
lineView.lineWidth = 4;
return lineView;
}
Вы можете поиграть со свойствами fillColor, strokeColor и lineWidth, чтобы убедиться, что они подходят для вашего приложения.Я только что использовал простую, умеренно широкую простую белую линию здесь.
Если вы хотите удалить путь с карты, например, чтобы обновить его новыми координатами, вы должны сделать:
[mapView removeOverlay:self.polyline];
self.polyline = nil;
и затем повторите описанный выше процесс для создания новой MKPolyline и добавления ее на карту.
Хотя MapKit на первый взгляд может показаться немного пугающим и сложным, некоторые из них могут быть легко выполненывещи, как показано в этом примере.Единственный страшный бит - по крайней мере для программистов не на C - это использование malloc для создания буфера, копирования в него CLLocationCoordinates с использованием синтаксиса массива, а затем освобождения буфера памяти.