module Data.Wkb
( parseByteString
, parseHexByteString
, toByteString
) where
import qualified Data.Binary.Get as BinaryGet
import qualified Data.ByteString.Builder as ByteStringBuilder
import qualified Data.ByteString.Lazy as LazyByteString
import qualified Data.Geospatial as Geospatial
import qualified Data.Hex as Hex
import qualified Data.Internal.Wkb.Endian as Endian
import qualified Data.Internal.Wkb.Geometry as Geometry
import qualified Data.Internal.Wkb.Geospatial as WkbGeospatial
parseByteString :: LazyByteString.ByteString -> Either String Geospatial.GeospatialGeometry
parseByteString :: ByteString -> Either String GeospatialGeometry
parseByteString ByteString
byteString =
case Get GeospatialGeometry
-> ByteString
-> Either
(ByteString, ByteOffset, String)
(ByteString, ByteOffset, GeospatialGeometry)
forall a.
Get a
-> ByteString
-> Either
(ByteString, ByteOffset, String) (ByteString, ByteOffset, a)
BinaryGet.runGetOrFail
((EndianType -> Get WkbGeometryType) -> Get GeospatialGeometry
WkbGeospatial.getGeospatialGeometry EndianType -> Get WkbGeometryType
Geometry.getWkbGeom)
ByteString
byteString of
Left (ByteString
_, ByteOffset
_, String
err) -> String -> Either String GeospatialGeometry
forall a b. a -> Either a b
Left (String -> Either String GeospatialGeometry)
-> String -> Either String GeospatialGeometry
forall a b. (a -> b) -> a -> b
$ String
"Could not parse wkb: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
err
Right (ByteString
_, ByteOffset
_, GeospatialGeometry
geoSpatialGeometry) -> GeospatialGeometry -> Either String GeospatialGeometry
forall a b. b -> Either a b
Right GeospatialGeometry
geoSpatialGeometry
parseHexByteString :: Hex.Hex -> Either String Geospatial.GeospatialGeometry
parseHexByteString :: Hex -> Either String GeospatialGeometry
parseHexByteString = (ByteString -> Either String GeospatialGeometry)
-> Hex -> Either String GeospatialGeometry
Hex.safeConvert ByteString -> Either String GeospatialGeometry
parseByteString
toByteString :: Endian.EndianType -> Geospatial.GeospatialGeometry -> LazyByteString.ByteString
toByteString :: EndianType -> GeospatialGeometry -> ByteString
toByteString EndianType
endianType =
Builder -> ByteString
ByteStringBuilder.toLazyByteString (Builder -> ByteString)
-> (GeospatialGeometry -> Builder)
-> GeospatialGeometry
-> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. BuilderWkbGeometryType
-> EndianType -> GeospatialGeometry -> Builder
WkbGeospatial.builderGeospatialGeometry BuilderWkbGeometryType
Geometry.builderWkbGeom EndianType
endianType