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?
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];
}
}
];
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)
}
}
}
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!
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);
}
}
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).
Voici une autre version ...
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)
}
}
}
Ce n'est pas possible. Mais vous pouvez obtenir le long/lat d'une adresse en utilisant la classe CLGeocoder
.