地图服务器空间过滤

Posted

技术标签:

【中文标题】地图服务器空间过滤【英文标题】:Mapserver spatial filtering 【发布时间】:2009-08-25 10:50:55 【问题描述】:

任何人都知道是否有办法在地图文件中设置空间过滤器以用于正常请求,而不仅仅是 WMS 或 WFS?我需要这个空间过滤器是任何类型的多边形,而不仅仅是矩形,因为我们系统上的这些过滤器是动态的:允许用户绘制多边形或从多边形层中选择它们。这是一个用户使用没有地图功能的遗留桌面应用程序的系统,只向 Mapserver 请求图像,所以我必须在 Mapserver 端进行这些过滤

简单地说,这里有一个例子:用户拥有包含街道名称(标记点)和地区(多边形)等数据的图层。他们中的一个人可能只想看到那些属于第二区的街道,所以我希望 Mapserver 生成隐藏其余街道的图像。当然,在街道层中没有关于街道位于哪个区的信息

一些事情可以帮助你提出这个问题:

请求是 cgi,而不是 WMS,但如果有帮助,我可以更改它 我没有使用 Mapscript,也没有使用 OpenLayers 或 uDig 等任何客户端 图层没有也不会有属性关系 我知道 LAYER 部分中的 FILTER 参数,但它仅用于属性过滤 我阅读了有关“过滤器编码”(包含在 SLD 中)的信息,但无法使其正常工作,而且似乎仅适用于 WFS 我见过 CQL,但 Mapserver 不直接支持它,只能通过 SLD 支持

如何在 Mapserver 中为图像生成进行空间过滤?

谢谢

【问题讨论】:

【参考方案1】:

据我所知,通常有两种方法可以进行空间/非空间查询。 首先是使用过滤器编码,例如在 wms 调用 url 中使用参数。例如http://.../mapserv?map=..&param=value

另一种方法是在请求正文中使用过滤器。假设您能够向服务器发出发布请求,您可以在一个过滤器中使用过滤器进行复杂的空间/非空间查询。有关详细信息,请参阅地图服务器过滤器页面。有多种空间过滤操作,例如包含、相交等。

地图文件中的过滤器有点不同,它是为数据源预定义的过滤器。当您有逻辑在客户请求进入之前过滤数据时,此方法有效。(通过搜索 OGC 过滤器查看更多信息,CQL 目前适用于 GeoServer)

SLD 在渲染时也可以过滤数据。它也适用于空间和非空间滤波器。但它只反映getmap操作。

【讨论】:

【参考方案2】:

您可以使用 WMS 请求在边界框内返回要素。

见http://mapserver.org/ogc/wms_server.html

BBOX=minx,miny,maxx,maxy:以 SRS 为单位的边界框角(左下、右上)

请求类似于:

http://my.host.com/cgi-bin/mapserv?map=mywms.map&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&LAYERS=prov_bound&STYLES=&SRS=EPSG:4326&BBOX=-173.537,35.8775,-11.9603,83.8009&WIDTH=400&HEIGHT=300&FORMAT=image/png

或者,您可以在空间数据库中创建查询(如果您正在使用),然后传入要素 ID 并在那里进行过滤。

【讨论】:

以上是关于地图服务器空间过滤的主要内容,如果未能解决你的问题,请参考以下文章

搭建可离线的精美矢量切片地图服务

ArcGIS Engine开发之空间查询

cesium结合geoserver实现地图空间查询(附源码下载)

基于WebGLCesium技术的三维空间可视化

快速搭建简单的LBS程序——地图服务

回头看一看我的2019年