我正在使用postgresql版本: “在x86_64-unknown-linux-gnu上的PostgreSQL 9.3.1,由gcc(GCC)4.6.3 20120306(Red Hat 4.6.3-2)编译,64位”
我创建了2个表A和B,其中point和polygon作为数据类型。 现在我想知道点是否在多边形内部。 为此,我试图使用ST_Intersect(A.point_LatLong,B.polygon_abc); 我的疑问是:
SELECT A.id
FROM A, B
WHERE A.name = 'callifornia'
AND ST_Intersect(A.point_LatLong , B.polygon_abc);
此处point_latLong
和polygon_abc
是在表A和B中具有数据类型点和多边形的列名。
但是此查询会出错:
错误:函数st_intersect(点,多边形)不存在
第3行:WHERE city.city_name ='callifornia'和ST_intersect(city.c ...
提示:没有函数匹配给定的名称和参数类型。您可能需要添加
显式类型转换。
我该如何解决这个问题?我甚至无法在postgresql中使用任何其他空间方法,如st_contains()等,如果您有任何解决方案,请告诉我。
答案 0 :(得分:5)
您正在尝试将PostgreSQL的内置(有限但有用)几何类型与PostGIS功能混合使用。听起来你也没有安装PostGIS。您还错误地输入了函数名称,它是ST_Intersects
而不是ST_Intersect
。
首先,如果您想使用PostGIS,请确保已安装,然后:
CREATE EXTENSION postgis;
接下来,您可能会发现实际上无法使用ST_Intersects
和point
来呼叫polygon
。 PostGIS使用自己的geometry
类型。它有一些PostgreSQL内部类型的转换器,但它们只是有限的。因此,使用原始几何类型调用PostGIS函数可能会导致错误,如:
postgres=# SELECT ST_Intersects( polygon( box(point(0,0), point(10,10)) ), point(5,5) );
ERROR: function st_intersects(polygon, point) does not exist
LINE 1: SELECT ST_Intersects( polygon( box(point(0,0), point(10,10))...
^
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
您经常需要将它们转换为PostGIS自己的geometry
类型。 PostGIS为大多数类型提供了一些明确的演员表,例如:
postgres=# SELECT ST_Intersects(
polygon( box(point(0,0), point(10,10)) )::geometry,
point(5,5)::geometry
);
st_intersects
---------------
t
(1 row)
所以在你的查询中,那就是:
ST_Intersects(A.point_LatLong::geometry , B.polygon_abc::geometry);