geos-0.2.1: src/Data/Geometry/Geos/Topology.hs
{-# 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'
-- | Returns a Polygon that represents the bounding envelope of this geometry. Note that it can also return a Point if the input geometry is a point.
envelope :: Geometry a -> Some Geometry
envelope = geo_1 R.envelope
-- | Returns a Geometry representing the points shared by both geometries.
intersection :: Geometry a -> Geometry b -> Some Geometry
intersection = geo_2 R.intersection
-- | Returns the smallest Polygon that contains all the points in the geometry.
convexHull :: Geometry a -> Geometry Polygon
convexHull g = ensurePolygon $ geo_1 R.convexHull g
-- | Returns a Geometry representing the points making up this geometry that do not make up other.
difference :: Geometry a -> Geometry b -> Some Geometry
difference = geo_2 R.difference
-- | Returns a Geometry combining the points in this geometry not in other, and the points in other not in this geometry.
symmetricDifference :: Geometry a -> Geometry b -> Some Geometry
symmetricDifference = geo_2 R.symmetricDifference
boundary :: Geometry a -> Some Geometry
boundary = geo_1 R.boundary
-- | Returns a Geometry representing all the points in both geometries.
{-| Computes the union of all the elements of this geometry. Heterogeneous GeometryCollections are fully supported.
The result obeys the following contract:
Unioning a set of LineStrings has the effect of fully noding and dissolving the linework.
Unioning a set of Polygons will always return a Polygonal geometry (unlike {link #union(Geometry)}, which may return geometrys of lower dimension if a topology collapse occurred.
-}
union :: Geometry a -> Geometry b -> Some Geometry
union = geo_2 R.union
unaryUnion :: Geometry a -> Some Geometry
unaryUnion = geo_1 R.unaryUnion
-- | Computes and returns a Point guaranteed to be on the interior of this geometry.
pointOnSurface :: Geometry a -> Geometry Point
pointOnSurface g = ensurePoint $ geo_1 R.pointOnSurface g
-- | Returns a Point object representing the geometric center of the geometry. The point is not guaranteed to be on the interior of the geometry.
centroid :: Geometry a -> Geometry Point
centroid g = ensurePoint $ geo_1 R.centroid g
node :: Geometry a -> Some Geometry
node = geo_1 R.node
-- | Return a Delaunay triangulation of the vertex of the given geometry @g@, where @tol@ is the snapping tolerance to use.
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