14

私は Apple の iOS Class Reference ドキュメントを見てきましたが、残念ながら賢明ではありません。私は彼らのサンプルコードをダウンロードしましKMLViewerたが、彼らはそれを過度に複雑にしました...私が本当に知りたいのは、パスを生成してMKMapView. ドキュメントでは の使用について説明さCGPathRefれていますが、その方法については実際には説明されていません。

4

1 に答える 1

20

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

MKPolyline、点の C 配列 ( MKMapPoint)、または座標の C 配列( ) で作成する必要がありCLLocationCoordinate2Dます。MapKit が などのより高度なデータ構造を使用しないのは残念ですが、それでも構いませんNSArray! に適したデータの C 配列に変換する方法を示すために、オブジェクトのNSArrayorがあると仮定します。この配列が呼び出され、それを埋める方法はアプリによって決定されます。たとえば、ユーザーがタッチ位置を処理することによって埋められたり、Web サービスからダウンロードされたデータが埋められたりします。NSMutableArrayCLLocationMKPolylinelocations

を担当する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 をそこにコピーし、その後メモリ バッファーを解放することです。

于 2012-04-19T09:30:50.660 に答える