iOS - MKMapView размещает аннотацию, используя адрес вместо широты и долготы - PullRequest
39 голосов
/ 07 марта 2012

Я могу размещать аннотации на моем MKMapView, используя широту и долготу, однако мой фид, для которого мне нужно использовать местоположение, использует адреса улиц, а не широты и долготы.например, 1234 запад, 1234 восток, Сан-Франциско, Калифорния ...

Это как-то связано с CLLocationManager?

Кто-нибудь пытался сделать это раньше?

Ответы [ 7 ]

76 голосов
/ 08 марта 2012

Основываясь на превосходной информации 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];
                     }
                 }
             ];
13 голосов
/ 14 августа 2016

Рефакторированная версия 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)
        }
    }
}
10 голосов
/ 07 марта 2012

То, что вы ищете, называется геокодирование или прямое геокодирование . Обратное геокодирование - это процесс преобразования пары широта / длинная в уличный адрес.

iOS5 предоставляет класс CLGeocoder для геокодирования. MKPlacemark поддерживает обратное кодирование в iOS> = 3.0. Используемые данные, конечно, очень велики, поэтому вашему приложению, как правило, потребуется сетевой доступ к функциональности.

Хорошее начало - Apple Руководство по программированию определения местоположения . Кроме того, есть много вопросов об этом здесь, на SO. https://stackoverflow.com/search?q=geocoding

Удачи!

8 голосов
/ 18 марта 2016

Swift версия

        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);

            }
        }
7 голосов
/ 17 февраля 2014

Начиная с iOS 7, placemark.region.center устарело.Теперь необходимо использовать:

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

Вы также можете прочитать документацию Apple об этом и здесь тоже.

5 голосов
/ 27 марта 2017

Вот еще одна версия ...

- Синтаксис Swift 2017

- Показывает название места для точки внизу

- Выберите любой размер, скажем, 5 км, как показано области

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)
        }
    }


}
1 голос
/ 07 марта 2012

Это невозможно.Но вы можете получить long / lat из адреса, используя класс CLGeocoder.

...