2
- (void)viewDidLoad
{
    [super viewDidLoad];

    CLLocationCoordinate2D currentLocation;
    currentLocation.latitude = self.mapView.userLocation.location.coordinate.latitude;
    currentLocation.longitude = self.mapView.userLocation.location.coordinate.longitude;

    CLLocationCoordinate2D otherLocation;
    otherLocation.latitude = [lati doubleValue];
    otherLocation.longitude = [longi doubleValue];

    MKPointAnnotation *mka = [[MKPointAnnotation alloc]init];
    mka.Coordinate = otherLocation;
    mka.title = @"!";
    [self.mapView addAnnotation:mka];

    self.mapView.delegate = self;

    MKMapPoint *pointsArray = malloc(sizeof(CLLocationCoordinate2D));
    pointsArray[0]= MKMapPointForCoordinate(currentLocation);
    pointsArray[1]= MKMapPointForCoordinate(otherLocation);
    routeLine = [MKPolyline polylineWithPoints:pointsArray count:2];
    free(pointsArray);

    [self.mapView addOverlay:routeLine];
}

このコードを使用して座標間のポリラインを表示していますが、この直線を取得しています。この問題を解決する方法。

ここに画像の説明を入力

4

2 に答える 2

2

スクリーンショットに基づいて、ラインがユーザーの場所ではなく、明らかに東の遠隔地にあることを示しています(おそらく、アフリカ沖の大西洋にある0,0)...

潜在的な問題は、userLocation 座標を読み取ろうとしているviewDidLoadが、マップがまだ位置を取得していない可能性があることです。その場合、0,0 からプロットされます。

showsUserLocationであることを確認しYESて userLocation を読み取り、didUpdateUserLocation代わりにデリゲート メソッドでポリラインを作成します。

didUpdateUserLocationまた、デバイスが移動している場合、または OS がより適切な場所を取得している場合は、複数回呼び出すことができることを覚えておいてください。これを考慮しないと、(オーバーレイ作成をそこに移動した後に)複数の線が描画される可能性があります。新しいオーバーレイを追加する前に既存のオーバーレイを削除することも、既に行われている場合はオーバーレイを追加しないこともできます。


さらに、次の点に注意してください。

投稿されたコードは2点間に線を引こうとしますが、これは次のとおりです。

MKMapPoint *pointsArray = malloc(sizeof(CLLocationCoordinate2D));

1 つのポイントのみ にスペースを割り当てます。

もう 1 つの問題は、配列に入れている MKMapPoint の代わりに CLLocationCoordinate2D のサイズを使用することです (ただし、これら 2 つの構造体がたまたま同じサイズであるため、これは技術的に問題を引き起こすわけではありません)。

その行を次のように変更してみてください。

MKMapPoint *pointsArray = malloc(sizeof(MKMapPoint) * 2);


polylineWithCoordinatesCLLocationCoordinate2Ds を MKMapPoints に変換する必要がないように、メソッドを 使用することもできることに注意してください。

于 2013-12-03T12:28:04.737 に答える