anneb / pgserver

postgis geodata http api

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

spatial joins or operators?

tapiamcclung opened this issue · comments

Hello,
I have been testing your implementation as per your suggestion and it looks great! Thanks!
I wonder how would I go about using pgserver 's data/query/:table to return spatial intersections/joins?
I tried using a filter like

ST_Intersects(geom, ST_GeomFromGeoJSON('{"type":"Polygon","coordinates":[...]}'))

So the query would be something like SELECT count(*) FROM table WHERE ST_Intersects(...) but the response is Error: Unprocessable Entity

{
  "error": {
    "name": "error",
    "length": 120,
    "severity": "ERROR",
    "code": "XX000",
    "file": "lwgeom_pg.c",
    "line": "128",
    "routine": "pg_error"
  }
}

and get a 422 invalid table or column name.
Any suggestions? Would I be able to use JOINs too?

The problem might be in your filter or by me not implementing the default for parameter 'columns'. I have changed the error message so that it now gives more meaningful information. The default for 'columns' ('*') is now also implemented.

About the filter:
ST_FromGeoJSON() does not define an SRID for the polygon. The filter results in an error message about trying to use mixed SRIDs. I modified your example filter by adding ST_SetSRID(...,4326):

ST_Intersects(geom, ST_SetSRID(ST_GeomFromGeoJSON('{"type":"Polygon","coordinates":[...]}'),4326))

And got some expected features as result.

Joins are currently not supported. A list of comma separated table names and adding the join expression to the filter would not be very difficult to support (= inner join only). However, this query API is already quite dangerous when used on a publicly accessible server. Data can be protected by using only low privilege database users, but complex queries or badly defined joins can easily overload the database server.

Yes! I was actually passing a GeoJSON and it was missing it's SRID info. That was solved by adding
crs: {"type":"name","properties":{"name":"EPSG:4326"}} to the geometry.
Including this and stringifying the JSON essentially solved the filter issue.
Thanks for the join info. I will be careful and restrict privileges.