如何获取标注的 MKPlacemark 地址

Posted

技术标签:

【中文标题】如何获取标注的 MKPlacemark 地址【英文标题】:How to obtain a MKPlacemark Address for a callout 【发布时间】:2015-03-09 11:11:29 【问题描述】:

我正在尝试弄清楚如何获取 MKPlacemark 商品的街道地址。我在控制台中打印了一个项目,我可以看到那里的信息,但我只得到 thoroughfare 信息,没有街道地址号码。

这是我的代码:

- (void)performSearch 
    MKLocalSearchRequest *request = [[MKLocalSearchRequest alloc]init];
    request.naturalLanguageQuery = _searchText.text;
    request.region = _mapView.region;

    _matchingItems = [[NSMutableArray alloc]init];

    MKLocalSearch *search = [[MKLocalSearch alloc]initWithRequest:request];
    NSLog(@"MKLocalSearch array created");

    [search startWithCompletionHandler:^(MKLocalSearchResponse *response, NSError *error) 
        if (response.mapItems.count == 0) 
            NSLog(@"No Matches Found");
         else 
            for (MKMapItem *item in response.mapItems) 
                [_matchingItems addObject:item];
                MKPointAnnotation *annotation = [[MKPointAnnotation alloc]init];
                annotation.coordinate = item.placemark.coordinate;

                // Pull out address info from MKMapItem
                MKPlacemark *placemark = item.placemark;
                NSLog(@"Placemark info: %@", item.placemark);
                // Address details
                NSDictionary *address = placemark.addressDictionary;
                NSString *titleString = @"";
                NSString *subtitleString = @"";
                NSString *name = @"";
                NSString *thoroughfare = @"";
                NSString *state = @"";
                NSString *city = @"";
                NSString *country = @"";

                name = [address objectForKey:@"Name"] ? [address objectForKey:@"Name"] : @"";
                thoroughfare = [address objectForKey:@"Thoroughfare"] ? [address objectForKey:@"Thoroughfare"] : @"";
                state = [address objectForKey:@"State"] ? [address objectForKey:@"State"] : @"";
                city = [address objectForKey:@"City"] ? [address objectForKey:@"City"] : @"";
                country = [address objectForKey:@"Country"] ? [address objectForKey:@"Country"] : @"";

                titleString = [NSString stringWithFormat:@"%@ %@", name, thoroughfare];
                subtitleString = [NSString stringWithFormat:@"%@ %@ %@ %@", thoroughfare, state, city, country];

                // Strings for annotation
                annotation.title = item.name;
                annotation.subtitle = subtitleString;

                [_mapView addAnnotation:annotation];
            
        
    ];

【问题讨论】:

MKPlacemark 是 CLPlacemark 的子类。 CLPlacemark 为每个地址元素定义了方便的属性(因此您不必直接通过键名访问字典)。 Street# 应该在 placemark.subThoroughfare 中。但并非所有地址元素都可以保证设置。 谢谢!如果您将其设为答案,我会将其标记为您已回答。 【参考方案1】:

你可以这样找到地址:

        geocoder.reverseGeocodeLocation(location, completionHandler: (placemarks, error)->Void in
        var placemark:CLPlacemark!

        if error == nil && placemarks!.count > 0 
            placemark = placemarks![0] as CLPlacemark


            var addressString : String = ""
            if placemark.ISOcountryCode == "TW" /*Address Format in Chinese*/ 
                if placemark.country != nil 
                    addressString = placemark.country!
                
                if placemark.subAdministrativeArea != nil 
                    addressString = addressString + placemark.subAdministrativeArea! + ", "
                
                if placemark.postalCode != nil 
                    addressString = addressString + placemark.postalCode! + " "
                
                if placemark.locality != nil 
                    addressString = addressString + placemark.locality!
                
                if placemark.thoroughfare != nil 
                    addressString = addressString + placemark.thoroughfare!
                
                if placemark.subThoroughfare != nil 
                    addressString = addressString + placemark.subThoroughfare!
                
             else 
                if placemark.subThoroughfare != nil 
                    addressString = placemark.subThoroughfare! + " "
                
                if placemark.thoroughfare != nil 
                    addressString = addressString + placemark.thoroughfare! + ", "
                
                if placemark.postalCode != nil 
                    addressString = addressString + placemark.postalCode! + " "
                
                if placemark.locality != nil 
                    addressString = addressString + placemark.locality! + ", "
                
                if placemark.administrativeArea != nil 
                    addressString = addressString + placemark.administrativeArea! + " "
                
                if placemark.country != nil 
                    addressString = addressString + placemark.country!
                

                print (placemark.postalCode)

                let new_placemark: MKPlacemark = MKPlacemark (placemark: placemark)

            print(placemark.description)    

            


        
    )

【讨论】:

【参考方案2】:

MKPlacemarkCLPlacemark 的子类。

CLPlacemark 为每个地址元素定义了方便的属性,因此您不必直接通过键名访问字典。 (如果必须直接访问字典,请尝试使用预定义的ABPerson Address Property key name constants documented here。)

使用便捷的属性访问器,街道编号应为placemark.subThoroughfare

但请注意,并非所有地址元素都保证根据给定坐标的准确性和国家/地区进行设置。

【讨论】:

以上是关于如何获取标注的 MKPlacemark 地址的主要内容,如果未能解决你的问题,请参考以下文章

如何设置 MKPlacemark 的显示名称?

百度地图API,如何通过标注名 来删除标注

html css 如何实现获取百度地图的标注点

如何在百度地图腾讯地图标注公司地址信息?

在百度地图上查找到的标注,如何获取该标注的标题

如何从结构页面中获取关联数据的物理地址?