2013-08-23 70 views
0

我正嘗試在我的圖層中創建排除區域的上下文。子查詢中的多行

我想下面的地圖文件/ SQL組合

DATA "geom FROM public.data" 
FILTER "layer = %layer_id% AND ST_CONTAINS(ALL(SELECT the_geom FROM public.exclusion_zone WHERE layer = %layer_id%), geom) != true" 

顯然,當有更多的則1個禁區這打破,所以我怎麼做呢?

我已經試過storedProc的已經只被告知地圖服務器找不到,因爲它沒有在幾何表顯示它的SRID

我收到的錯誤是這樣

Query error. Error (ERROR: more than one row returned by a subquery used as an expression) executing query 

回答

1

試試這個:

DATA "geom FROM public.data" 
FILTER " 
    layer = %layer_id% and 
    not exists 
    (
     SELECT * 
     FROM public.exclusion_zone 
     WHERE layer = %layer_id% and ST_CONTAINS(the_geom, geom) 
    ) 
+0

這看起來應該工作,但即時通訊錯誤附近的「任何」關鍵字? – DrogoNevets

+0

@DrogoNevets沒有地圖服務器來測試,試試更新後的查詢 –

+0

對不起,延遲,只是從一次旅行回來 - 新SQL像一個寶石一樣工作,謝謝你! – DrogoNevets

0

這看起來更像是一個與PostgreSQL/PostGIS相關的MapServer相關問題。
您使用的是什麼版本的MapServer?

優先考慮避免參數FILTER,並使用子查詢從postgis中檢索數據,顯式提供SRID和唯一標識字段:由MapServer和PostgreSQL查詢優化器引起的更好性能,更多控制,更少麻煩「missunderstandings」 。

我不知道你的實際數據的想法,但togheter粘貼你的線條,並假設沒有在public.datagid場,你應該得到類似的東西:

DATA "geom from (
     SELECT gid, geom 
      FROM public.data 
      WHERE layer = %layer_id% AND ST_CONTAINS(ALL(SELECT the_geom FROM public.exclusion_zone WHERE layer = %layer_id%), geom) != true 
    ) as layer using unique gid using srid = %layer_id%" 

當然根據更改%srid%到您的數據,或使用-1。根據您的PostGIS和MapServer版本,您甚至可以避免它(好吧,它嚴格依賴於您的數據和查詢),讓MapServer爲您獲取它,但這是無用的開銷。

關於您的查詢,它給了我感覺在那裏可以優化的東西,但我想這只是一個測試查詢被替換爲最後一個。

+0

有趣,我讀到的濾波器參數 – DrogoNevets

+0

問題是更PostGIS的,因爲我仍然得到該子查詢返回多個行(這是正確的,生病的錯誤完全相反用確切的錯誤信息更新原始問題) – DrogoNevets

+0

關於'FILTER'參數,我不知道你在讀什麼文件,但可能你正在將基於文件的數據信息與空間數據庫混合在一起。最好的方法是嘗試自己,並檢查哪個是最好的選擇。關於錯誤:你的查詢是錯誤的(Roman Pekar給了你一個正確的選項,只是添加一個'NOT'),但是你寫道:*僅僅被告知MapServer找不到它的SRID,因爲它沒有出現在幾何中表*。在你確定他們給你正確的結果集之前,在MapServer之外測試你的查詢,然後在你的MapServer應用程序中使用它們。 – Eggplant