web-dev-qa-db-ja.com

iOS-lat / longの代わりにアドレスを使用してMKMapViewが注釈を配置します

緯度と経度を使用してMKMapViewに注釈を配置できますが、位置を使用する必要があるというフィードは、緯度と経度の代わりに住所を使用しています。例:1234西1234東、サンフランシスコ、カリフォルニア州...

これはCLLocationManagerと関係がありますか?

誰もこれを前に試みましたか?

39
Romes

psoftの優れた情報に基づいて、このコードで探していたものを達成することができました。

NSString *location = @"some address, state, and Zip";
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
            [geocoder geocodeAddressString:location 
                 completionHandler:^(NSArray* placemarks, NSError* error){
                     if (placemarks && placemarks.count > 0) {
                         CLPlacemark *topResult = [placemarks objectAtIndex:0];
                         MKPlacemark *placemark = [[MKPlacemark alloc] initWithPlacemark:topResult];

                         MKCoordinateRegion region = self.mapView.region;
                         region.center = placemark.region.center;
                         region.span.longitudeDelta /= 8.0;
                         region.span.latitudeDelta /= 8.0;

                         [self.mapView setRegion:region animated:YES];
                         [self.mapView addAnnotation:placemark];
                     }
                 }
             ];
76
Romes

リファクタリングSwiftバージョン:

let location = "some address, state, and Zip"
let geocoder = CLGeocoder()
geocoder.geocodeAddressString(location) { [weak self] placemarks, error in
    if let placemark = placemarks?.first, let location = placemark.location {
        let mark = MKPlacemark(placemark: placemark)

        if var region = self?.mapView.region {
            region.center = location.coordinate
            region.span.longitudeDelta /= 8.0
            region.span.latitudeDelta /= 8.0
            self?.mapView.setRegion(region, animated: true)
            self?.mapView.addAnnotation(mark)
        }
    }
}
14
NatashaTheRobot

後は、geocodingまたはforward-geocodingと呼ばれます。 Reverse-geocodingは、lat/longペアを番地に変換するプロセスです。

iOS5は、ジオコーディング用に CLGeocoder クラスを提供します。 MKPlacemarkは、iOS> = 3.0でリバースゴーコーディングをサポートしています。もちろん関連するデータは非常に大きいため、通常、アプリは機能へのネットワークアクセスを必要とします。

開始するのに適した場所は、Appleの Location Awareness Programming Guide です。また、SOについてはこれに関する質問がたくさんあります。 https://stackoverflow.com/search?q=geocoding

幸運を!

10
QED

スイフト版

        let location = self.txtLocation.text;
        let geocoder:CLGeocoder = CLGeocoder();
        geocoder.geocodeAddressString(location!) { (placemarks: [CLPlacemark]?, error: NSError?) -> Void in
            if placemarks?.count > 0 {
                let topResult:CLPlacemark = placemarks![0];
                let placemark: MKPlacemark = MKPlacemark(placemark: topResult);

                var region: MKCoordinateRegion = self.mkMapView.region;
                region.center = (placemark.location?.coordinate)!;
                region.span.longitudeDelta /= 8.0;
                region.span.latitudeDelta /= 8.0;
                self.mkMapView.setRegion(region, animated: true);
                self.mkMapView.addAnnotation(placemark);

            }
        }
8
Deepak Thakur

IOS 7以降、placemark.region.centerは非推奨です。次に使用する必要があります:

region.center = [(CLCircularRegion *)placemark.region center];

Apple Documentation これについて および ここ も読むことができます。

7
EEduard

ここに別のバージョンがあります...

-Swift 2017構文

-ポイントの地名を下に表示します

-表示されているエリアとして、任意のサイズ、たとえば5 kmを選択します

func map() {
    let 5km:CLLocationDistance = 5000

    let a= "100 smith avenue some town 90210 SD"
    let g = CLGeocoder()

    g.geocodeAddressString(a) { [weak self] placemarks, error in
        if let p = placemarks?.first, let l = placemark.location {

            let p = MKPlacemark(coordinate: l.coordinate, addressDictionary: nil)

            let cr = MKCoordinateRegionMakeWithDistance(l.coordinate, 5km, 5km)
            let options = [
                MKLaunchOptionsMapCenterKey: NSValue(mkCoordinate: cr.center),
                MKLaunchOptionsMapSpanKey: NSValue(mkCoordinateSpan: cr.span)
            ]

            let m = MKMapItem(placemark: p)
            m.name = "Your House"
            m.openInMaps(launchOptions: options)
        }
    }


}
6
Fattie

それは不可能です。ただし、CLGeocoderクラスを使用して、アドレスからlong/latを取得できます。

1
yinkou