Получение названия города для области на экране [Mapbox]

Я относительно новичок в разработке iOS и Mapbox. Я работаю над приложением, в котором пользователь может свободно управлять картой, заполненной местами, которые они сохранили.

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

Это скриншот пользовательского интерфейса для контекста.

Я пытаюсь запросить набор плиток Mapbox для названия города, используя следующий код:

func mapViewRegionIsChanging(_ mapView: MGLMapView) {

    let zoomLevel = mapView.zoomLevel

    if zoomLevel >= 14.0 {

            // layer identifier taken from layer name in Mapbox Studio
            let layerIdentifier = "place-city-lg-n"

            let screenRect = UIScreen.main.bounds

            let cityName = mapView.visibleFeatures(in: screenRect, styleLayerIdentifiers: Set([layerIdentifier]))

            print(cityName)
    }

Я думаю, что этот код не работает, потому что метка не отображается на экране при указанном уровне масштабирования.

Мне интересно, является ли использование visibleFeaturesInRect лучшим подходом для моих нужд - есть ли лучший способ получить название города независимо от видимых элементов и уровня масштабирования?


person Anoffsinger    schedule 12.01.2020    source источник


Ответы (1)


Для этой задачи я бы рекомендовал использовать MapboxGeocoder от Mapbox. Это для получения информации о городе/селе. вы можете установить модуль:

pod 'MapboxGeocoder.swift', '~> 0.12'

и используйте этот код:

let geocoder = Geocoder.shared

func mapViewRegionIsChanging(_ mapView: MGLMapView) {

    let geocodeOptions = ReverseGeocodeOptions(coordinate: mapView.centerCoordinate)
    geocodeOptions.allowedScopes = [.place]

    let _ = geocoder.geocode(geocodeOptions) { (placemarks, attribution, error) in
        guard let placemark = placemarks?.first else { return }
        print(placemark.name)
        print(placemark.qualifiedName)
    }
}

вы можете добавить свои условия и это действительно помогает решить вашу задачу

person Vadim Nikolaev    schedule 13.01.2020
comment
Это сработало отлично, и теперь меня разблокировали — большое спасибо за вашу помощь! - person Anoffsinger; 19.01.2020