2

我使用 PostgreSQL 12.1、PostGIS 3.0.0 和 PostgREST 7.0.1 的组合,我对这个设置非常满意。在 PostgREST中有更广泛的 PostGIS 支持的开放增强功能,我很期待。

我有一个带有几何列的表:

CREATE TABLE places (
  id serial primary key,
  geometry geometry(GEOMETRY,4326)
);

使用 SQL,我可以像这样插入纬度 57.20 和经度 17.45 的点:

insert into places(geometry) values (ST_GeomFromText('POINT(17.45 57.20)', 4326));

当使用 PostgREST 查询它时,它表示为 GeoJSON:

GET /places?id=eq.6317&select=geometry

[{
  "geometry": {
    "type": "Point",
    "coordinates": [17.45,57.2]
  }
}]

但是我需要如何表示几何以便我可以使用 PostgREST 插入/更新?

使用 GeoJSON 会导致 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"
}

与使用 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"
}

起作用的是使用内部 PostGIS 字符串表示,但我的 API 客户端手头只有值 17.45 57.20:

POST /places

{
    "geometry": "0101000020E610000033333333337331409A99999999994C40"
}

201 Created

是否有任何其他文本表示可以工作,或者是否有可能将 ST_GeomFromText 等函数传递给 PostgREST?任何提示都非常感谢!

4

1 回答 1

3

直接的方法是使用geometry文字表示:

POST /places

{
  "geometry": "SRID=4326;POINT(17.45 57.2)"
}

(您可以省略 SRID)

这有效,因为这也有效:

select 'SRID=4326;POINT(54.729142 25.268204)'::geometry
-- result: 0101000020E6100000ED116A86545D4B4009A87004A9443940  

另一种方法是在插入触发器之前处理 json 数组。

于 2020-06-07T14:01:51.193 回答