2016-10-20 91 views
0

我有一個過濾器,我不想在啓動應用程序時使用,只有在某個特定的操作上。我知道已經有一個question關於這個,但它不能幫助我,我實際上不明白這兩個答案。如何告訴mapserver忽略過濾器?

我是在「我的專欄=值或1 = 1」的邏輯來獲取我所有的數據集,而不是隻是過濾器,如果它沒有被調用。

這是我寫的:

FILTER (([ct]='%ct%') or '%ct%' = '%ct%') 
VALIDATION 
    'ct' '^[a-zA-Z\-]+$' 
END 

我打電話給我的層上的OpenLayers 3 PARAM與

url: 'http://localhost:5000/cgi-bin/mapserv.exe?map=/ms4w/apps/tutorial/htdocs/essai.map&SERVICE=WMS&VERSION=1.1.1%20&REQUEST=GetCapabilities', serverType: 'mapserver', params: {'LAYERS': 'aisdata', 'ct':'myvalue', 'TILED': true} });

但回到我的所有數據集。 (如果我刪除我的地圖文件中的'%ct%' = '%ct%',該過濾器應用很好)

任何人都可以幫助我忽略我的狀況嗎?

+0

我不明白你的問題。表達式「我的列=值或1 = 1」始終爲真,並且與根本不是過濾器相同。 「你的意思是」如果沒有調用我所有的數據集,而不僅僅是過濾器。「 –

+0

@TommasoDiBucchianico假設我有一層動物(雞,狗,貓)。我希望他們都能顯示在我的地圖上。但是我已經在我的地圖文件中預先定義了一個過濾器,以便以後只能選擇一種類型的動物。由於我的FILTER([動物] =%動物%),如果我不提供任何參數,我的地圖將不顯示任何內容。如果沒有提供參數,我不知道如何在我的FILTER中說我首先需要所有動物(即1 = 1)。如果提供了一個參數,我不希望1 = 1 – So4ne

+0

@TommasoDiBucchianico我知道它總是如此,我需要它永遠是真的。對於(([ct] ='%ct%')或'%ct%'='%ct%')我希望Mapfile(或Postgis?)檢查[ct] ='%ct%'是否返回true FIRST。在我看來,它總是'%ct%'='%ct%',它返回true。或者我需要的是「如果我沒有任何參數設置,然後顯示一切,儘管我的過濾器」 – So4ne

回答

1

在驗證模塊添加一個默認值,讓您的值默認爲一個空字符串,並且不是添加在文件管理器塊或條件檢查,如果該值是一個空字符串:

VALIDATION 
    'ct' '^[a-zA-Z\-]+$' 
    'default_ct' '' # <-- ct will be a empty string if not provided via URL 
END 
FILTER (([ct]='%ct%') or ('%ct%' = '')) 

如果數據庫列ct確實具有數字類型,則以前的過濾器將產生內部服務器錯誤,因爲您無法將空字符串與數字進行比較。在這種情況下,使用數字值作爲默認值,如0或-1。

+0

嗯,這實際上給了我一個500內部服務器錯誤哈哈我會檢查,如果我必須配置''= ''在Apache或類似 – So4ne

+0

好吧,我通過給出默認值而不是''我設置'default_ct''1'和FILTER(([ct] ='%ct%')或('% ct%'='1'))。非常感謝你 ! – So4ne

+0

可能是空字符串的問題是,你的列'ct'有一個數值類型,所以''%ct%'='''會產生一個Postgres異常,因爲是一個條件NUMERIC = TEXT –