{-# LANGUAGE ScopedTypeVariables #-}
module Data.Geometry.Geos.Topology
( envelope
, intersection
, convexHull
, difference
, symmetricDifference
, boundary
, union
, unaryUnion
, pointOnSurface
, centroid
, node
, delaunayTriangulation
, voronoiDiagram
, polygonize
, minimumRotatedRectangle
, minimumClearance
, minimumClearanceLine
, minimumWidth
)
where
import Control.Monad
import qualified Data.Vector as V
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 -> Maybe (Some Geometry)
geo_1 f g = runGeosM $ do
geo <- convertGeometryToRaw g
convertGeometryFromRaw =<< f geo
geo_2
:: (RG.GeomConst -> RG.GeomConst -> Geos RG.GeomConst)
-> Geometry a
-> Geometry b
-> Maybe (Some Geometry)
geo_2 f g1 g2 = runGeosM $ do
g1' <- convertGeometryToRaw g1
g2' <- convertGeometryToRaw g2
convertGeometryFromRaw =<< f g1' g2'
envelope :: Geometry a -> Maybe (Some Geometry)
envelope = geo_1 R.envelope
intersection :: Geometry a -> Geometry b -> Maybe (Some Geometry)
intersection = geo_2 R.intersection
convexHull :: Geometry a -> Maybe (Geometry Polygon)
convexHull g = ensurePolygon =<< geo_1 R.convexHull g
difference :: Geometry a -> Geometry b -> Maybe (Some Geometry)
difference = geo_2 R.difference
symmetricDifference :: Geometry a -> Geometry b -> Maybe (Some Geometry)
symmetricDifference = geo_2 R.symmetricDifference
boundary :: Geometry a -> Maybe (Some Geometry)
boundary = geo_1 R.boundary
union :: Geometry a -> Geometry b -> Maybe (Some Geometry)
union = geo_2 R.union
unaryUnion :: Geometry a -> Maybe (Some Geometry)
unaryUnion = geo_1 R.unaryUnion
pointOnSurface :: Geometry a -> Maybe (Geometry Point)
pointOnSurface = ensurePoint <=< geo_1 R.pointOnSurface
centroid :: Geometry a -> Maybe (Geometry Point)
centroid = ensurePoint <=< geo_1 R.centroid
node :: Geometry a -> Maybe (Some Geometry)
node = geo_1 R.node
delaunayTriangulation :: Geometry a
-> Double
-> Bool
-> Maybe (Some Geometry)
delaunayTriangulation g d onlyEdges =
geo_1 (\g' -> R.delaunayTriangulation g' d onlyEdges) g
voronoiDiagram :: Geometry a
-> Maybe (Geometry b)
-> Double
-> Bool
-> Some Geometry
voronoiDiagram g menv tol onlyEdges = runGeos $ do
g' :: RG.GeomConst <- convertGeometryToRaw g
env' <- traverse convertGeometryToRaw menv
convertGeometryFromRaw =<< R.voronoiDiagram g' env' tol onlyEdges
polygonize :: V.Vector (Geometry a) -> Maybe (Geometry Polygon)
polygonize vec =
ensurePolygon
=<< (runGeosM $ do
listGeom :: [RG.Geom] <- traverse convertGeometryToRaw $ V.toList vec
pgon <- R.polygonize listGeom
convertGeometryFromRaw pgon
)
minimumRotatedRectangle :: Geometry a -> Maybe (Geometry Polygon)
minimumRotatedRectangle = ensurePolygon <=< geo_1 R.minimumRotatedRectangle
minimumWidth :: Geometry a -> Maybe (Geometry LineString)
minimumWidth = ensureLineString <=< geo_1 R.minimumWidth
minimumClearance :: Geometry a -> Maybe Double
minimumClearance geom = runGeosM $ do
raw :: RG.Geom <- convertGeometryToRaw geom
R.minimumClearance raw
minimumClearanceLine :: Geometry a -> Maybe (Geometry LineString)
minimumClearanceLine = ensureLineString <=< geo_1 R.minimumClearanceLine