使用Mapbox对注释进行聚类

时间:2017-07-15 20:43:32

标签: ios swift mapbox

我尝试在Mapbox for iOS中实现群集,并使用this example from Mapbox website

它工作正常,但我希望能够使用简单的MGLAnnotations放置在地图上并将它们聚集在一起,如果它们距离太近。

read here MGLShapeSource不仅接受外部geoJSON,还接受其他来源,例如折线和注释。但是当我用注释数组提供它时,没有发生聚类,我只是看到我的注释数组中的一堆标记:

let source = MGLShapeSource(identifier: "clusteredParkings", shapes: annotationsArray, options: [.clustered: true, .clusterRadius: 20])

当我将源交换回geoJSON时,一切都可以用于集群。 顺便说一句,没有错误或警告。

我做错了什么?有没有人有一个使用MGLAnnotations而不是geoJSON源文件的Mapbox集群的工作示例?

https://www.mapbox.com/ios-sdk/api/3.6.0/Classes/MGLShapeSource.html

2 个答案:

答案 0 :(得分:5)

我不久前对此进行了一些研究,而且在iOS上似乎无法实现。 Here是关于github的建议仍然是开放的。 Here是另一个问题,关于文档中没有提到它,但后来又添加了。

答案 1 :(得分:2)

  

有人有使用MGLAnnotations而不是geoJSON源文件的Mapbox集群工作示例吗?

给出样式

let style: MGLStyle

1)建立/获取您的[MGLPointFeature]

2)构建一个MGLShapeSource

let source = MGLShapeSource(identifier: "YOUR_IDENTIFIER_A", features: YOUR_ MGLPointFeature_ARRAY, options: [.clustered: true, .clusterRadius: YOUR_WIDTH])
style.addSource(source)

3)在标记未聚类时为标记建立样式

let markerLayer = MGLSymbolStyleLayer(identifier: "YOUR_IDENTIFIER_B", source: source)
    markerLayer.iconImageName = NSExpression(forConstantValue: "MARKER_IDENTIFIER")
    markerLayer.predicate = NSPredicate(format: "cluster != YES")
style.setImage(UIImage(named: "MARKER_IMAGE")!, forName: "MARKER_IDENTIFIER")

4)为集群构建样式

let clusterLayer = MGLSymbolStyleLayer(identifier: "YOUR_IDENTIFIER_C", source: source)
    clusterLayer.textColor = NSExpression(forConstantValue: UIColor.white)
    clusterLayer.textFontSize = NSExpression(forConstantValue: NSNumber(value: Double(YOUR_WIDTH) / 2.5))
    clusterLayer.iconAllowsOverlap = NSExpression(forConstantValue: true)
    clusterLayer.textOffset = NSExpression(forConstantValue: CGVector(dx: 0, dy: -0.2))
    clusterLayer.predicate = NSPredicate(format: "cluster == YES")
    style.setImage(UIImage(named: "CLUSTER_IMAGE")!, forName: "CLUSTER_IDENTIFIER")

5)您可以使用停止功能。这将使您可以根据聚类计数更改来更改聚类映像。

let stops = [
        10: NSExpression(forConstantValue: "CLUSTER_IMAGE"),
        50: NSExpression(forConstantValue: "ANOTHER_CLUSTER_IMAGE")
    ]

6)使用表达式根据定义的停止点设置每个聚类的图像,并在相应图像上显示点数

let defaultShape = NSExpression(forConstantValue: "CLUSTER_IDENTIFIER")
    clusterLayer.iconImageName = NSExpression(format: "mgl_step:from:stops:(point_count, %@, %@)", defaultShape, stops)
    clusterLayer.text = NSExpression(format: "CAST(point_count, 'NSString')")

7)在样式中添加图层

style.addLayer(markerLayer)
style.addLayer(clusterLayer)