首页 > 解决方案 > MapBox:MGLineStyleLayer 绘制在 Annotations 上

问题描述

我正在尝试将注释和 MGLineStyleLayer 添加到 mapView。我已成功添加它们,但 LineLayer 绘制在注释上方。我希望在线条图层上绘制注释。这是我的实现

 /*This is where i am adding the markers*/
    func createMapPoints(points: [CLLocationCoordinate2D], dashed: Bool = false) {
        var waypointType: MapAnnotationEnum = .waypointAnnotation
        if dashed {
            waypointType = .offsetWaypoint
        }
        addLineLabel(points: points, width: 7, color: UIColor.white, dashed: dashed)
        for point in points {
            _ = addAnnotationLabel(location: point, title: "WP", type: waypointType)
        }
    }

    func addAnnotationLabel(location: CLLocationCoordinate2D, title: String, type: MapAnnotationEnum) -> CustomMapGLAnnotaion {
        let annotation = CustomMapGLAnnotaion()
        annotation.coordinate = location
        annotation.title = title
        annotation.annotationType = type
        self.mapView.addAnnotation(annotation)
        return annotation
    }

    func addLineLabel(points: [CLLocationCoordinate2D], width: CGFloat, color: UIColor, dashed: Bool = false) {
        let polyline = CustomMapGLPolyline(coordinates: points, count: UInt(points.count))
        polyline.width = width
        polyline.color = color
        shapeCount += 1
        if dashed {
            polyline.title = "dashed"
            addDashedLine(polyline: polyline)
        } else {
            polyline.title = "0"
            addCasingLine(polyline: polyline)
        }
            print("Last Execution Point 3")
            self.mapView.addAnnotation(polyline)
    }

    func addCasingLine(polyline: MGLPolyline) {
        guard let style = self.mapView.style else { return }

        let source = MGLShapeSource(identifier: "line\(shapeCount)", shape: polyline, options: nil)
        style.addSource(source)

        style.layer(withIdentifier: )
        let lineLayer = MGLLineStyleLayer(identifier: "line-layer\(shapeCount)", source: source)
        lineLayer.lineJoin = NSExpression(forConstantValue: "round")
        lineLayer.lineCap = NSExpression(forConstantValue: "round")
        lineLayer.lineColor = NSExpression(forConstantValue: #colorLiteral(red: 0.1254901961, green: 0.4901960784, blue: 0.9137254902, alpha: 1))
        lineLayer.lineOpacity = NSExpression(forConstantValue: 1)
        lineLayer.lineWidth = NSExpression(format: "mgl_interpolate:withCurveType:parameters:stops:($zoomLevel, 'linear', nil, %@)", [14: 4, 18: 4])
        style.addLayer(lineLayer)
    }

    func addDashedLine(polyline: MGLPolyline) {
        guard let style = self.mapView.style else { return }
        let source = MGLShapeSource(identifier: "line\(shapeCount)", shape: polyline, options: nil)
        style.addSource(source)
        let dashedLayer = MGLLineStyleLayer(identifier: "polyline-dash\(shapeCount)", source: source)
        dashedLayer.lineJoin = NSExpression(forConstantValue: "round")
        dashedLayer.lineCap = NSExpression(forConstantValue: "round")
        dashedLayer.lineColor = NSExpression(forConstantValue: #colorLiteral(red: 0.9411764706, green: 0.3764705882, blue: 0.1921568627, alpha: 1))
        dashedLayer.lineOpacity = NSExpression(forConstantValue: 1)
        dashedLayer.lineWidth = NSExpression(format: "mgl_interpolate:withCurveType:parameters:stops:($zoomLevel, 'linear', nil, %@)", [14: 4, 18: 4])
        dashedLayer.lineDashPattern = NSExpression(forConstantValue: [0, 1.5])
        style.addLayer(dashedLayer)
    }


这是两个自定义类的定义

  class CustomMapGLAnnotaion: MGLPointAnnotation {

    var annotationType: MapAnnotationEnum?
    override init() {
        super.init()
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    }

   class CustomMapGLPolyline: MGLPolyline {

    var width: CGFloat?
    var color: UIColor?
    override init() {
        super.init()
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
  }

我哪里错了?感谢您的帮助!

标签: iosswiftmapboxmglmapview

解决方案


对于那些在未来寻找答案的人!

因为MGLAnnotationView继承自一个UIView对象。zIndex我们可以简单地通过设置它的属性来决定注释特征的顺序。


根据https://docs.mapbox.com/ios/maps/overview/markers-and-annotations/


推荐阅读