module Data.Geospatial (
Latitude
, Longitude
, Easting
, Northing
, Altitude
, GeoPositionWithoutCRS
, GeoPosition(..)
, GeoPoint(..)
, GeoMultiPoint(..)
, GeoPolygon(..)
, GeoMultiPolygon(..)
, GeoLine(..)
, GeoMultiLine(..)
, GeoPolyLine(..)
, GeospatialGeometry(..)
, Name
, Code
, Href
, FormatString
, ProjectionType
, CRSObject(..)
, FeatureID
, GeoProperty(..)
, GeoPropertyObject
, BoundingBoxWithoutCRS
, GeoFeature(..)
, GeoFeatureCollection(..)
, stripCRSFromPosition
, defaultCRS
) where
import Text.JSON
type Latitude = Float
type Longitude = Float
type Easting = Float
type Northing = Float
type Altitude = Float
type GeoPositionWithoutCRS = [Float]
data GeoPosition =
LonLat Longitude Latitude
| LonLatAlt Longitude Latitude Altitude
| EastingNorthing Easting Northing
| EastingNorthingAlt Easting Northing Altitude
stripCRSFromPosition :: GeoPosition -> GeoPositionWithoutCRS
stripCRSFromPosition (LonLat lon lat) = [lon, lat]
stripCRSFromPosition (LonLatAlt lon lat alt) = [lon, lat, alt]
stripCRSFromPosition (EastingNorthing easting northing) = [easting, northing]
stripCRSFromPosition (EastingNorthingAlt easting northing alt) = [easting, northing, alt]
newtype GeoPoint = GeoPoint GeoPositionWithoutCRS deriving (Show, Eq)
newtype GeoMultiPoint = GeoMultiPoint [GeoPoint] deriving (Show, Eq)
newtype GeoPolygon = GeoPolygon [GeoPositionWithoutCRS] deriving (Show, Eq)
newtype GeoMultiPolygon = GeoMultiPolygon [GeoPolygon] deriving (Show, Eq)
newtype GeoLine = GeoLine [GeoPositionWithoutCRS] deriving (Show, Eq)
newtype GeoMultiLine = GeoMultiLine [GeoLine] deriving (Show, Eq)
data GeoPolyLine = Poly GeoPolygon | LineString GeoLine
data GeospatialGeometry =
NoGeometry
| Point GeoPoint
| MultiPoint GeoMultiPoint
| Polygon GeoPolygon
| MultiPolygon GeoMultiPolygon
| Line GeoLine
| MultiLine GeoMultiLine
| Collection [GeospatialGeometry] deriving (Show, Eq)
type Name = String
type Code = Int
type Href = String
type FormatString = String
type ProjectionType = String
data CRSObject =
NoCRS
| NamedCRS Name
| EPSG Code
| LinkedCRS Href FormatString deriving (Show, Eq)
defaultCRS :: CRSObject
defaultCRS = EPSG 4326
type FeatureID = String
data GeoProperty =
StringProperty String
| FloatProperty Float
| DoubleProperty Double
| IntProperty Int
| PropertyObject GeoPropertyObject deriving (Show, Eq)
type GeoPropertyObject = JSValue
type BoundingBoxWithoutCRS = [Float]
data GeoFeature = GeoFeature {
bbox :: Maybe BoundingBoxWithoutCRS,
geometry :: GeospatialGeometry,
properties :: GeoPropertyObject,
featureId :: Maybe FeatureID } deriving (Show, Eq)
data GeoFeatureCollection = GeoFeatureCollection (Maybe BoundingBoxWithoutCRS) [GeoFeature] deriving (Show, Eq)