是否可以在 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】:不可能集群MKPolygon
s,但您可以使用MKPolygon-GPC 库合并MKPolygon
s。
以下示例使用此库创建了两个 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
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的主要内容,如果未能解决你的问题,请参考以下文章
React Native mapview:标记未在IOS上显示