Получение названия города для экранного региона [Карта] - PullRequest
0 голосов
/ 12 января 2020

Я относительно новичок в 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)
    }

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

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

1 Ответ

0 голосов
/ 13 января 2020

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

модуль '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)
    }
}

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

...