Copyright | © 2018-2019 Satsuma labs |
---|---|
Safe Haskell | None |
Language | Haskell2010 |
Defines a type for georgraphic coordinates that can be spatially indexed by any database supporting 64 bit integer values.
This indexing works by reperesenting points using a Morton
Z-Order curce, with each coordinate reperesented as a 32-bit fixed-point value
which then have their bits interleaved into a 64-bit integer to the internal reperesentation.
Taking binary prefixes of these values divides the globe into a hierarchy of rectangular tiles (repereseteh here as LatLongTile
objects),
each of which is a contiguous interval when points are ordered according to their integer reperesentations.
As any geographic region can be covered by a small number of tiles of simillar size, this provides an easy to loop up data for specific reguions.
Instances and a filter for persistent are provided for this purpose.
Synopsis
- newtype LatLong where
- lat :: Lens' LatLong Double
- long :: Lens' LatLong Double
- earthRadius :: Double
- geoDistance :: LatLong -> LatLong -> Double
- geoSquare :: LatLong -> Double -> (LatLong, LatLong)
- data LatLongTile
- latLongTileInterval :: LatLongTile -> Interval LatLong
- latLongTileCover :: LatLong -> LatLong -> [LatLongTile]
- latLongTileCoverSquare :: LatLong -> Double -> [LatLongTile]
- tileSetElem :: LatLong -> [LatLongTile] -> Bool
- withinTileSet :: EntityField row LatLong -> [LatLongTile] -> Filter row
Documentation
Type for storing geographic coordinates that can be spatially indexed (Morton
ordering).
Each coordinate is reperesented as as 32-bit fixed point value and is also accessible as a Double through a pattern synonym.
Order follows a Morton Z-order curve which can be used to search a database by tiles.
This works with any database capable of storing and indexing Word64
(although this type only uses those values fitting in a 64 bit signed integer)
pattern LatLong :: Double -> Double -> LatLong | Pattern for accessing latitide and longitude coordinates as |
Instances
Eq LatLong Source # | |
Ord LatLong Source # | |
Show LatLong Source # | |
ToJSON LatLong Source # | |
Defined in Data.LatLong | |
FromJSON LatLong Source # | |
ToHttpApiData LatLong Source # | |
Defined in Data.LatLong toUrlPiece :: LatLong -> Text # toEncodedUrlPiece :: LatLong -> Builder # toHeader :: LatLong -> ByteString # toQueryParam :: LatLong -> Text # | |
FromHttpApiData LatLong Source # | |
Defined in Data.LatLong parseUrlPiece :: Text -> Either Text LatLong # parseHeader :: ByteString -> Either Text LatLong # | |
PersistFieldSql LatLong Source # | |
PersistField LatLong Source # | |
Defined in Data.LatLong toPersistValue :: LatLong -> PersistValue # |
earthRadius :: Double Source #
Earth's average radius in meters
geoDistance :: LatLong -> LatLong -> Double Source #
Calculate distance between two points using the Haversine formula (up to 0.5% due to the assumption of a spherical Earth). Distance is returned in meters.
geoSquare :: LatLong -> Double -> (LatLong, LatLong) Source #
Calculates the corner coordinates of a square with a given center and radius (in meters). Based on the Mercator projection thus has distortion near the poles (within 5% for a radius at most 200km and latitude within ±70).
Tiles
data LatLongTile Source #
Represents a LatLong tile, which is both a rectangle and a contoguous interval in the ordering.
Instances
Eq LatLongTile Source # | |
Defined in Data.LatLong (==) :: LatLongTile -> LatLongTile -> Bool # (/=) :: LatLongTile -> LatLongTile -> Bool # | |
Read LatLongTile Source # | |
Defined in Data.LatLong readsPrec :: Int -> ReadS LatLongTile # readList :: ReadS [LatLongTile] # readPrec :: ReadPrec LatLongTile # readListPrec :: ReadPrec [LatLongTile] # | |
Show LatLongTile Source # | |
Defined in Data.LatLong showsPrec :: Int -> LatLongTile -> ShowS # show :: LatLongTile -> String # showList :: [LatLongTile] -> ShowS # |
latLongTileInterval :: LatLongTile -> Interval LatLong Source #
Gets the corners of a tile, which are also the bounds of its interval in sort order.
latLongTileCover :: LatLong -> LatLong -> [LatLongTile] Source #
Covers a rectangle (defined by its corners) tiles of at most its size.
latLongTileCoverSquare :: LatLong -> Double -> [LatLongTile] Source #
Covers a square (defined by its center and radius) by tiles.
tileSetElem :: LatLong -> [LatLongTile] -> Bool Source #
Tests whether a point is contasined in a tile set.
withinTileSet :: EntityField row LatLong -> [LatLongTile] -> Filter row Source #
Persistent filter producing the SQL equiveland ot tileSetElem
.