简体   繁体   English

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

[英]iOS - MKMapView place annotation by using address instead of lat / long

I am able to place annotations on my MKMapView by using latitude and longitude, however, my feed coming in that I need to use location for is using street addresses instead of Lat and Long. 我能够通过使用纬度和经度在我的MKMapView上放置注释,但是,我需要使用位置的源是使用街道地址而不是Lat和Long。 eg 1234 west 1234 east, San Francisco, CA ... 例如1234 West 1234 east,San Francisco,CA ...

Would this have something to do with the CLLocationManager ? 这会与CLLocationManager吗?

Has anyone attempted this before? 有没有人尝过这个?

Based on psoft 's excellent information, I was able to achieve what I was looking for with this code. 根据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];
                     }
                 }
             ];

Refactored Swift version: 重构的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)
        }
    }
}

What you're after is called geocoding or forward-geocoding . 你所追求的是地理编码前向地理编码 Reverse-geocoding is the process of converting a lat/long pair to street address. 反向地理编码是将纬度/经度对转换为街道地址的过程。

iOS5 provides the CLGeocoder class for geocoding. iOS5提供了用于地理编码的CLGeocoder类。 MKPlacemark supports reverse-goecoding in iOS >= 3.0. MKPlacemark支持iOS> = 3.0中的反向编码。 The data involved of course is very large, so your app will generally need network access to the functionality. 当然涉及的数据非常大,因此您的应用通常需要网络访问功能。

A good place to start is Apple's Location Awareness Programming Guide . 一个好的起点是Apple的位置感知编程指南 Also, there are LOTS of questions about this here on SO. 此外,SO上有很多关于这方面的问题。 https://stackoverflow.com/search?q=geocoding https://stackoverflow.com/search?q=geocoding

Good luck! 祝好运!

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

            }
        }

Since iOS 7, placemark.region.center is deprecated. 自的iOS 7,placemark.region.center已弃用。 Now needs to use: 现在需要使用:

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

You can also read Apple Documentation about this and here too. 您还可以阅读苹果文档关于这个这里了。

Here's another version ... 这是另一个版本......

- Swift 2017 syntax - Swift 2017语法

- Shows a placename for the point, down the bottom - 在底部显示该点的地名

- Choose any size, say 5 km, as the area shown - 选择任何尺寸,比如5 km,如图所示

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


}

That is not possible. 这是不可能的。 But you can obtain the long/lat from an Address by using the CLGeocoder class. 但是您可以使用CLGeocoder类从地址获取long / lat。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM