0

我正在尝试在我的图层中创建一个禁区上下文。

我正在尝试以下 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 个禁区时,这会中断,那么我该怎么做呢?

我已经尝试过storedProc,只是被告知MapServer找不到它的SRID,因为它没有出现在几何表中

因此,我收到的错误是

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

2 回答 2

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)
    )
于 2013-08-24T05:54:17.370 回答
0

这看起来更像是与 MapServer 相关的问题,而不是 PostgreSQL/PostGIS 问题。
您使用的是什么版本的 MapServer?

最好避免使用该FILTER参数并使用子查询从 postgis 中检索数据,显式提供 SRID 和唯一 id 字段:您可以获得更好的性能、更多的控制、更少的由 MapServer 和 PostgreSQL 查询优化器“误解”引起的麻烦。

我不知道您的实际数据,但是将您的行粘贴在一起并假设表中有一个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 为您获取它,但这是无用的开销。

关于您的查询,它让我觉得可以在那里优化一些东西,但我想这只是一个测试查询,将被最后一个替换。

于 2013-08-23T17:34:31.750 回答