2011-01-25 10 views
14

私はAppleのiOSクラスリファレンスドキュメントを見てきましたが、残念ながら誰も賢明ではありません。私は彼らのサンプルコードKMLViewerをダウンロードしましたが、それらはそれを複雑にしました...私が本当に知りたいのは、パスを生成してMKMapViewに追加する方法です。ドキュメントではCGPathRefを使用していますが、実際の方法は説明していません。MKOverlayPathViewを使用してパスを作成する方法の例はありますか?

誰かが正しい方向に私を指差してくれますか?ありがとう!

+0

MKOverlayPathViewには、CGPathRefで直接設定する '-path'プロパティがあります。あなたはCGPathRefを作成する方法について混乱していますか? –

答えて

20

パスを生成し、それをオーバーレイとしてMKMapViewに追加する方法は次のとおりです。私はのサブクラスであるMKPolylineViewを使用するつもりで、代わりにMKPolyline(パスのデータを含む)を作成し、これを使用してMKPolylineView(視覚的表現)を作成するため、CGPathを参照する必要がなくなります。マップ上のデータの)。

MKPolylineポイント(MKMapPoint)のC配列、又は座標のC配列(CLLocationCoordinate2D)で作成されなければなりません。 MapKitがNSArrayのような高度なデータ構造を使用していないことは残念ですが、そうでもあります! MKPolylineに適したデータのC配列に変換する方法を示すために、NSArrayまたはNSMutableArrayCLLocationのオブジェクトであると仮定します。この配列は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をコピーし、その後にメモリバッファを解放することです。

+0

非常に良い説明...あなたは私の日を救った...ありがとうございました。 – viral

+0

動作しません。どこから呼び出されたポリライン(ビュー)のビジュアルプロパティを設定するデリゲートメソッドはどこですか?私はそれの中にログを入れ、私はそれが決して呼ばれることがないことを観察した。何か間違っているのですか? –

+0

View Controllerを 'MKMapViewDelegate'にしましたか?これは 'mapView:viewForOverlay'が呼び出される結果となります。 –

関連する問題