Оповещения о кластеризации Mapbox - PullRequest
0 голосов
/ 23 января 2020

Разработка приложения 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...