Postgis:函数st_contains不存在

时间:2019-07-13 07:24:48

标签: postgresql postgis

我正在努力获得一个简单的Postgresql / Postgis语句,我需要一个多边形(在本例中为矩形)内的所有点

SELECT * FROM points_table WHERE ST_Contains( ST_GEOMFROMTEXT('POLYGON((51.8121, 0.13712199999997665, 51.9078, 0.21444399999995767))'), points_table.geom)

错误显示

ERROR:  function st_contains(geometry, geography) does not exist
LINE 1: SELECT * FROM points_table WHERE ST_Contains( ST_GEOMFRO...
                                             ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

********** Error **********

ERROR: function st_contains(geometry, geography) does not exist
SQL state: 42883
Hint: No function matches the given name and argument types. You might need to add explicit type casts.
Character: 38

this question等人的回答表明我的说法是正确的。

3 个答案:

答案 0 :(得分:3)

似乎您正在比较GEOMETRY和GEOGRAPHY

如您的消息错误st_contains(geometry, geography)

请确保您的points_table.geom列是有效的GEOMETRY数据类型,而不是GEOGRAPHY数据类型..对于您正在使用的SR,也应对此进行检查,最终将您的geomtext转换为地理上的有效SR

例如假设您使用SR 4326

SELECT * 
FROM points_table 
WHERE ST_Contains(
  ST_Transform(
  ST_GEOMFROMTEXT('POLYGON((51.8121, 0.13712199999997665, 51.9078, 0.21444399999995767))')
  ,4326)
, points_table.geom) 

答案 1 :(得分:0)

尽管我接受了一个可以解决我的问题的答案,但我觉得分享显式场景(边界内的点)的替代方案很重要,因为这是我一直在努力寻找的解决方案。

echo '<pre>' . $mapped->toJson(JSON_PRETTY_PRINT) . '</pre>';

这是一个简单得多的方法,其结果完全符合要求,与接受的答案相同。

答案 2 :(得分:0)

我通过加入public.ST_CONTAINS(geom, coords)而非ST_CONTAINS(geom, coords)来解决了这个问题

我对Postgresql的了解还不是很清楚,但是知道为什么会起作用。我只是浏览了https://gis.stackexchange.com/questions/132103/postgis-st-within-does-not-exist,并希望能做到最好。