2

だから私はMKMapViewに触れることに基づいてCLLocationを取得しようとしています。次に、場所を逆ジオコーディングしようとしています。

    if (gestureRecognizer.state == UIGestureRecognizerStateEnded) {
        // Not sure if this is the right method to get the location or not
        CLLocationCoordinate2D coordinate = [self.mapView convertPoint:[gestureRecognizer locationInView:self.mapView] toCoordinateFromView:self.mapView];

        CLLocation *pinLocation = [[CLLocation alloc] initWithLatitude:coordinate.latitude longitude:coordinate.longitude];
        CLGeocoder *geocoder = [[CLGeocoder alloc] init];

        [geocoder reverseGeocodeLocation:pinLocation completionHandler:^(NSArray *placemarks, NSError *error) {
            if (placemarks && placemarks.count > 0) {
                CLPlacemark *topResult = [placemarks objectAtIndex:0];
                AddressAnnotation *anAddress = [[AddressAnnotation alloc] initWithPlacemark:topResult];     

                [self.mapView addAnnotation:anAddress];
                [self.addressesArray addObject:anAddress];
            }
            else {
                AddressAnnotation *anAddress = [[AddressAnnotation alloc] initWithCoordinate:coordinate];
                [self.mapView addAnnotation:anAddress];
                [self.addressesArray addObject:anAddress];
            }
        }];

私のif/elseステートメントで、私がやりたいのは、マップをタッチしてCLLocationを取得することです。場所を逆ジオコーディングできる場合は、住所のピンをドロップします。場所を逆ジオコーディングできない場合は、ピンをドロップして、地図のコールアウトに緯度と経度を表示します。

うまくいかないようです。特定の場所で地図に触れても、逆ジオコーディングによってピンが別の場所に移動し、逆ジオコードでその場所を特定できるように見えます。これは私が望む振る舞いではありません。何があってもピンを落としたいのですが、コールアウトに住所が表示されない場合は、緯度/経度を表示してください。

revseGeocodeLocation:pinLocationコードを完全に削除し、elseブロックにあるものだけを使用すると、緯度/経度が取得され、ピンは何があってもそこにドロップされます。逆ジオコーダーがピンを希望の場所に落とさないようにする理由はありますか?

ちなみに、UITapGestureRecognizerに基づいてCLLocationCoordinate2Dを計算する方法が正しいかどうかを誰かが確認できますか?

ありがとう!

4

2 に答える 2

1

逆ジオコードが正しく機能している場合、ピンは正しい場所を指しているはずです。正しい緯度と経度の値を取得しているかどうかを確認してください。現在の実装が機能しない場合は、Google リバース ジオコード API を使用してみてください。

ここにあなたを助けるかもしれないリンクがあります.. http://www.icodeblog.com/2009/12/22/introduction-to-mapkit-in-iphone-os-3-0-part-2/

于 2012-10-16T05:27:58.183 に答える
1

coordinateタップポイントに基づく計算は正しいようです。

問題は、coordinateがリバース ジオコーディングされている場合、返される目印がそれらの座標に近いCLPlacemark場所である可能性があり、オブジェクト自体 ( topResult) にはその場所の正確な座標が含まれていることですtopResult.location.coordinate(これは、 を使用して作成されたときに注釈が使用している座標ですinitWithPlacemark)。

ユーザーがリバース ジオコーディング可能な座標をたまたま正確にタップしない限り、目印はタップした場所と正確には一致しません。

最も近くにある目印に関係なく、ユーザーがタップした正確な場所にピンを配置したいので、できることはAddressAnnotation、目印を使用して初期化されるときに使用される座標をオーバーライドすることです。

たとえばを呼び出した後initWithPlacemark(メソッドが目印の位置を使用して注釈のプロパティを設定すると仮定coordinate)、後でそれをオーバーライドできます。

AddressAnnotation *anAddress = [[AddressAnnotation alloc] initWithPlacemark...
anAddress.coordinate = coordinate; // <-- replace with tapped coordinate

または、代わりにを使用し、 からの情報を使用して手動で などinitWithCoordinateを設定することもできます。titletopResult

また、見つかった目印がタップされた座標から一定の距離xtitleよりも離れている場合は、 /の前に「Near」などの接頭辞を追加しsubtitleて、ピンがタップされた位置に正確にないことをユーザーに示すことを検討してください (例:「エッフェル塔の近く」)。

于 2012-10-16T13:25:35.593 に答える