iOS – MKMapView通过使用地址代替lat / long来放置注释

我能够使用纬度和经度在我的MKMapView注释,但是,我的饲料进来,我需要使用的位置是使用街道地址,而不是经纬度和长。 如东1234,东1234,旧金山,加州…

这是否与CLLocationManager

有没有人尝试过呢?

基于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]; } } ]; 

您之后所称的地理编码前向地理编码反向地理编码是将经纬度对转换为街道地址的过程。

iOS5提供了用于地理编码的CLGeocoder类。 MKPlacemark支持iOS> = 3.0中的反向编码。 涉及的数据当然是非常大的,所以你的应用通常需要networking访问function。

苹果的位置感知编程指南是一个很好的起点。 此外,在这里有关于这个问题的许多问题。 https://stackoverflow.com/search?q=geocoding

祝你好运!

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

从iOS 7开始,不赞成使用placemark.region.center。 现在需要使用:

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

你也可以在这里阅读Apple文档。

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

这是另一个版本

– Swift 2017语法

– 显示一个点的地名,底部

– select任何大小,例如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) } } } 

这是不可能的。 但是,您可以通过使用CLGeocoder类从地址获取long / lat。

这里是iOS的示例项目,使用mapKit来获取地图上的位置细节,或者通过在search栏中填写一些地址细节。

AddressAutoCompletionMap-IOS