2009-06-18 37 views
7

對我有以下簡單的表:SQL查詢點在多邊形使用PostgreSQL

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

碰上這個錯誤:

column "poly" is of type polygon but expression is of type geometry

這是跛腳。所以我的第一個問題是:

  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並且只是自己添加一個幾何列)那麼天堂禁止。

+0

如果在聚合物中聚合,爲什麼不用你想要找到的點來製作一個「1角」多邊形? – 2009-06-18 13:01:54

+0

我不確定postgres支持1點的多邊形。此外,這是一個問題的解決方法,我不知道是否存在.. – 2009-06-18 13:05:35

回答

8

多邊形是PostGIS建立在PostGIS上的一種基本類型。使用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型。所有幾何操作符都記錄在案here: http://www.postgresql.org/docs/8.3/interactive/functions-geometry.html基礎多邊形沒有任何投影數據,SRID等,因此如果它與PostGIS協同工作,則可能只是默認預設和獲得幸運。但是,當然有很多情況下您只需要在地理空間範圍內進行幾何學處理。

4

好吧,怪異,我發現下面的更簡單的語法的工作原理:

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

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

但我在努力搞清楚這些集合的功能和運營商之間的差異。這個較短的語法(它不是真正的OpenGIS兼容)是否利用了相同的空間索引等?

+0

我知道它非常古老的問題......但它似乎你有關於opengis和postgre非常好的想法....你能告訴我,如果我可以查詢比如找到一個點是否存在於「任何」多邊形中。像'從poly_table選擇聚點,其中點(x,y)' – 2012-05-28 18:00:03