{-# LANGUAGE CPP #-}
module Data.Geometry.Geos.Raw.Topology (
envelope
, intersection
, convexHull
, difference
, symmetricDifference
, boundary
, union
, unaryUnion
, pointOnSurface
, centroid
, node
, delaunayTriangulation
) where
import qualified Data.Geometry.Geos.Raw.Internal as I
import Data.Geometry.Geos.Raw.Base
import qualified Data.Geometry.Geos.Raw.Geometry as R
import Foreign
geo_1 :: R.Geometry a
=> (I.GEOSContextHandle_t -> Ptr I.GEOSGeometry -> IO (Ptr I.GEOSGeometry))
-> String
-> a
-> Geos a
geo_1 f s g =
withGeos $ \h ->
R.withGeometry g $ \gp -> do
ptr <- throwIfNull s $ f h gp
R.constructGeometry h ptr
geo_2 :: R.Geometry a
=> (I.GEOSContextHandle_t -> Ptr I.GEOSGeometry -> Ptr I.GEOSGeometry -> IO (Ptr I.GEOSGeometry))
-> String
-> a
-> a
-> Geos a
geo_2 f s g1 g2 = do
withGeos $ \h ->
R.withGeometry g1 $ \gp ->
R.withGeometry g2 $ \gp2 -> do
ptr <- throwIfNull s $ f h gp gp2
R.constructGeometry h ptr
envelope :: R.Geometry a => a -> Geos a
envelope = geo_1 I.geos_Envelope "envelope"
intersection :: R.Geometry a => a -> a -> Geos a
intersection = geo_2 I.geos_Intersection "intersection"
convexHull :: R.Geometry a => a -> Geos a
convexHull = geo_1 I.geos_ConvexHull "convexHull"
difference :: R.Geometry a => a -> a -> Geos a
difference = geo_2 I.geos_Difference "difference"
symmetricDifference :: R.Geometry a => a -> a-> Geos a
symmetricDifference = geo_2 I.geos_SymDifference "symmetricDifference"
boundary :: R.Geometry a => a -> Geos a
boundary = geo_1 I.geos_Boundary "boundary"
union :: R.Geometry a => a -> a -> Geos a
union = geo_2 I.geos_Union "union"
unaryUnion :: R.Geometry a => a -> Geos a
unaryUnion = geo_1 I.geos_UnaryUnion "unaryUnion"
pointOnSurface :: R.Geometry a => a -> Geos a
pointOnSurface = geo_1 I.geos_PointsOnSurface "pointOnSurface"
centroid :: R.Geometry a => a -> Geos a
centroid = geo_1 I.geos_GetCentroid "getCentroid"
node :: R.Geometry a => a -> Geos a
node = geo_1 I.geos_Node "node"
delaunayTriangulation :: R.Geometry a => a -> Double -> Geos a
delaunayTriangulation g tol = do
withGeos $ \h -> do
R.withGeometry g $ \gp -> do
ptr <- throwIfNull "delaunayTriangulation" $ I.geos_DelaunayTriangulation h gp (realToFrac tol) $ fromBool True
R.constructGeometry h ptr
#if GEOS_VERSION_MAJOR > 3 && GEOS_VERSION_MINOR > 4
voronoiDiagram :: R.Geometry a => a -> Maybe a -> Double -> Bool -> Geos a
voronoiDiagram g menv tol oe = do
withGeos $ \h ->
R.withGeometry g $ \gp ->
R.withMaybeGeometry env $ \ep ->
ptr <- throwIfNull "voronoiDiagram" $ I.geos_VoronoiDiagram hp gp ep (realToFrac tol) $ fromBool oe
R.constructGeometry h ptr
#endif