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

Using PostGIS datatypes

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)")