Вычислительный союз 2 МК Полигонов - PullRequest
2 голосов
/ 23 июля 2011

Я работаю над картами приложений с многоугольниками MKOverlays. У меня есть требование объединить (объединить) перекрывающиеся полигоны.

Есть ли известный алгоритм для этого? Существуют ли какие-либо бесплатные существующие библиотеки / реализации, которые помогают с такими геометрическими операциями?

Я нашел библиотеку GEOS, но, видимо, ее условия лицензирования запрещают использование без распространения вашего исходного кода. Кто-нибудь еще использует эту библиотеку? Если да, где я могу найти способ включить это в мой проект Xcode.

Ответы [ 3 ]

1 голос
/ 23 июля 2011

Единственные свободные библиотеки, о которых я знаю, -

Clipper: http://angusj.com/delphi/clipper.php

Boost Polygon: http://www.boost.org/doc/libs/1_47_0/libs/polygon/doc/index.htm

BoostГеометрия: http://trac.osgeo.org/ggl/

0 голосов
/ 28 августа 2018

Есть отличная библиотека RSClipperWrapper , которая в основном является оберткой для Clipper .На их веб-сайте есть даже отличное сравнение библиотек:

enter image description here

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
     }
    }
    
0 голосов
/ 23 июля 2011

Попробуйте gpc .У них есть несколько лицензий.Также есть похожие библиотеки на их странице.

...