Mapkit получение координат

mapkit
swift3

#1

Задача:
Определить город пользователя.

Сделано:

  1. Получение по GPS города
  2. Поставить отметку на карте

Как выглядит сейчас:
Нажимаем на выбор города и получаем координаты, которые преобразуем в адрес и забираем оттуда город.
Как город увидели, то появляется алект - верно ли определили город:
а) Верно
б) Выбрать на карте

Если выбрать б, то у меня снова срабатывает определение города по ГПС (текущие координаты).
Не могу предположить, как в случае выбора “выбрать на карте” - больше не получать координаты автоматом.

// получаем текущие координаты по GPS

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    
    let location = locations[0] //.last
    let myLocation = CLLocationCoordinate2DMake(location.coordinate.latitude, location.coordinate.longitude)
    let span = MKCoordinateSpanMake(0.01, 0.01)
    let region = MKCoordinateRegionMake(myLocation, span)
    
    mapView.setRegion(region, animated: true)
    self.mapView.showsUserLocation = true
    coordinateToAdress(locations.last!)
}

// получаем координаты по нажатию
func foundTap(_ recognizer: UITapGestureRecognizer) {
    let point: CGPoint = recognizer.location(in: mapView)
    let tapPoint: CLLocationCoordinate2D = mapView.convert(point, toCoordinateFrom: view)
    let point1 = MKPointAnnotation()
    point1.coordinate = tapPoint
    mapView.addAnnotation(point1)
    let getLat: CLLocationDegrees = tapPoint.latitude
    let getLon: CLLocationDegrees = tapPoint.longitude
    let locationTouch: CLLocation =  CLLocation(latitude: getLat, longitude: getLon)
    coordinateToAdress(locationTouch)
    
    
}

// Преобразуем координаты в Адрес
func coordinateToAdress(_ locations: CLLocation) {
    geocode.reverseGeocodeLocation(locations /*.last!*/) { (placemarks, error) in
        // Детализированная информация по точке
        var placemark: CLPlacemark!
        
        if let placemarks = placemarks {
            placemark = placemarks[0]
        }
        // Словарь адресов
        //            print(placemark.addressDictionary!)
        
        // Вытаскиваем атрибуты адреса
        if let country = placemark.addressDictionary!["Country"] as? NSString {
            print("Country name \(country)")
        }
        
        self.city = (placemark.addressDictionary!["City"] as? NSString)!
        
        print("City name \(self.city)")
        
        // Street address
        if let street = placemark.addressDictionary!["Thoroughfare"] as? NSString {
            print(street)
        }
        self.delay(15, closure: {
            self.showAlertLocation()
        })
    }
}

#2

Всё стабильно - ответ нет.

Хотя бы текстовое поле можно сделать с выбором города?

Аналогично, если геолокация как-то неправильно определила город, то вписать его вручную с автоподстановкой…?

Или вполне достаточно оставить по геолокации определения? Может быть слишком заморачиваюсь с альтернативными вариантами?


#3

Мда…мои темы и вопросы остаются без ответов или закрываются тоже без ответов…
спасибо…


#4

Возможно, люди которые имеют ответ и знают вашу проблему, заняты?
И наоборот - все кто свободен - не знает материал, но им бы хотелось вам помочь?

Не отчаивайтесь, ждите - и возможно будет ответ :slight_smile:


#5

Если только… спасибо.
А так по долгу висят мои сообщения без ответа. Вроде, как мне кажется вопросы простые довольно, в приложениях не раз видел подобные варианты.


#6

Если видели подобное - умейте гуглить материал. И скорее всего, уверен на 99,9% что в районе Америки уже разобрали подобную проблему :slight_smile:


#7

Вы при каждом обновлении локации меняете регион и получаете координаты, поэтому у вас они постоянно обновляются.

Вынесите это в отделтную функцию

let location = locations[0] //.last
let myLocation = CLLocationCoordinate2DMake(location.coordinate.latitude, location.coordinate.longitude)
let span = MKCoordinateSpanMake(0.01, 0.01)
let region = MKCoordinateRegionMake(myLocation, span)

mapView.setRegion(region, animated: true)
self.mapView.showsUserLocation = true
coordinateToAdress(locations.last!)

Надо будет немного подправить этот код, выйдет как-то так:

func getLocation() {
    if CLLocationManager.locationServicesEnabled() {
        let locationManager = CLLocationManager() // не создавайте новый, если уже есть
        let myLocation = locationManager.location?.coordinate
        let span = MKCoordinateSpanMake(0.01, 0.01)
        let region = MKCoordinateRegionMake(myLocation, span)
        mapView.setRegion(region, animated: true)
        mapView.showsUserLocation = true
        coordinateToAdress(locationManager.location!)
    }
}

Возовите его во viewDidAppear

Можно

Куда вписать? Что вы имеете ввиду под автоподстановкой?


#8

Спасибо за подсказки.
По первой части и переносу в отдельную функцию - принято.

По последним двум частям придумал другое решение.
Алгоритм новый:

  1. Определяем местоположение пользователя и показываем аннотацию с городом и кнопкой “Я здесь”
  2. Если по какой-то причине город определен не верно, то есть в навгейшп баре есть кнопка - вываливается поисковая строка и туда вводим город - как показал на карте снова появляется аннотация с кнопкой “Я здесь”

Такой вариант, как мне кажется, более удобный для пользователя (без пугающих уведомлений).


#9

Вообще не понимаю почему вы паритесь по поводу [quote=“LavTeam, post:8, topic:3163”]
Если по какой-то причине город определен не верно
[/quote]

Шанс того, что это произойдет - один на миллион.


#10

Вот выше у меня вопрос и был подобный. Но в ответ была и тишина.
Пишу свое первое приложение и опыта пока нет, чтобы знать “как лучше” - поэтому всегда альтернативные варианты и добавляю (пытаюсь реализовать)


#11

Вы же должны понимать, что люди, которые отвечают, занимаются этим в свободное от работы время и не всегда это время есть.


#12

Вот о чем я и писал выше :slight_smile:


#13

Гугл гуглом, на русских просторах мало что найдено.

Сейчас столкнулся, что необходимо аннотации над точкой (координатой) на карте выводить сразу (без клика по иголке).
Ничего толком не нашел, кроме вопросов:

Пишут что это не возможно в конце… это так?

Добавлено:

Что-то нашел:


Дома буду проверять


#14

Проверил.
Всего одна строка
self.mapView.selectAnnotation(self.pointAnnotation, animated: true)

и аннотация появляется без клика


#15

Это, надеюсь, хорошо? :slight_smile:


#16

Да, это то что я хотел сделать.
Не понимаю стёба


#17

Это ни капли не стеб) я просто не знал как корректно ответить, и не был уверен что вы нашли решение Своей проблемы (или же решение проблемы, похожую на вашу)