私は Apple の iOS Class Reference ドキュメントを見てきましたが、残念ながら賢明ではありません。私は彼らのサンプルコードをダウンロードしましKMLViewer
たが、彼らはそれを過度に複雑にしました...私が本当に知りたいのは、パスを生成してMKMapView
. ドキュメントでは の使用について説明さCGPathRef
れていますが、その方法については実際には説明されていません。
1 に答える
パスを生成し、オーバーレイとして に追加する方法は次のとおりMKMapView
です。MKPolylineView
のサブクラスであるを使用します。代わりに(パスのデータを含む) を作成し、それを使用して(上のデータの視覚的表現) を作成するため、MKOverlayPathView
を参照する必要がなくなります。地図)。CGPath
MKPolyline
MKPolylineView
はMKPolyline
、点の C 配列 ( MKMapPoint
)、または座標の C 配列( ) で作成する必要がありCLLocationCoordinate2D
ます。MapKit が などのより高度なデータ構造を使用しないのは残念ですが、それでも構いませんNSArray
! に適したデータの C 配列に変換する方法を示すために、オブジェクトのNSArray
orがあると仮定します。この配列が呼び出され、それを埋める方法はアプリによって決定されます。たとえば、ユーザーがタッチ位置を処理することによって埋められたり、Web サービスからダウンロードされたデータが埋められたりします。NSMutableArray
CLLocation
MKPolyline
locations
を担当するView Controllerで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
このView Controllerは、次のメソッドも実装する必要があります。
- (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 をそこにコピーし、その後メモリ バッファーを解放することです。