Oto jak wygenerować ścieżkę i dodać ją jako nakładkę do MKMapView
. Mam zamiar użyć MKPolylineView
, który jest podklasą MKOverlayPathView
i chroni przed odniesieniem się do każdego CGPath
, ponieważ zamiast tego tworzysz MKPolyline
(zawierający dane o ścieżce) i używasz go do utworzenia MKPolylineView
(reprezentacja wizualna danych na mapie).
Należy utworzyć MKPolyline
z tablicą C punktów (MKMapPoint
) lub tablicą C o współrzędnych (CLLocationCoordinate2D
). Szkoda, że MapKit nie używa bardziej zaawansowanych struktur danych, takich jak NSArray
, ale niech tak będzie! Zakładam, że masz obiekty NSArray
lub NSMutableArray
z CLLocation
, aby pokazać, jak przekonwertować na tablicę C danych odpowiednich dla MKPolyline
. Ta tablica nazywa się locations
, a sposób jej wypełnienia zależy od Twojej aplikacji - np. wypełnione przez przetwarzanie lokalizacje dotykowych przez użytkownika, lub wypełnione danymi pobranymi z usługi internetowej itp
W kontrolerze widoku, który jest odpowiedzialny za 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];
}
Należy pamiętać, że jest self.polyline zadeklarowane w .h jako:
@property (nonatomic, retain) MKPolyline* polyline;
Ten kontroler widoku powinny również wdrożyć metodę MKMapViewDelegate
:
- (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;
}
Można odtwarzać właściwości fillColor, strokeColor i lineWidth, aby upewnić się, że są odpowiednie dla danej aplikacji. Właśnie przeszedłem z prostą, umiarkowanie szeroką białą linią tutaj.
Jeśli chcesz usunąć ścieżkę z mapy, np. zaktualizować go z kilkoma nowymi współrzędnymi, wtedy można zrobić:
[mapView removeOverlay:self.polyline];
self.polyline = nil;
a następnie powtórzyć powyższy proces, aby utworzyć nowy MKPolyline i dodać go do mapy.
Chociaż na pierwszy rzut oka MapKit może wyglądać nieco przerażająco i skomplikowanie, może być łatwo zrobić kilka rzeczy, jak pokazano w tym przykładzie. Jedynym przerażającym bitem - przynajmniej dla programistów spoza C - jest użycie malloc do stworzenia bufora, skopiowanie do niego współrzędnych CLLocationCo przy użyciu składni tablic, a następnie zwolnienie bufora pamięci.
MKOverlayPathView ma właściwość '-path', którą można bezpośrednio ustawić za pomocą CGPathRef. Czy jesteś zdezorientowany, jak utworzyć CGPathRef? –