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

Posted

技术标签:

【中文标题】是否可以在 ios 的 mapView 上集群 MKPolygon【英文标题】:Is it possible to cluster MKPolygon on mapView in ios 【发布时间】:2018-10-05 08:01:34 【问题描述】:

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

现在一次在地图上绘制 50 个多边形需要很长时间。所以我正在考虑一种方法来聚集这些多边形并且只在我捏到一个区域时才绘制/显示。我只读过MKClusterAnnotation,但从未听说过聚类多边形。有没有其他方法可以优化绘制多边形?

【问题讨论】:

【参考方案1】:

不可能集群MKPolygons,但您可以使用MKPolygon-GPC 库合并MKPolygons。

以下示例使用此库创建了两个 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 数组扩展,您可以使用它来合并尽可能多的MKPolygons:

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

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

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

【讨论】:

我会尽力让你知道的。谢谢。 @Poles 如果您尝试过,可以分享示例代码吗?我需要对折线和多边形进行聚类。

以上是关于是否可以在 ios 的 mapView 上集群 MKPolygon的主要内容,如果未能解决你的问题,请参考以下文章

在 ios Mapview 上绘制折线

React Native mapview:标记未在IOS上显示

MapView iOS 上的问题

具有集群的 mapView(_:didAdd:) 中的 MapKit 运行时错误

iOS mapView - 只需轻轻一按即可拖动图钉

ios7 mapview注释按钮不显示