Можно ли кластеризовать MKPolygon на mapView в ios
У меня есть требование, когда из API поступают почти сотни данных о многоугольниках, и я должен быстро их нарисовать на карте.
Прямо сейчас требуется значительное время, чтобы нарисовать 50 полигонов на карте одновременно. Поэтому я думаю, как сгруппировать эти полигоны и рисовать / показывать, только когда я прижимаюсь к региону. Я читаю только о MKClusterAnnotation
но никогда не слышал о кластеризации полигонов. Есть ли другой способ оптимизировать рисование полигонов?
1 ответ
Не возможно кластеризовать 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
Расширение массива, которое вы можете использовать, чтобы объединить как можно больше 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
}
}
Использование-1 использует массив полигонов [MKPolygon]
:
let result: [MKPolygon] = polygons.merged
Использование-2 использует массив координат [[CLLocationCoordinate2D]]
:
let result: [MKPolygon] = coordinates.map({
MKPolygon(coordinates: $0, count: $0.count, interiorPolygons: nil)
}).merged