Можно ли кластеризовать MKPolygon на mapView в ios - PullRequest
0 голосов
/ 05 октября 2018

У меня есть требование, когда из API поступают почти сотни данных о многоугольниках, и я должен быстро нарисовать их на карте.

Сейчас требуется значительное время, чтобы нарисовать 50 полигонов на карте одновременно.Поэтому я думаю, как сгруппировать эти полигоны и рисовать / показывать, только когда я прижимаюсь к региону.Я только читал о MKClusterAnnotation, но никогда не слышал о кластеризации полигонов.Есть ли другой способ оптимизировать рисование многоугольника?

1 Ответ

0 голосов
/ 05 октября 2018

Его невозможно в кластер MKPolygon с, но вы можете объединить MKPolygon с, используя библиотеку MKPolygon-GPC .

Пример ниже, используя этотбиблиотека создает объединение двух MKPolygon объектов:

if let mergedPolygon = polygon1.fromUnion(with: polygon2) {
    // Use the mergedPolygon
}

Также можно проверить, пересекаются ли два многоугольника, например, ниже она проверяет, пересекаются ли два многоугольника, затем она сливается:

if polygon1.fromIntersection(with: polygon2) != nil, let mergedPolygon = polygon1.fromUnion(with: polygon2), merged.pointCount > 3 {
    // Use the mergedPolygon
}

Ниже приведено расширение MKPolygon Array, которое можно использовать для объединения как можно большего числа MKPolygon s:

extension Array where Element == MKPolygon {

    var merged: [MKPolygon] {
        guard self.count > 1 else { return self }

        var count: Int!
        var polygons = self
        repeat {
            count = polygons.count
        } while self.merge(&polygons, indexes: (0..<count).map({ $0+1..<count }))
        return polygons
    }

    private func merge(_ polygons: inout [MKPolygon], indexes: [Range<Int>]) -> Bool {
        for (index, array) in indexes.enumerated() {
            for i in array {
                if polygons[index].fromIntersection(with: polygons[i]) != nil, let polygon = polygons[index].fromUnion(with: polygons[i]), polygon.pointCount > 3 {
                    polygons[index] = polygon
                    polygons.remove(at: i)
                    return true
                }
            }
        }
        return false
    }

}

Usage-1 использует полигонов массив [MKPolygon]:

let result: [MKPolygon] = polygons.merged

Использование-2 использует координаты массив [[CLLocationCoordinate2D]]:

let result: [MKPolygon] = coordinates.map({
    MKPolygon(coordinates: $0, count: $0.count, interiorPolygons: nil)
}).merged
...