Различные значки для каждой функции в Коллекции функций

У меня есть коллекция функций geojson. Я хочу установить для каждого из них различную базу значков в соответствии с их атрибутами. Но я не мог найти как. На данный момент я могу просто установить одно изображение для всего слоя. Можно ли установить для каждой функции отдельный значок?

func drawPoint(geoJson : String , id: String) {
    DispatchQueue.global(qos: .background).async(execute: {
        do {
            let data = geoJson.data(using: .utf8)
            let id = "kgm-\(id)"
            guard let shapeCollectionFeature = try MGLShape(data: data!, encoding: String.Encoding.utf8.rawValue) as? MGLShapeCollectionFeature else {
                fatalError("Could not cast to specified MGLShapeCollectionFeature")
            }

            let source = MGLShapeSource(identifier: id, shape: shapeCollectionFeature, options: nil)
            self.mapView.style?.addSource(source)

            let pointLayer = MGLSymbolStyleLayer(identifier: id, source: source)
            let zoomStops = [
                13.49: NSExpression(forConstantValue: 0),
                13.5: NSExpression(forConstantValue: 1)
            ]

            pointLayer.iconOpacity = NSExpression(format: "mgl_interpolate:withCurveType:parameters:stops:($zoomLevel, 'linear', nil, %@)", zoomStops)
            pointLayer.iconImageName = NSExpression(forConstantValue: id)
            pointLayer.iconAllowsOverlap = NSExpression(forConstantValue: true)
            self.mapView.style!.addLayer(pointLayer)
        } catch {
            print("GeoJSON parsing failed")
        }
    })
}

person burak kaya    schedule 31.07.2019    source источник


Ответы (1)


Вам может потребоваться задайте имя изображения в стиле. Это добавляет указанное изображение к изображениям стиля.

Если вы хотите применить стиль к iconImageName на основе значения id, вы также можете попробовать использовать NSExpression(forKeyPath:) вместо NSExpression(forConstantValue:). Например:

pointLayer.iconImageName = NSExpression(forKeyPath: id)

Некоторые примеры, которые могут быть вам полезны:

Кроме того, вы можете добавить источник и слой к стилю в основном потоке. Добавление слоев стилей в фоновый поток может привести к неожиданному поведению.

person jmkiley    schedule 31.07.2019