我有下面的简单表:
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”是多边形类型,而表达式是“ geometry”类型
真是la子 所以我的第一个问题是:
无论如何,在投射之后它就可以工作了。现在,我正在尝试执行一个简单的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)'))
但这可能是因为两个参数都属于Geometry类型。针对表数据的实际查询不起作用。
回答:
土井!问题是我创建的DB不是基于postgis模板DB(因此没有相关的功能和几何列表等)。最后,我想指出一下,PostGIS要求您向数据库中添加数百个功能,行和一些表的方式只是让您完全获得GIS支持而已。它使架构的备份变得更加复杂,而且非常容易出错(如果您忽略调用AddGeometryColumn而是自己添加一个几何列,则禁止使用天堂)。
多边形是PostGIS建立在其上的基本Postgres类型。您可以使用PostGIS功能启用几何列select AddGeometryColumn(...)。否则,您将使用直线多边形:
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一起使用它可能只是默认设置而已,很幸运。但是,当然,在很多情况下,您只需要在亚大骨空间范围内进行几何处理。
circle