iOS-MKMapView通过使用地址而不是lat/long来放置注释



我可以通过使用纬度和经度在MKMapView上放置注释,但是,我需要使用location的提要使用街道地址,而不是Lat和Long。例如加利福尼亚州旧金山西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];
                     }
                 }
             ];

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

您所追求的被称为地理编码正向地理编码反向地理编码是将lat/long对转换为街道地址的过程。

iOS5提供了用于地理编码的CLGeocoder类。MKPlacemark在iOS>=3.0中支持反向goecoding。当然,所涉及的数据非常大,因此您的应用程序通常需要网络访问功能。

一个好的开始是苹果的位置意识编程指南。此外,在SO上还有很多关于这方面的问题。https://stackoverflow.com/search?q=geocoding

祝你好运!

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

自iOS 7以来,placemark.reregion.center已被弃用。现在需要使用:

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

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

这是另一个版本。。。

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

}

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

最新更新