【问题标题】:Computing the union 2 MKPolygons计算并集 2 MKPolygons
【发布时间】:2011-07-22 21:45:05
【问题描述】:

我正在使用多边形 MKOverlays 开发地图应用程序。我需要合并(联合)重叠多边形。

有没有一种众所周知的算法可以做到这一点?是否有任何免费的现有库/实现可以帮助进行此类几何操作?

我找到了 GEOS 库,但显然它的许可条款不允许在不分发您的源代码的情况下使用。有没有其他人在使用这个库。如果是,我在哪里可以找到将它包含在我的 Xcode 项目中的方法。

【问题讨论】:

    标签: objective-c ios geometry polygon


    【解决方案1】:

    我知道的唯一 免费 库是 -

    快船: http://angusj.com/delphi/clipper.php

    增强多边形: http://www.boost.org/doc/libs/1_47_0/libs/polygon/doc/index.htm

    增强几何: http://trac.osgeo.org/ggl/

    【讨论】:

      【解决方案2】:

      试试gpc。他们有几个许可证。他们的页面上也列出了类似的库。

      【讨论】:

        【解决方案3】:

        有一个很棒的库RSClipperWrapper,它基本上是Clipper 的包装器。他们的网站内甚至还有一个很棒的库比较:

        TL;DR,免费库,无错误且快速。

        几点说明:

        • RSClipperWrapper 接受 CGPoint 但不要担心,您可以将 lat/long 传递给它,它会完成工作(经过测试和验证)。
        • 为了说服我已经写了一个扩展,这样我们就可以传递一个自定义的Polygon 数组并获得合并的多边形 - 如果您使用的是MKPolygon 或其他类型,那么不要忘记调整您的类型

          extension Clipper {
            static func union(polygons: [Polygon]) -> [Polygon] {
              let pointsPolygons = convert(polygons: polygons)
              let unionfied = Clipper.unionPolygons(pointsPolygons, withPolygons: pointsPolygons)
              return convert(pointsPolygons: unionfied)
             }
          
            static func convert(polygons: [Polygon]) -> [[CGPoint]] {
              var polygonsPoints: [[CGPoint]] = []
              for polygon in polygons {
                  var points: [CGPoint] = []
                  for location in polygon.locations {
                      points.append(CGPoint(x: location.coordinate.latitude, y: location.coordinate.longitude))
                  }
                  polygonsPoints.append(points)
              }
              return polygonsPoints
             }
          
            static func convert(pointsPolygons: [[CGPoint]]) -> [Polygon] {
              var polygons: [Polygon] = []
              for pointsPolygon in pointsPolygons {
                  var locations: [CLLocation] = []
                  for point in pointsPolygon {
                      locations.append(CLLocation(latitude: CLLocationDegrees(point.x), longitude: CLLocationDegrees(point.y)))
                  }
                  let polygon = Polygon(locations: locations)
                  polygons.append(polygon)
              }
              return polygons
           }
          }
          

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-07-31
          • 2014-09-18
          • 1970-01-01
          • 2011-06-05
          • 1970-01-01
          • 1970-01-01
          • 2017-09-14
          • 1970-01-01
          相关资源
          最近更新 更多