2

これは私を狂わせています。私はstackoveflowのすべての投稿を確認しましたが、法案に適合するものはありません。にオーバーレイとして単純なポリライン(つまり、カスタムオーバーレイではない)を追加しようとしていMKMapViewます。viewForOverlayデリゲートのメソッドが呼び出されることはありません。マップデリゲートは、他のすべてのデリゲート関数に対して正しく呼び出されます。viewForOverlayメソッドのコードは次のとおりです。

//maanges the overlay
- (MKOverlayView *)mapView:(MKMapView *)map viewForOverlay:(id <MKOverlay>)overlay{

    NSLog(@"does it ask for the overlay view?");

    MKOverlayView *overlayView = nil;

    return overlayView;
}

ポリラインを作成してマップに追加するコードは次のとおりです。

    MKPolyline *thePolyline = [MKPolyline polylineWithPoints:pts count:[arrOfPoints count]];

    [thePolyline setTitle:@"line"];

    [mapView addOverlay:thePolyline];

ポリラインには実際に私のポイントのコレクション(約1000)があるので、問題はないと思います。マップビューに必要なプロパティやその他の実装がありませんか?

EDITポリラインMKMapPoint生成のコードを表示します。

appConfigプロセスの一部としてポリラインを生成するために、約1100ポイントのxmlファイルを使用します。とを使用してファイルを読み取り、解析しNSXMLParserますNSXMLParserDelegate。(プロトコルのfoundCharactersメソッドから)ポイントを生成するコードは次のとおりです。NSXMLParserDelegate

//NSXMLParserDelegate methods...
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{

    if(POINT){
        NSArray *arr = [string componentsSeparatedByString:@","];

        MKMapPoint pt = MKMapPointMake([[arr objectAtIndex:1]doubleValue], [[arr objectAtIndex:0]doubleValue]);

        MapPointObject *thePoint = [[MapPointObject alloc] init];
        thePoint.mapPoint = pt;

        //gives the mkmappoint to the array of points.
        [arrOfPoints addObject:thePoint];

        [thePoint release];
    }
}

ここに、ポイントが実際にを生成し、MKPolylineそれをmapViewに(プロトコルのdidEndElementメソッドから)提供する場所があります。NSXMLParserDelegate

   if([elementName isEqualToString:@"appConfig"]){
        MKMapPoint *pts = malloc([arrOfPoints count] * sizeof(MKMapPoint));

        for(int i = 0; i <= [arrOfPoints count] - 1; i++){
            MapPointObject *pointObject = [arrOfPoints objectAtIndex:i];
            pts[i] = pointObject.mapPoint;
        }

        MKPolyline *thePolyline = [MKPolyline polylineWithPoints:pts count:[arrOfPoints count]];
        [thePolyline setTitle:@"line"];

        //adding the polyline to the model's mapview
        Model *theModel = [Model sharedModel];

        [theModel.mapView setVisibleMapRect:thePolyline.boundingMapRect animated:YES];
        [theModel.mapView addOverlay:thePolyline];

        free(pts);
    }

のポイントカウントプロパティMKPolylineは、実際には1100ポイントあることを示しています。

編集:サンプルXML値:

<appConfig>
<point>-94.847587,38.977967</point>
<point>-94.844111,38.977978</point>
<point>-94.844108,38.977369</point>
<point>-94.844003,38.977369</point>
<point>-94.843955,38.974886</point>
4

3 に答える 3

2

xmlファイルには、座標(緯度と経度)の値が含まれています。MKMapPointこれらの座標値は、値(フラットマップへの緯度/経度のマップビューのx、y投影)と同じものではありません。

値ではなく座標を保存する必要がありMKMapPointます(あなたはそうです)。

したがって、andを使用する代わりに、MKMapPointandpolylineWithPointsを使用CLLocationCoordinate2DpolylineWithCoordinatesます。

CLLocationCoordinate2Dxmlパーサーメソッドで、 usingを作成して保存しCLLocationCoordinate2DMakeます。

pts配列は型である必要があり、CLLocationCoordinate2D *実行するときはmalloc、を使用しますsizeof(CLLocationCoordinate2D)

polylineWithCoordinates次に、の代わりに呼び出しますpolylineWithPoints


ちなみに、viewForOverlay上記の変更を行った後、実際にnil以外のオーバーレイビューを返す必要もあります。そうしないと、次の行が表示されません。

MKPolylineView *polylineView = [[[MKPolylineView alloc] initWithPolyline:overlay] autorelease];
polylineView.strokeColor = [UIColor redColor];
polylineView.lineWidth = 2.0;
return polylineView;
于 2012-05-31T13:58:00.400 に答える
1

問題は解決しましたが、@ AnnaKareninaの元の解決策で問題が解決したので、それを回答としてマークしました。私はこれを投稿して、他の人が追加情報を利用できるようにしています。

私が最初にコードを書いたとき、MKMapPointMakeは次のようなパラメーターを取りますMKMapPointMake(x,y)。私がそれを切り替えたとき、次のCLLocationCoordinate2DMakeようなパラメータを取ります:CLLocationCoordinate2DMake(lat,lng)、またはデカルト用語で、CLLocationCoordinate2DMake(y,x)。私の特定の座標ペアのセットでは、これは存在しないため、viewForOverlayデリゲートメソッドを呼び出すことはありませんでした。CLLocationCoordinate2DMakeコンストラクターのパラメーターの順序を変更したところ、すべてが正常に機能するようになりました。

于 2012-06-01T13:28:06.387 に答える
1
[self.mapView addOverlay:polyline];
[self.mapView setNeedsDisplay];

setNeedsDisplayを呼び出してmapViewを強制的に更新します:)

于 2015-05-04T13:38:56.950 に答える