我尝试在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
答案 0 :(得分:5)
答案 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)