{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Data.Geometry.Geos.Serialize (
readHex
, readLotsOfHex
, writeHex
, readWkt
, writeWkt
) where
import Data.Geometry.Geos.Raw.Base
import Data.Geometry.Geos.Geometry
import qualified Data.Geometry.Geos.Raw.Serialize as S
import qualified Data.Geometry.Geos.Raw.Geometry as R
import qualified Data.ByteString.Char8 as BC
import Data.Maybe (catMaybes)
readHex :: BC.ByteString -> Maybe (Some Geometry)
readHex bs = runGeos $ do
r <- S.createReader
g <- S.readHex r bs
case g of
Just g' -> Just <$> convertGeometryFromRaw g'
Nothing -> return Nothing
readLotsOfHex :: [BC.ByteString] -> [Some Geometry]
readLotsOfHex bs = runGeos $ do
r <- S.createReader
x <- traverse (S.readHex r) bs
traverse convertGeometryFromRaw $ catMaybes x
writeHex :: Geometry a -> BC.ByteString
writeHex g = runGeos $ do
w <- S.createWriter
r :: R.Geom <- convertGeometryToRaw g
S.writeHex w r
readWkt :: Maybe Int -> BC.ByteString -> Maybe (Some Geometry)
readWkt srid bs = runGeos $ do
r <- S.createWktReader
g <- S.readWkt r bs
case g of
Just g' -> do
g'' <- R.setSRID srid g'
Just <$> convertGeometryFromRaw g''
Nothing -> return Nothing
writeWkt :: Geometry a -> BC.ByteString
writeWkt g = runGeos $ do
w <- S.createWktWriter
r :: R.Geom <- convertGeometryToRaw g
S.writeWkt w r