web-dev-qa-db-fra.com

iOS - annotation de lieu MKMapView en utilisant l'adresse au lieu de lat / long

Je suis en mesure de placer des annotations sur mon MKMapView en utilisant la latitude et la longitude, cependant, mon flux entrant que je dois utiliser pour l'emplacement utilise des adresses au lieu de Lat et Long. par exemple 1234 ouest 1234 est, San Francisco, Californie ...

Cela aurait-il quelque chose à voir avec le CLLocationManager?

Quelqu'un a-t-il déjà tenté cela?

39
Romes

Sur la base des excellentes informations de psoft, j'ai pu réaliser ce que je cherchais avec ce code.

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

Refactorisé Swift version:

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

Ce que vous recherchez est appelé géocodage ou géocodage avant . Le géocodage inverse est le processus de conversion d'une paire lat/long en adresse municipale.

iOS5 fournit la classe CLGeocoder pour le géocodage. MKPlacemark prend en charge le codage inverse dans iOS> = 3.0. Les données impliquées sont bien sûr très volumineuses, donc votre application aura généralement besoin d'un accès réseau à la fonctionnalité.

Un bon point de départ est Apple Guide de programmation de la localisation . En outre, il y a BEAUCOUP de questions à ce sujet ici sur SO. https://stackoverflow.com/search?q=geocoding

Bonne chance!

10
QED

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

            }
        }
8
Deepak Thakur

Depuis iOS 7, placemark.region.center est déconseillé. Doit maintenant utiliser:

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

Vous pouvez également lire Apple Documentation à ce sujet et ici aussi).

7
EEduard

Voici une autre version ...

- Swift 2017 syntaxe

- Affiche un nom de lieu pour le point, en bas du bas

- Choisissez n'importe quelle taille, disons 5 km, comme la zone indiquée

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

Ce n'est pas possible. Mais vous pouvez obtenir le long/lat d'une adresse en utilisant la classe CLGeocoder.

1
yinkou