パスを生成し、それをオーバーレイとしてMKMapView
に追加する方法は次のとおりです。私はのサブクラスであるMKPolylineView
を使用するつもりで、代わりにMKPolyline
(パスのデータを含む)を作成し、これを使用してMKPolylineView
(視覚的表現)を作成するため、CGPath
を参照する必要がなくなります。マップ上のデータの)。
MKPolyline
ポイント(MKMapPoint
)のC配列、又は座標のC配列(CLLocationCoordinate2D
)で作成されなければなりません。 MapKitがNSArray
のような高度なデータ構造を使用していないことは残念ですが、そうでもあります! MKPolyline
に適したデータのC配列に変換する方法を示すために、NSArray
またはNSMutableArray
がCLLocation
のオブジェクトであると仮定します。この配列はlocations
と呼ばれ、入力する方法はアプリによって決まります。 self.polylineであること
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];
}
注
はMKMapView
を担当するビューコントローラ内等、ユーザによりタッチ位置を処理することにより充填、またはWebサービスからダウンロードされたデータで満たさ
- (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;
}
:このビューコントローラはまた
MKMapViewDelegate
メソッドを実装する必要が
@property (nonatomic, retain) MKPolyline* polyline;
:として.Hに宣言
fillColor、strokeColor、およびlineWidthの各プロパティを使用して再生することで、それらがアプリケーションに適していることを確認できます。私はちょうどここで、シンプルで適度に広い平らな白い線でここに行きました。
地図からパスを削除する場合は、次のようにします。
[mapView removeOverlay:self.polyline];
self.polyline = nil;
をしてから、新しいMKPolylineを作成し、マップに追加するには上記のプロセスを繰り返します。いくつかの新しい座標とそれを更新するために、あなたが行うだろう。
MapKitはちょっと恐ろしく複雑に見えますが、この例に示すようにいくつかのことを行うのは簡単です。少なくとも非Cプログラマにとって唯一の恐ろしいビットは、mallocを使用してバッファを作成し、配列構文を使用してCLLocationCoordinatesをコピーし、その後にメモリバッファを解放することです。
MKOverlayPathViewには、CGPathRefで直接設定する '-path'プロパティがあります。あなたはCGPathRefを作成する方法について混乱していますか? –