
Show me the place where space is not.
Implement (partial) postgis functionality for esqueleto.
https://postgis.net/
uses wkt-geom to get a persistent instance,
then maps that to a custom datatype ‘PostgisGeometry’ which is valid
for roundtripping.
Then the esqueleto combinators are defined around this datatype.
Tutorial
most linux distributions support this out of the box.
nixos needs some special care:
services.postgresql = {
enable = true;
package = (pkgs.postgresql_12.withPackages (p: [ p.postgis ]));
};
For mac you’ve to install postgis.
brew install postgis
Make sure to enable to postgis extension on your database (it’s activated per database):
CREATE EXTENSION postgis;
you can specify some posgis geometry,
use the point to nidicate dimensions,
pointxy = 2 dimensions
pointxyz = 3, pointxyzm = 4.
The library forces you to work in the same dimensions.
You can specify a table with the custom datatype, which will have geometry as sql type:
share
[mkPersist sqlSettings, mkMigrate "migrateAll"]
[persistUpperCase|
Unit sql=unit
geom (PostgisGeometry PointXY)
deriving Eq Show
|]
then you can simply query on tat datatype:
test = testCase ("it finds the one unit with st_contains") $ do
result <- runDB $ do
_ <- insert $
Unit
{ unitGeom = Polygon $ makePolygon (PointXY 0 0) (PointXY 0 2) (PointXY 2 2) $ Seq.fromList [(PointXY 2 0)]
}
selectOne $ do
unit <- from $ table @Unit
where_ $ unit ^. UnitGeom `st_contains` (val $ Point (PointXY 1 1))
pure countRows
-- expectation, the result should be 1
unValue <$> result @?= (Just (1 :: Int)),
Contributing
contributions are welcome.
There are still many bindings missing!
Hacking
Tools
Enter the nix shell.
nix develop
You can checkout the makefile to see what’s available:
cat makefile
Running
make run
Fast filewatch which runs tests
make ghcid