haskell-postgis 0.1.0.1 → 0.1.0.2
raw patch · 6 files changed
+36/−23 lines, 6 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
+ Database.Postgis: GeoLineString :: SRID -> LineString -> Geometry
+ Database.Postgis: GeoMultiLineString :: SRID -> MultiLineString -> Geometry
+ Database.Postgis: GeoMultiPoint :: SRID -> MultiPoint -> Geometry
+ Database.Postgis: GeoMultiPolygon :: SRID -> MultiPolygon -> Geometry
+ Database.Postgis: GeoPoint :: SRID -> Point -> Geometry
+ Database.Postgis: GeoPolygon :: SRID -> Polygon -> Geometry
+ Database.Postgis: LineString :: Vector Point -> LineString
+ Database.Postgis: MultiLineString :: Vector LineString -> MultiLineString
+ Database.Postgis: MultiPoint :: Vector Point -> MultiPoint
+ Database.Postgis: MultiPolygon :: Vector Polygon -> MultiPolygon
+ Database.Postgis: Point :: Double -> Double -> Maybe Double -> Maybe Double -> Point
+ Database.Postgis: Polygon :: Vector LinearRing -> Polygon
+ Database.Postgis: [_m] :: Point -> Maybe Double
+ Database.Postgis: [_x] :: Point -> Double
+ Database.Postgis: [_y] :: Point -> Double
+ Database.Postgis: [_z] :: Point -> Maybe Double
+ Database.Postgis: data Geometry
+ Database.Postgis: data LineString
+ Database.Postgis: data MultiLineString
+ Database.Postgis: data MultiPoint
+ Database.Postgis: data MultiPolygon
+ Database.Postgis: data Point
+ Database.Postgis: data Polygon
+ Database.Postgis: type LinearRing = Vector Point
+ Database.Postgis: type SRID = Maybe Int
+ Database.Postgis.Geometry: instance Data.Data.Data Database.Postgis.Geometry.Geometry
+ Database.Postgis.Geometry: instance Data.Data.Data Database.Postgis.Geometry.LineString
+ Database.Postgis.Geometry: instance Data.Data.Data Database.Postgis.Geometry.MultiLineString
+ Database.Postgis.Geometry: instance Data.Data.Data Database.Postgis.Geometry.MultiPoint
+ Database.Postgis.Geometry: instance Data.Data.Data Database.Postgis.Geometry.MultiPolygon
+ Database.Postgis.Geometry: instance Data.Data.Data Database.Postgis.Geometry.Point
+ Database.Postgis.Geometry: instance Data.Data.Data Database.Postgis.Geometry.Polygon
- Database.Postgis.Geometry: Point :: {-# UNPACK #-} !Double -> {-# UNPACK #-} !Double -> Maybe Double -> Maybe Double -> Point
+ Database.Postgis.Geometry: Point :: Double -> Double -> Maybe Double -> Maybe Double -> Point
- Database.Postgis.Geometry: [_x] :: Point -> {-# UNPACK #-} !Double
+ Database.Postgis.Geometry: [_x] :: Point -> Double
- Database.Postgis.Geometry: [_y] :: Point -> {-# UNPACK #-} !Double
+ Database.Postgis.Geometry: [_y] :: Point -> Double
Files
- haskell-postgis.cabal +2/−2
- src/Database/Postgis.hs +15/−2
- src/Database/Postgis/Geometry.hs +12/−10
- src/Database/Postgis/JSON.hs +5/−3
- src/Database/Postgis/Serialize.hs +2/−2
- tests/GeoSpec.hs +0/−4
haskell-postgis.cabal view
@@ -2,9 +2,9 @@ -- documentation, see http://haskell.org/cabal/users-guide/ name: haskell-postgis-version: 0.1.0.1+version: 0.1.0.2 synopsis: A haskell library for PostGIS geometry types.-description: A haskell library for PostGIS geometry types.+description: A collection of types and parsers to use with the PostGIS extesion to PostgreSQL. license: MIT license-file: LICENSE author: Peter
src/Database/Postgis.hs view
@@ -6,7 +6,20 @@ , writeGeometry ) where-import Database.Postgis.Geometry-import Database.Postgis.Serialize+import Database.Postgis.Geometry (+ SRID,+ Point(..),+ LineString(..),+ LinearRing,+ Polygon(..),+ MultiPoint(..),+ MultiLineString(..),+ MultiPolygon(..),+ Geometry(..)+ )+import Database.Postgis.Serialize (+ writeGeometry,+ readGeometry+ )
src/Database/Postgis/Geometry.hs view
@@ -1,9 +1,12 @@ {-# LANGUAGE GADTs, TypeFamilies #-}+{-# LANGUAGE DeriveDataTypeable #-} module Database.Postgis.Geometry where import qualified Data.Vector as V import Data.Word+import Data.Data+import Data.Typeable {-Linear rings—Rings are simple and closed, which means that linear rings may not self intersect.-} @@ -18,15 +21,14 @@ hasM :: a -> Bool hasZ :: a -> Bool geoType :: a -> Word32 - {-geometry :: a -> InnerGeo-} data Point = Point {- _x :: {-# UNPACK #-} !Double- , _y :: {-# UNPACK #-} !Double+ _x :: Double+ , _y :: Double , _z :: Maybe Double , _m :: Maybe Double-} deriving (Show, Eq)+} deriving (Data, Typeable, Show, Eq) instance EWKBGeometry Point where hasM (Point x y z m) = m /= Nothing @@ -39,7 +41,7 @@ isClosed v = V.head v == V.last v -data LineString = LineString (V.Vector Point) deriving (Show, Eq)+data LineString = LineString (V.Vector Point) deriving (Data, Typeable, Show, Eq) instance EWKBGeometry LineString where@@ -47,7 +49,7 @@ hasZ (LineString ps) = hasZ . V.head $ ps geoType _ = 2 -data Polygon = Polygon (V.Vector LinearRing) deriving (Show, Eq)+data Polygon = Polygon (V.Vector LinearRing) deriving (Data, Typeable, Show, Eq) hasMLinearRing :: LinearRing -> Bool hasMLinearRing = hasM . V.head @@ -60,21 +62,21 @@ hasZ (Polygon ps) = hasZLinearRing . V.head $ ps geoType _ = 3 -data MultiPoint = MultiPoint (V.Vector Point) deriving (Show, Eq)+data MultiPoint = MultiPoint (V.Vector Point) deriving (Data, Typeable, Show, Eq) instance EWKBGeometry MultiPoint where hasM (MultiPoint ps) = hasM . V.head $ ps hasZ (MultiPoint ps) = hasZ . V.head $ ps geoType _ = 4 -data MultiLineString = MultiLineString (V.Vector LineString) deriving (Show, Eq)+data MultiLineString = MultiLineString (V.Vector LineString) deriving (Data, Typeable, Show, Eq) instance EWKBGeometry MultiLineString where hasM (MultiLineString ps) = hasM . V.head $ ps hasZ (MultiLineString ps) = hasZ . V.head $ ps geoType _ = 5 -data MultiPolygon = MultiPolygon (V.Vector Polygon) deriving (Show, Eq)+data MultiPolygon = MultiPolygon (V.Vector Polygon) deriving (Data, Typeable, Show, Eq) instance EWKBGeometry MultiPolygon where hasM (MultiPolygon ps) = hasM . V.head $ ps@@ -96,4 +98,4 @@ | GeoPolygon SRID Polygon | GeoMultiLineString SRID MultiLineString | GeoMultiPoint SRID MultiPoint- | GeoMultiPolygon SRID MultiPolygon deriving (Show, Eq)+ | GeoMultiPolygon SRID MultiPolygon deriving (Data, Typeable, Show, Eq)
src/Database/Postgis/JSON.hs view
@@ -103,10 +103,12 @@ sridToJson srid = object ["type" .= ("name" :: T.Text), "properties" .= object ["name" .= ("ESPG:" <> (show srid) :: String)] ] + parseCRS :: Value -> Parser (Maybe Int) parseCRS = withObject "crs" $ \o -> do- ("name" :: T.Text) <- o .: "type"- prop <- o .: "prop"+ crs <- o .: "crs" + ("name"::T.Text) <- crs .: "type"+ prop <- crs .: "properties" espg <- prop .: "name" let (x:y:xs) = T.split ((==) ':') espg case decimal y of@@ -115,7 +117,7 @@ instance FromJSON Geometry where- parseJSON o + parseJSON o = GeoPoint <$> parseCRS o <*> parseJSON o <|> GeoLineString <$> parseCRS o <*> parseJSON o <|> GeoPolygon <$> parseCRS o <*> parseJSON o
src/Database/Postgis/Serialize.hs view
@@ -1,5 +1,5 @@ {-# LANGUAGE TypeFamilies, GADTs, FlexibleInstances, OverloadedStrings #-}-module Database.Postgis.Serialize where+module Database.Postgis.Serialize where import Database.Postgis.Geometry import Data.ByteString.Lex.Integral@@ -209,7 +209,7 @@ getHeader :: Get Header getHeader = do- or <- get + or <- get t <- fromIntegral <$> getInt' or s <- if t .&. wkbSRID > 0 then (Just . fromIntegral) <$> getInt' or else return Nothing return $ Header or t s
tests/GeoSpec.hs view
@@ -33,19 +33,15 @@ it "should convert ByteString to Endianness" $ do fromHex be `shouldBe` BigEndian fromHex le `shouldBe` LittleEndian- {-it "should convert int32 to a hex ByteString" $ do-} - {-describe "parseGeometry" $ do-} it "Should correctly parse a bytestring into a Point" $ do readGeometry point1BS `shouldBe` point1 it "Should parse a bytestring into a LineString" $ do readGeometry linestring1BS `shouldBe` linestring1- {-describe "writeGeometry" $ do-} it "Should correctly write a Point into a bytestring" $ do (toUpperBS $ writeGeometry point1) `shouldBe` point1BS it "Should write a LineString into a bytestring" $ do (toUpperBS $ writeGeometry linestring1) `shouldBe` linestring1BS - {-describe "Json" $ do-} it "Encodes a linestring" $ do encode linestring1 `shouldBe` linestringJSON