Ass*_*vie 10 sql gis postgresql rdbms postgis
我有以下简单表:
CREATE TABLE tbl_test
(
id serial NOT NULL,
poly polygon NOT NULL
)
WITH (OIDS=FALSE);
Run Code Online (Sandbox Code Playgroud)
然后我尝试插入一个带有多边形的行:
insert into tbl_test values(1, PolyFromText('POLYGON((0 0, 10 10, 10 0, 0 0))'))
Run Code Online (Sandbox Code Playgroud)
并遇到这个错误:
列"poly"的类型为polygon,但expression的类型为geometry
哪个是蹩脚的.所以我的第一个问题是:
无论如何,在投射后它起作用.现在我正在尝试做一个简单的ST_Contains查询:
select id, poly from tbl_test where ST_Contains(poly, Point(GeomFromText('POINT(9 2)')))
Run Code Online (Sandbox Code Playgroud)
这给出了错误:
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.
Run Code Online (Sandbox Code Playgroud)
我应该做些什么?
以下作品:
select st_contains(st_geomfromtext('POLYGON((0 0, 10 10, 10 0, 0 0))'), st_geomfromtext('POINT(0 0)'))
Run Code Online (Sandbox Code Playgroud)
但这可能是因为两个参数都是Geometry类型.对表数据的实际查询不起作用.
回答:
土井!问题是我创建的DB不是基于postgis模板DB(因此没有相关的函数和几何列表等).最后,我可以简单地说,PostGIS要求您向数据库添加数百个函数,行和几个表的方式只是为了让您获得GIS支持是完全蹩脚的.它使模式的备份更加复杂并且非常容易出错(如果您忽略调用AddGeometryColumn并且只是自己添加几何列,则天堂禁止).
unm*_*ted 10
多边形是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)
Run Code Online (Sandbox Code Playgroud)
这是多边形的中心点
=> select circle(space) from gt where id = 1;
circle
--------------------------------
<(2.25,3.25),1.93994028704315>
(1 row)
Run Code Online (Sandbox Code Playgroud)
这是多边形的最小边界圆,表示为Postgres circle
类型.所有的几何运算符都记录在这里:http://www.postgresql.org/docs/8.3/interactive/functions-geometry.html 基本多边形没有任何投影数据,SRID等,所以如果它适用于PostGIS它可能只是默认为预设和幸运.但是,当然有很多情况下你只需要在地理空间范围内的几何图形.
好吧,很奇怪,我发现以下简单得多的语法工作:
insert into tbl_test (poly) values ('(0,0),(0,10),(10, 10), (0, 0)')
select * from tbl_test where poly @> '(2, 8)'
Run Code Online (Sandbox Code Playgroud)
但是我正在努力找出这些函数集和运算符之间的区别。这种较短的语法(与OpenGIS并不完全兼容)是否利用了相同的空间索引等?
归档时间: |
|
查看次数: |
28218 次 |
最近记录: |