【问题标题】:How to tell mapserver to ignore a filter?如何告诉地图服务器忽略过滤器?
【发布时间】:2016-10-20 08:55:22
【问题描述】:

我有一个过滤器,我不想在应用程序启动时使用,只在某个操作上使用。我知道已经有一个question 与此相关,但这对我没有帮助,我实际上不明白这两个答案。

我的逻辑是“我的列 = 值或 1 = 1”来获取我的所有数据集,而不仅仅是过滤器(如果它没有被调用)。

这是我写的:

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

我在 Openlayers 3 上使用参数调用我的层

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%',过滤器应用得很好)

谁能帮我忽略我的病情?

【问题讨论】:

  • 我不明白你的问题。表达式“我的列 = 值或 1 = 1”始终为真,与根本不过滤相同。 “如果未调用过滤器,则获取我的所有数据集而不是仅获取过滤器”是什么意思。
  • @TommasoDiBucchianico 假设我有一个包含一列动物(鸡、狗、猫)的图层。我希望它们都显示在我的地图上。但是我已经在我的地图文件上预定义了一个过滤器,以便以后只能选择一种动物。由于我的 FILTER ([animals] = %animals%) 如果我不提供任何参数,我的地图将不会显示任何内容。如果没有提供参数,我不知道如何在我的 FILTER 中说我首先想要我的所有动物(即 1 = 1)。如果提供了参数,我不想要 1 = 1
  • @TommasoDiBucchianico 我知道它永远是正确的,我需要它永远正确。对于 (([ct]='%ct%') 或 '%ct%' = '%ct%') 我希望 Mapfile(或 Postgis?)检查 [ct]='%ct%' 是否返回 true FIRST。就我而言,似乎总是 '%ct%' = '%ct%' 返回 true。或者我需要的是“如果我没有设置任何参数,则显示所有内容,尽管我的过滤器”

标签: openlayers-3 wms mapserver map-files


【解决方案1】:

在 VALIDATION 块中添加一个默认值,以便您的值默认为空字符串,然后在 FILER 块中添加一个 OR 条件来检查该值是否为空字符串:

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。

【讨论】:

  • 嗯,这实际上给了我一个 500 内部服务器错误哈哈,我会检查我是否必须在 Apache 或类似的东西上配置一个''=''
  • 好的,我保留了你的想法,给出了一个默认值,而不是 '' 我设置了 'default_ct' '1' 和 FILTER (([ct]='%ct%') 或 ('%ct %' = '1'))。非常感谢!
  • 空字符串的问题可能是,您的列 ct 具有数字类型,因此条件 '%ct%' = '' 引发 Postgres 异常,因为条件 NUMERIC = TEXT
  • 对不起,我没有用大地图测试这个技巧。问另一个问题并更好地描述问题。
  • 请注意,我预计单括号会出现问题。我使用双括号使其正常工作,否则我会进行全表扫描。调试显示带有单括号的 Where 子句,如 WHERE ( '0' = '0' ) OR ( myColumn= '0' ) AND ... 带双括号: WHERE (( '0' = '0' ) OR ( myColumn= '0' )) AND ... 所以使用 FILTER ( (([ct]='%ct%') 或 ('%ct%' = '') ) )
猜你喜欢
  • 2015-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多