SQL查询使用PostgreSQL点在多边形(SQL query for point-in-poly

2019-06-23 14:24发布

我有以下简单的表:

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))'))

碰上这样的错误:

列“聚”是类型的多边形,但表达类型的几何形状

这是瘸子。 所以我的第一个问题是:

  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)'))

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

回答:

土井! 问题是,我创建了DB是不是基于PostGIS的模板DB(和为此没有足够的相关职能和几何列表等)。 可我只是此言一出,在结论,即PostGIS的方式需要你数以百计的功能,行和几个表添加到您的数据库只是让你不得不GIS的支持是完全跛脚。 这使得架构这复杂得多,而且非常容易出错(但愿如果忽视打电话AddGeometryColumn,只是添加一个几何列自己)的备份。

Answer 1:

多边形是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)

这是多边形的最小外接圆,表示为Postgres的circle型。 所有几何操作都记录在这里:http://www.postgresql.org/docs/8.3/interactive/functions-geometry.html基础多边形没有任何预测数据,SRID等,所以如果它在PostGIS工作它可能只是默认为预设并获得幸运。 不过,当然也有吨的情况下,你只需要在一个子地理空间尺度的几何形状。



Answer 2:

好吧,怪异,我发现下面的更简单的语法著作:

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

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

但我在努力搞清楚这些集合的功能和运营商之间的差异。 这是否更短的语法(这是不是真的开放地理信息系统兼容)采取相同的空间索引等的优势在哪里?



文章来源: SQL query for point-in-polygon using PostgreSQL