ios - 是否可以在 ios 的 mapView 上集群 MKPolygon

标签 ios mapkit mkmapview mkpolygon

我有一个要求,其中有将近数百个来自 API 的多边形数据,我必须在 map 中快速绘制它们。

现在一次在 map 上绘制 50 个多边形需要花费大量时间。所以我在想一种方法来聚集这些多边形&只有在我捏到一个区域时才绘制/显示。我只读过 MKClusterAnnotation 但从未听说过聚类多边形。有没有其他方法可以优化绘图多边形?

最佳答案

不可能MKPolygon 聚类,但您可以使用 MKPolygon-GPC 合并 MKPolygon图书馆。

下面使用此库的示例创建了两个 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:

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

Usage-2 使用坐标数组[[CLLocationCoordinate2D]]:

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

关于ios - 是否可以在 ios 的 mapView 上集群 MKPolygon,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52660986/

相关文章:

ios - 如何知道搜索栏文本何时更改

ios - 在任何滚动或表格重新加载后,在 TableView 中使用计时器重新创建计时器

ios - 减去两个 MKCircle 或者如何在 MapKit 的 map 上画一个环?

ios - viewForAnnotation 没有被解雇

ios - 检测对标注标题的点击

ios - 在 MKMapView 上尝试多个注释时出现 SIGABRT 错误

ios - 单击注释两次并在第二次单击时执行操作

ios - 在另一个类中滑动手势识别器

ios - 向框架请求位置许可?

ios - 使用 AVAudioPlayer 添加 iPod 均衡器效果