Data types used by the PostGIS extension
There is deserialization support (and trivial serialization) support for the data types used by the
PostGIS extension. It’s necessary to require the pg-gis
library and to
call pg-setup-postgis
before using this functionality, to load the extension if necessary and to
set up our deserialization support for the types used by PostGIS (in particular, the geometry
and
geography
types).
(require 'pg-gis)
(pg-setup-postgis *pg*)
PostGIS sends values over the wire in HEXEWKB format (Extended Well-Known
Binary
encoded in hexademical), such as 01010000200400000000000000000000000000000000000000
which
represents the well-known text (WKT) POINT (0 0)
.
If the variable pg-gis-use-geosop
is non-nil, we parse this format using the geosop
commandline
utility function from GEOS (often available in packages named geos-bin
or similar). Otherwise, we
leave it as a string (it can be parsed using PostGIS functions such as ST_AsText
).
sudo apt install geos-bin
ELISP> (require 'pg-gis)
ELISP> (pg-setup-postgis *pg*)
ELISP> (pg-result (pg-exec *pg* "SELECT 'POINT(4 5)'::geometry") :tuple 0)
("POINT (4 5)")
ELISP> (pg-result (pg-exec *pg* "SELECT Box2D(ST_GeomFromText('LINESTRING(1 2, 3 4, 5 6)'))") :tuple 0)
("BOX(1 2,5 6)")
ELISP> (pg-result (pg-exec *pg* "SELECT 'MULTILINESTRING((-118.584 38.374 20,-118.583 38.5 30),(-71.05957 42.3589 75, -71.061 43 90))'::geometry") :tuple 0)
("MULTILINESTRING Z ((-118.584 38.374 20, -118.583 38.5 30), (-71.05957 42.3589 75, -71.061 43 90))")
ELISP> (pg-result (pg-exec *pg* "SELECT 'SPHEROID[\"GRS_1980\",6378137,298.2572]'::spheroid") :tuple 0)
("SPHEROID(\"GRS_1980\",6378137,298.2572)")