Отображение геотега фотографий на MapBox iOS (Swift) - PullRequest
0 голосов
/ 26 октября 2018

Я бы хотел получить что-то похожее на картинку. Я не знаю, как загрузить изображения в виде значков из URL. Данные изображения URL содержатся в формате json. Также хотелось бы поменять фон под количеством от общего количества тегов. Может ли кто-нибудь помочь мне и показать пример использования? Ссылка на фото ниже.

import Mapbox

   class ViewController: UIViewController, MGLMapViewDelegate {

   var mapView: MGLMapView!
   var icon: UIImage!
   var popup: UILabel?

   enum CustomError: Error {
      case castingError(String)
    }

   override func viewDidLoad() {
       super.viewDidLoad()

       mapView = MGLMapView(frame: view.bounds, styleURL: MGLStyle.lightStyleURL)
       mapView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
       mapView.tintColor = .darkGray
       mapView.delegate = self
       view.addSubview(mapView)

       let singleTap = UITapGestureRecognizer(target: self, action: #selector(handleMapTap(sender:)))
       for recognizer in mapView.gestureRecognizers! where recognizer is UITapGestureRecognizer {
          singleTap.require(toFail: recognizer)
       }
       mapView.addGestureRecognizer(singleTap)

       icon = UIImage(named: "port")
    }

    func mapView(_ mapView: MGLMapView, didFinishLoading style: MGLStyle) {
       let url = URL(fileURLWithPath: Bundle.main.path(forResource: "ports", ofType: "geojson")!)

       let source = MGLShapeSource(identifier: "clusteredPorts",url: url,options: [.clustered: true, .clusterRadius: icon.size.width])
       style.addSource(source)

       style.setImage(icon.withRenderingMode(.alwaysTemplate), forName: "icon")


       let ports = MGLSymbolStyleLayer(identifier: "ports", source: source)
       ports.iconImageName = NSExpression(forConstantValue: "icon")
       ports.iconColor = NSExpression(forConstantValue: UIColor.darkGray.withAlphaComponent(0.9))
       ports.predicate = NSPredicate(format: "cluster != YES")
       style.addLayer(ports)


       let stops = [
          20: UIColor.lightGray,
          50: UIColor.orange,
          100: UIColor.red,
          200: UIColor.purple
       ]


       let circlesLayer = MGLCircleStyleLayer(identifier: "clusteredPorts", source: source)
       circlesLayer.circleRadius = NSExpression(forConstantValue: NSNumber(value: Double(icon.size.width) / 2))
        circlesLayer.circleOpacity = NSExpression(forConstantValue: 0.75)
        circlesLayer.circleStrokeColor = NSExpression(forConstantValue: UIColor.white.withAlphaComponent(0.75))
       circlesLayer.circleStrokeWidth = NSExpression(forConstantValue: 2)
       circlesLayer.circleColor = NSExpression(format: "mgl_step:from:stops:(point_count, %@, %@)", UIColor.lightGray, stops)
       circlesLayer.predicate = NSPredicate(format: "cluster == YES")
       style.addLayer(circlesLayer)


       let numbersLayer = MGLSymbolStyleLayer(identifier: "clusteredPortsNumbers", source: source)
       numbersLayer.textColor = NSExpression(forConstantValue: UIColor.white)
       numbersLayer.textFontSize = NSExpression(forConstantValue: NSNumber(value: Double(icon.size.width) / 2))
       numbersLayer.iconAllowsOverlap = NSExpression(forConstantValue: true)
       numbersLayer.text = NSExpression(format: "CAST(point_count, 'NSString')")

       numbersLayer.predicate = NSPredicate(format: "cluster == YES")
       style.addLayer(numbersLayer)
    }
}

Example

1 Ответ

0 голосов
/ 26 октября 2018

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

MGLMapView также имеет эти методы для добавления или удаления аннотаций.

/ ** Добавление аннотации к представлению карты.

@ note MGLMultiPolyline, MGLMultiPolygon, MGLShapeCollection и MGLPointCollection объекты не могут быть добавлены вПросмотр карты в это время.Любой указанный объект многоточечной, многолинейной, многоугольной, фигурной или точечной коллекции игнорируется.

@ param annotation Объект аннотации, добавляемый в получатель.Этот объект должен соответствовать протоколу MGLAnnotation.Вид карты сохраняет объект аннотации.* / - (void) addAnnotation: (id) аннотация;

/ ** Добавляет массив аннотаций к представлению карты.

@ note MGLMultiPolyline, MGLMultiPolygon и MGLShapeCollection объекты не могут быть добавлены в представление карты в это время.Также не могут MGLMultiPoint объекты, которые не являются экземплярами MGLPolyline или MGLPolygon.Любые указанные объекты многоточечной, многополилинной, мультиполигональной или коллекционной формы молча игнорируются.

@ param annotations Массив объектов аннотаций.Каждый объект в массиве должен соответствовать протоколу MGLAnnotation.Вид карты сохраняет каждый отдельный объект аннотации.* / - (void) addAnnotations: (NS_ARRAY_OF (id) *) аннотации;

/ ** Удаляет аннотацию из вида карты, отменяя выбор, если она выбрана.

Удаление аннотацииобъект полностью отделяет его от вида карты, предотвращая его отображение на карте.Таким образом, вы обычно вызываете этот метод только тогда, когда хотите скрыть или удалить данную аннотацию.

@ param annotation Объект аннотации для удаления.Этот объект должен соответствовать протоколу MGLAnnotation * / - (void) removeAnnotation: (id) annotation;

/ ** Удаляет массив аннотаций из вида карты, отменяя выбор любых выбранных аннотаций в массиве.

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

@ param annotations Массив объектов аннотаций, которые нужно удалить.Объекты в массиве должны соответствовать протоколу MGLAnnotation.* / - (void) removeAnnotations: (NS_ARRAY_OF (id) *) аннотации;

Итак, первым шагом будет добавление аннотаций к представлению карты с помощью указанных выше методов.Затем MGLMapView вызовет один из своих методов делегата, приведенных ниже:

func mapView(_ mapView: MGLMapView, viewFor annotation: MGLAnnotation) -> MGLAnnotationView?

Вам просто нужно вернуть соответствующий вид.способ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...