2013-12-10 119 views
1

爲什麼PostgreSQL會抱怨運算符&&不存在? (我已經安裝了PostGIS - 見下文)。PG :: UndefinedFunction:ERROR:運算符不存在:geometry && box

mydb=# SELECT "monuments".* FROM "monuments" WHERE 
mydb=# (coord && '-10,-10,10,10'::box) 
mydb=# ORDER BY created_at DESC ; 
ERROR: operator does not exist: geometry && box 
LINE 1: ...LECT "monuments".* FROM "monuments" WHERE (coord && '-10... 
                  ^
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts. 

我已經安裝了PostGIS:

mydb=# select postgis_full_version(); 
NOTICE: Function postgis_topology_scripts_installed() not found. Is topology support enabled and topology.sql installed? 
                     postgis_full_version                  
---------------------------------------------------------------------------------------------------------------------------------------------------------------- 
POSTGIS="2.1.0 r11822" GEOS="3.3.8-CAPI-1.7.8" PROJ="Rel. 4.8.0, 6 March 2012" GDAL="GDAL 1.10.0, released 2013/04/24" LIBXML="2.9.1" LIBJSON="UNKNOWN" RASTER 

順便說一句,我的表是這樣的:

mydb=# \d monuments 
id | integer    | not null default nextval('monuments_id_seq'::regclass) 
coord | geometry(Point,3785) | 

讓我知道如果你需要任何更多的信息。

回答

3

boxbuilt-in PostgreSQL primitive geometric type,如point

postgres=> \dT box 
         List of data types 
    Schema | Name |    Description     
------------+------+------------------------------------------ 
pg_catalog | box | geometric box '(lower left,upper right)' 
(1 row) 

PostGIS的使用itsowngeometry類型,一般不具有內置的基本幾何類型PostgreSQL的良好互操作。這些都是我的PostgreSQL 9.3 &&在PostGIS 2所支持的數據類型組合安裝:

postgres=# \do && 
           List of operators 
    Schema | Name | Left arg type | Right arg type | Result type | Description 
------------+------+---------------+----------------+-------------+----------------- 
pg_catalog | && | anyarray  | anyarray  | boolean  | overlaps 
pg_catalog | && | anyrange  | anyrange  | boolean  | overlaps 
pg_catalog | && | box   | box   | boolean  | overlaps 
pg_catalog | && | circle  | circle   | boolean  | overlaps 
pg_catalog | && | polygon  | polygon  | boolean  | overlaps 
pg_catalog | && | tinterval  | tinterval  | boolean  | overlaps 
pg_catalog | && | tsquery  | tsquery  | tsquery  | AND-concatenate 
public  | && | geography  | geography  | boolean  | 
public  | && | geometry  | geometry  | boolean  | 
public  | && | geometry  | raster   | boolean  | 
public  | && | raster  | geometry  | boolean  | 
public  | && | raster  | raster   | boolean  | 
(12 rows) 

你會看到,box是支持box && box但不box && geometry。由於您的coord列是geometry類型,因此您需要將box轉換爲geometry,以便最終以geometry && geometry結束。

例子:

WHERE (coord && geometry(polygon('((-10, -10), (10, 10))'::box))) 
+0

非常感謝這些信息。我能夠使用'WHERE(coord && ST_Envelope('LINESTRING(-10 -10,10 10)':: geometry))''來處理查詢,但是我不知道如何將'box'轉換爲'geometry你按照你的建議。你能不能告訴我? – user664833

+0

我還使用'WHERE ST_WITHIN(coord,ST_MakeEnvelope(-10,-10,10,10,3785))'以及'WHERE coord @ ST_MakeEnvelope(-10,-10,10,10, 3785)' - 但我仍然不知道如何*將'box'轉換爲'geometry' *。 – user664833

+0

它也適用於'WHERE(coord &&'LINESTRING(-10 -10,10 10)':: geometry)'和'WHERE(coord @'LINESTRING(-10 -10,10 10)':: geometry)' - 這與我的第一條評論類似,但沒有「ST_Envelope」。 – user664833

1

最簡單的解釋是您將擴展安裝到某個不在您當前的search_path中的架構中。

你知道嗎,你甚至可以"schema-qualify" operators?像:

SELECT 3 OPERATOR(pg_catalog.+) 4; 

或者:

SELECT * FROM public.monuments 
WHERE coord OPERATOR(my_postgis_schema.&&) '-10,-10,10,10'::box); 

這種方式,您可以使獨立於當前search_path的查詢。儘管如此,要解決它。

+1

謝謝您的回答和其他有用信息。我的搜索路徑,如'show search_path;'報告的是'「$ user」,public,postgis'。根據[文檔](http://www.postgresql.org/docs/current/static/ddl-schemas.html)我知道*如果不存在這樣的模式,則該條目被忽略* - so'「$用戶「'被忽略,然後它嘗試'public',然後'postgis'。我嘗試了兩種模式,並且在兩種情況下,我都得到了'錯誤:操作符不存在'。只是爲了確定我放入了一個虛構模式,並且得到了'ERROR:schema「my_postgis_schema」不存在「 - 所以至少我知道它正在嘗試。任何其他想法? – user664833

+0

呵呵,我的意思是說我的模式,如'\ dn'列出的,是'postgis'和'public'(按此順序)。 – user664833

+0

@ user664833:我的解釋本來是最簡單的,但似乎並不適用於您的案例。我認爲克雷格有一個觀點。 –

相關問題