IOS - MKMapView размещает аннотацию, используя адрес вместо lat/long
Я могу разместить аннотации на MKMapView
, используя широту и долготу, однако мой канал, в котором я должен использовать местоположение, - это использовать уличные адреса вместо Lat и Long. например, 1234 запад 1234 восток, Сан-Франциско, Калифорния...
Будет ли это иметь отношение к CLLocationManager
?
Кто-нибудь пытался это сделать раньше?
Ответы
Ответ 1
Основываясь на отличной информации 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];
}
}
];
Ответ 2
То, что вам нужно, называется геокодированием или форвардом-геокодированием. Обратное геокодирование - это процесс преобразования пары lat/long в адрес улицы.
iOS5 предоставляет класс CLGeocoder для геокодирования. MKPlacemark поддерживает обратное кодирование в iOS >= 3.0. Разумеется, эти данные очень большие, поэтому вашему приложению, как правило, необходим сетевой доступ к функциям.
Хорошим местом для начала является Apple Руководство по программированию местоположения. Кроме того, есть много вопросов об этом здесь, на SO. https://stackoverflow.com/search?q=geocoding
Удачи!
Ответ 3
Реализованная версия 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)
}
}
}
Ответ 4
Так как iOS 7, placemark.region.center устарел. Теперь нужно использовать:
region.center = [(CLCircularRegion *)placemark.region center];
Вы также можете прочитать документацию Apple об этом и здесь.
Ответ 5
Быстрая версия
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);
}
}
Ответ 6
Здесь другая версия...
- синтаксис 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)
}
}
}
Ответ 7
Это невозможно. Но вы можете получить длинный/лат с адреса с помощью класса CLGeocoder
.
Ответ 8
Вот пример проекта iOS, использующий mapKit, чтобы получить данные о местоположении на карте или заполнив некоторые данные адреса в поиске бар.
AddressAutoCompletionMap-ios