我正在尝试在我的图层中创建一个禁区的上下文。
我正在尝试以下Map File / 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个禁区时,显然这会中断,所以我该怎么做?
我已经尝试过只能告诉mapProc,MapServer找不到它的SRID,因为它没有出现在几何表中
我收到的错误是
Query error. Error (ERROR: more than one row returned by a subquery used as an expression ) executing query
答案 0 :(得分: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)
)
答案 1 :(得分:0)
这看起来更像是MapServer相关问题而不是PostgreSQL / PostGIS问题 您使用的是什么版本的MapServer?
最好避免使用FILTER
参数并使用子查询从postgis中检索您的数据,明确提供SRID和唯一ID字段:您可以获得更好的性能,更多控制,减少由MapServer和PostgreSQL查询优化器引起的麻烦“missunderstandings”。
我不知道你的实际数据,但是粘贴你的行代码并假设gid
表中有一个public.data
字段,你应该得到类似的东西:
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为您获取它,但这是一个无用的开销。
关于您的查询,它让我觉得可以在那里进行优化,但我想这只是一个测试查询,将被替换为最终版本。