Разработка приложения ios с функциональными возможностями кластерных точек данных mapbox. Я могу строить иконки, но когда я уменьшаю их, иконки не группируются, как я ожидаю. Код практически идентичен примеру кластеризации точек данных в mapbox. Основное отличие заключается в том, что вместо использования URL-адреса в источнике формы я использую массив MGLPointFeature. Я убедился, что форма круга также находится на карте, закомментировав предикат с условием кластера == "ДА", и я вижу, что форма круга, используемая в качестве значка кластеризации, также нанесена на карту. Это просто условие никогда не выполняется.
Вот мой код:
func generateAlertClusterShapeSource(alerts : [NDVIAlert]) -> MGLShapeSource {
let featureArray = generateAlertClusterFeatureArray()
return MGLShapeSource(identifier: Coordinator.MapBoxIdentifier.ndviClusterAlert.rawValue, shapes: featureArray, options: [.clustered: true, .clusterRadius: icon!.size.width])
}
func generateAlertClusterFeatureArray() -> [MGLPointFeature] {
var featureArray = [MGLPointFeature]()
for alert in alerts {
if (alert.geometry != nil) {
if let alertFeature = try? MGLShape(data: alert.geometry!, encoding: String.Encoding.utf8.rawValue) as? MGLMultiPolygonFeature {
let center = MGLPointFeature()
center.identifier = alert.id
center.coordinate = getCenterOfBounds(bounds: alertFeature.overlayBounds)
featureArray.append(center)
OSLog.mapView.info("Cluster icon for alert \(alertFeature) added to the feature array.")
} else {
OSLog.mapView.error("Could not create cluster icon from alert geometry.")
}
} else {
OSLog.mapView.error("Cluster with alert id \(alert.id) does not have a geometry.")
}
}
return featureArray
}
func getCenterOfBounds(bounds: MGLCoordinateBounds) -> CLLocationCoordinate2D {
let pointALat : Double = bounds.ne.latitude * .pi / 180
let pointBLat : Double = bounds.sw.latitude * .pi / 180
let pointALon : Double = bounds.ne.longitude * .pi / 180
let pointBLon : Double = bounds.sw.longitude * .pi / 180
let distanceLon : Double = pointBLon - pointALon
let x : Double = cos(pointBLat) * cos(distanceLon)
let y : Double = cos(pointBLat) * sin(distanceLon)
let centerLat : Double = atan2( sin(pointALat) + sin(pointBLat), sqrt((cos(pointALat) + x) * (cos(pointALat) + x) + y * y))
let centerLon : Double = pointALon + atan2(y, cos(pointALat) + x)
let centerCoordinate : CLLocationCoordinate2D = CLLocationCoordinate2D(latitude: centerLat * 180 / .pi, longitude: centerLon * 180 / .pi)
return centerCoordinate
}