{-# LANGUAGE CPP #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Data.Geometry.Geos.Topology (
envelope
, intersection
, convexHull
, difference
, symmetricDifference
, boundary
, union
, unaryUnion
, pointOnSurface
, centroid
, node
, delaunayTriangulation
) where
import Data.Geometry.Geos.Raw.Base
import Data.Geometry.Geos.Geometry
import qualified Data.Geometry.Geos.Raw.Topology as R
import qualified Data.Geometry.Geos.Raw.Geometry as RG
geo_1 ::( RG.GeomConst -> Geos RG.GeomConst )
-> Geometry a
-> Some Geometry
geo_1 f g = runGeos $ do
geo <- convertGeometryToRaw g
convertGeometryFromRaw =<< f geo
geo_2 :: (RG.GeomConst -> RG.GeomConst -> Geos RG.GeomConst )
-> Geometry a
-> Geometry b
-> Some Geometry
geo_2 f g1 g2 = runGeos $ do
g1' <- convertGeometryToRaw g1
g2' <- convertGeometryToRaw g2
convertGeometryFromRaw =<< f g1' g2'
envelope :: Geometry a -> Some Geometry
envelope = geo_1 R.envelope
intersection :: Geometry a -> Geometry b -> Some Geometry
intersection = geo_2 R.intersection
convexHull :: Geometry a -> Geometry Polygon
convexHull g = ensurePolygon $ geo_1 R.convexHull g
difference :: Geometry a -> Geometry b -> Some Geometry
difference = geo_2 R.difference
symmetricDifference :: Geometry a -> Geometry b -> Some Geometry
symmetricDifference = geo_2 R.symmetricDifference
boundary :: Geometry a -> Some Geometry
boundary = geo_1 R.boundary
union :: Geometry a -> Geometry b -> Some Geometry
union = geo_2 R.union
unaryUnion :: Geometry a -> Some Geometry
unaryUnion = geo_1 R.unaryUnion
pointOnSurface :: Geometry a -> Geometry Point
pointOnSurface g = ensurePoint $ geo_1 R.pointOnSurface g
centroid :: Geometry a -> Geometry Point
centroid g = ensurePoint $ geo_1 R.centroid g
node :: Geometry a -> Some Geometry
node = geo_1 R.node
delaunayTriangulation :: Geometry a -> Double -> Geometry MultiLineString
delaunayTriangulation g d = ensureMultiLineString (geo_1 (flip R.delaunayTriangulation $ d) g)
#if GEOS_VERSION_MAJOR > 3 && GEOS_VERSION_MINOR > 4
voronoiDiagram :: Geometry a -> Geometry b -> Double -> Bool -> Some Geometry
voronoiDiagram g env tol onlyEdges = runGeos $ do
g' <- convertGeometryToRaw g
env' <- convertGeometryToRaw env
convertGeometryFromRaw =<< R.voronoiDiagram g' env' tol onlyEndges
#endif