Uso la combinación de PostgreSQL 12.1, PostGIS 3.0.0 y PostgREST 7.0.1 y estoy muy contento con esta configuración. Hay una mejora abierta para un soporte PostGIS más amplio en PostgREST y estoy deseando que llegue.
Tengo una tabla con una columna de geometría:
CREATE TABLE places ( id serial primary key, geometry geometry(GEOMETRY,4326) );Con SQL puedo insertar el punto de latitud 57,20 y longitud 17,45 así:
insert into places(geometry) values (ST_GeomFromText('POINT(17.45 57.20)', 4326));Al consultarlo con PostgREST se representa como GeoJSON:
GET /places?id=eq.6317&select=geometry [{ "geometry": { "type": "Point", "coordinates": [17.45,57.2] } }]Pero, ¿cómo necesito representar la geometría para poder insertar/actualizar usando PostgREST?
El uso de GeoJSON da como resultado un error de servidor interno 500:
POST /places { "geometry": { "type": "Point", "coordinates": [17.45,57.2] } } 500 Internal Server Error { "hint": "\"{\r\" <-- parse error at position 2 within geometry", "details": null, "code": "XX000", "message": "parse error - invalid geometry" }Lo mismo con el uso de la función ST_GeomFromText:
POST /places { "geometry": "ST_GeomFromText('POINT(17.45 57.20)', 4326)" } 500 Internal Server Error { "hint": "\"ST\" <-- parse error at position 2 within geometry", "details": null, "code": "XX000", "message": "parse error - invalid geometry" }Lo que sí funciona es usar la representación de cadena interna de PostGIS, pero mi cliente API solo tiene los valores 17.45 57.20 a la mano:
POST /places { "geometry": "0101000020E610000033333333337331409A99999999994C40" } 201 Created¿Hay alguna otra representación de texto que funcione o existe la posibilidad general de pasar funciones como ST_GeomFromText a PostgREST? ¡Cualquier sugerencia es muy apreciada!
La forma sencilla sería usar la representación literal de geometry :
POST /places { "geometry": "SRID=4326;POINT(17.45 57.2)" }(puede omitir el SRID)
Esto funciona porque esto también funciona:
select 'SRID=4326;POINT(54.729142 25.268204)'::geometry -- result: 0101000020E6100000ED116A86545D4B4009A87004A9443940Otra forma sería tener antes de insertar el desencadenador procesando la matriz json.