2016-10-20 116 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 –