Пользовательский стиль карты в MapKit

Я ищу способ реализации пользовательского стиля карты в iOS 7, как вы можете это сделать с Google Maps. Я нашел несколько сообщений о том, что это невозможно с MapKit, но они все опубликованы некоторое время назад. Чтобы уточнить, по стилю я говорю о пользовательских цветах и, предпочтительно, шрифтах. Пример пользовательского стиля Google Map ниже.

enter image description here
(источник: servendesign.com)

Я бы действительно предпочел использовать MapKit по соображениям производительности, но если он не поддерживается, я открыт и для других платформ. Я видел MapBox, Cloudmade и, конечно же, Google Maps SDK.

Есть ли способ сделать это с MapKit? Если нет, каков наилучший путь?

Ответ 1

MKMapView не раскрывает свойства, которые вас интересуют в настройке. SDK Google Maps поддерживает пользовательские цвета и значки для маркеров, которых может быть достаточно для ваших целей.

Изменить: Оставайтесь с настройками для iOS 11, которые могут предложить этот уровень настройки.

Ответ 2

MKMapView также предлагает возможность использования пользовательских наложений на плитки. В Openstreetmap есть отличный список серверов, которые вы можете использовать для получения пользовательской карты. Конечно, всегда есть возможность создать свой собственный набор наложения черепицы. Этот процесс описан в wiki здесь.

Возможная реализация в Swift может выглядеть так:

1. Импортировать MapKit

import MapKit

2. Добавить наложения для отображения

let overlayPath = self.mapViewModel.overlayURL
let overlay = MKTileOverlay(URLTemplate: overlayPath)
overlay.canReplaceMapContent = true
self.mapView.addOverlay(overlay)

3. Соответствует MKMapViewDelegate

class ViewController: UIViewController, MKMapViewDelegate { ... }

4. Внедрить метод делегата для использования правильного средства визуализации для отображения фрагментов

func mapView(mapView: MKMapView, rendererForOverlay overlay: MKOverlay) -> MKOverlayRenderer {
    guard let tileOverlay = overlay as? MKTileOverlay else {
        return MKOverlayRenderer(overlay: overlay)
    }
    return MKTileOverlayRenderer(tileOverlay: tileOverlay)
}

В приведенном выше примере overlayURL берется из списка серверов плитки, найденного на openstreetmap: OpenstreetMap Tile Servers.

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

let overlayURL = "http://tile.stamen.com/watercolor/{z}/{x}/{y}.jpg"

Если вы ищете карту темного режима, вы, вероятно, лучше всего подойдете к Carto Dark: http://a.basemaps.cartocdn.com/dark_all/${z}/${x}/${y}.png.

Посмотрите, что указанные выше URL-адреса не поддерживают SSL (HTTP). Поэтому вам нужно будет разрешить ненадежные HTTP-запросы к этому конкретному URL-адресу, добавив App Transport Security Settings в ваш Info.plist. Для получения дополнительной информации см. эту ссылку.

Ответ 3

Другим вариантом является MBXMapKit, который является библиотекой MapBox, построенной на Apple MapKit, хотя он предназначен для слоев MapBox. Он отделен от MapBox iOS SDK, который является перезаписью, предназначенной для работы, как MapKit, но не основанной на ней.