[英]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 ... 这是另一个版本......
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.