12

我有以下简单的表格:

CREATE TABLE tbl_test
(
  id serial NOT NULL,
  poly polygon NOT NULL
)
WITH (OIDS=FALSE);

然后我尝试用多边形插入一行:

insert into tbl_test values(1, PolyFromText('POLYGON((0 0, 10 10, 10 0, 0 0))'))

并遇到此错误:

列“poly”属于多边形类型,但表达式属于几何类型

这是蹩脚的。所以我的第一个问题是:

  1. 我真的必须投吗?

无论如何,铸造后它可以工作。现在我正在尝试做一个简单的 ST_Contains 查询:

select id, poly from tbl_test where ST_Contains(poly, Point(GeomFromText('POINT(9 2)')))

这给出了错误:

ERROR:  function st_contains(polygon, point) does not exist
LINE 1: select id, poly from tbl_test where ST_Contains(poly, Point(...
                                            ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

我应该做些什么?

以下作品:

select st_contains(st_geomfromtext('POLYGON((0 0, 10 10, 10 0, 0 0))'), st_geomfromtext('POINT(0 0)'))

但这可能是因为这两个参数都是几何类型的。针对表数据的实际查询不起作用。

回答:

多伊!问题是我创建的数据库不是基于postgis模板数据库(因此没有相关的功能和几何列表等)。最后,我可以说一下,PostGIS 要求您向数据库添加数百个函数、行和几个表的方式只是为了让您获得 GIS 支持,这完全是蹩脚的。它使模式的备份变得更加复杂并且非常容易出错(如果您忽略调用 AddGeometryColumn 而只是自己添加一个几何列,那么天堂是禁止的)。

4

2 回答 2

11

多边形是 PostGIS 构建在其之上的基本 Postgres 类型。您可以使用 PostGIS 功能启用几何列select AddGeometryColumn(...)。否则,您将使用直多边形:

=> create table gt (id int, space polygon);
=> insert into gt values (1, '((2,2),(3,4),(3,6),(1,1))');
INSERT 0 1
=> select point(space) from gt where id = 1;
    point    
-------------
 (2.25,3.25)
(1 row)

这是多边形的中心点

=> select circle(space) from gt where id = 1;
             circle             
--------------------------------
 <(2.25,3.25),1.93994028704315>
(1 row)

这是多边形的最小边界圆,表示为 Postgrescircle类型。所有几何运算符都记录在这里:http://www.postgresql.org/docs/8.3/interactive/functions-geometry.html 基础多边形没有任何投影数据、SRID 等,所以如果它与 PostGIS 一起使用它可能只是默认为预设并且很幸运。但当然,在很多情况下,您只需要亚地理空间尺度上的几何图形。

于 2009-06-19T00:31:46.480 回答
9

好的,奇怪的是,我发现以下更简单的语法有效:

insert into tbl_test (poly) values ('(0,0),(0,10),(10, 10), (0, 0)')

select * from tbl_test where poly @> '(2, 8)'

但我正在努力找出这些函数和运算符集之间的区别。这种较短的语法(实际上并不符合 OpenGIS)是否利用了相同的空间索引等?

于 2009-06-18T13:39:59.890 回答