使用Leaflet对WMS做空间几何范围查询

2023-09-20 14:42:06

一、需求

       使用GeoServer发布的WMS服务对WMS做空间范围查询,默认情况下WMS支持点击查询,网上有很多的资料不在赘述。那么WMS做几何查询该怎么实现呢?

二、实现路径

        查询WMS查询的服务参数,WMS支持三种请求方式:GetCapabilities、GetMap、GetFeatureInfo。其中GetCapabilities获取WMS服务的元数据信息,GetMap用于出图;GetFeatureInfo获取属性信息,我们查询需要的是GetFeatureInfo请求方式,参数结果如下:

GetFeatureInfo操作请求地图上给定位置处要素的空间和属性数据它类似于WFS GetFeature操作,但在输入和输出方面不太灵活。由于 GeoServer 提供了 WFS 服务,我们建议尽可能使用它GetFeatureInfo

其优点之一GetFeatureInfo是请求使用返回的WMS图像中的 (x,y) 像素值。对于无法执行真实地理参考的天真的客户端来说,这更容易使用。

这里面大部分的都是跟出图参数相关的参数,重点关注x和y这两个参数,使用的像素坐标值,需要用leaflet进行转化。

空间查询的参数主要是以下几个:

     通过buffer可以做缓冲半径查询,通过cql_filter可以对返回的结果进行过滤,它支持ECQL格式,可以使用wkt语言文本格式传入空间条件,如下所示:

所以空间几何查询思路如下:

  1. 获取当前地图绘制的几何范围
  2. 获取几何范围的最大外接矩形
  3. 计算缓冲半径,进行空间查询
  4. 通过cql_filter过滤空间范围的结果
  5. 结果渲染、实现路径

三、代码实现

1、获取地图视窗的范围和宽高

// 获取地图视窗bounds
            const mapBounds = map.getBounds();
            const bbox = `${mapBounds._southWest.lng},${mapBounds._southWest.lat},${mapBounds._northEast.lng},${mapBounds._northEast.lat}`;
            // 获取地图视窗的宽高
            const mapClientHeight = map._container.clientHeight;
            const mapClientWidth = map._container.clientWidth;

            const size = map.getSize();

2、获取当前地图绘制的几何范围和外接矩形

// 获取geometry的最小外包矩形
                const geoBounds = geo.getBounds();
                params.BBOX = geoBounds.toBBoxString();
                // 计算四个点的像素位置
                // 右上角
                const _northEast = geoBounds._northEast;
                // 左下角
                const _southWest = geoBounds._southWest;
                // 转为屏幕坐标
                let northEastPoint = map.latLngToContainerPoint(_northEast, map.getZoom());
                let southWestPoint = map.latLngToContainerPoint(_southWest, map.getZoom());

3、根据外接矩形的宽高计算缓冲半径

// x,y坐标差
                const xf = Math.abs(northEastPoint.x - southWestPoint.x);
                const yf = Math.abs(southWestPoint.y - northEastPoint.y);
                // 设置图片的宽高,为x,y坐标差
                params.width = Math.floor(xf);
                params.height = Math.floor(yf);
                // 以图片宽高的一半为中心点
                params.X = Math.round(xf / 2);
                params.Y = Math.round(yf / 2);
                // 设置以中心点为圆心的缓冲半径(像素)
                // 以x,y屏幕坐标差大的设置buffer参数

                const buffer = xf > yf ? xf : yf;
                params.buffer = Math.round(buffer / 2);

3、拼接cql_filter过滤空间范围

// geojson 跟 wkt 相互转换
                const wktReader = new Wkt.Wkt();
                const wkt = wktReader.read(JSON.stringify(geometry));
                // 二次过滤,设置过滤的空间范围
                params.CQL_FILTER = `INTERSECTS(the_geom,${wkt.write()})`;
            }

4、查询返回结果

$.ajax({
                url: url + L.Util.getParamString(params),
                success: (response) => {
                    console.log(response);
                    queryResultLayers.addLayer(L.geoJSON(response))
                }
            })

参考资料:

ECQL Reference — GeoServer 2.23-SNAPSHOT User Manual

更多推荐

QT-day1作业

#include"mywnd.h"#include<iostream>#include<QDebug>#include<QIcon>#include<QPushButton>#include<QLabel>#include<QLineEdit>MyWnd::MyWnd(QWidget*parent):QWidget(p

知识图谱(4)图算法

基于图有很多任务,比如:节点分类:预测哪些网站是诈骗网站;关系预测:判断图中两个节点的关系;图分类:分子性质预测;聚类:社交网络分析,将相似用户聚类在一起,再推荐适合该簇的商品;图生成:药物分子生成,药物发现;目录图基础内容图遍历图聚类Node2Vec图基础内容节点的度:节点的边的数量。对于有向图,度还可以分为入度和出

植物大战僵尸各种僵尸攻略(四)

前言此文章为“植物大战僵尸”专栏中的011刊(2023年9月第十刊),欢迎订阅。版权所有。注意:1.本博客适用于pvz无名版;2.pvz指植物大战僵尸(PlantsVSZonbies);3.本文以耗费低做标准,方法不唯一;4.本期讲述难度较中型的僵尸。各种僵尸攻略潜水僵尸潜水僵尸有两种形态:第一种是普通形态;第二种是莲

虚拟人三维动画宣传片案例分享 | 广州“五羊”城市文化IP商业体裸眼3D广告影片

随着时代的发展+元宇宙的助推,裸眼3D形式的宣传方式逐渐出现在大众眼前。以数字人IP的3D立体效果吸引大众目光,让其驻足拍照、录视频分享至社交平台,为企业品牌带来高频传播价值。近日,广州“五羊”城市文化IP裸眼3D广告宣传片在广州黄埔大悦汇商业体精彩亮相,极具冲击力的视觉效果,令过往市民旅客大饱眼福,赋予城市现代感,打

LabVIEW使用PID对激振器控制

LabVIEW使用PID对激振器控制LabVIEW的PID在许多项目中都会用到,比如温度控制、压力控制、流量控制等,一般用自带的PID通过调节参数的值,基本上都可以解决。现在项目的情况是,通过正弦波的输出控制激振器,输出正弦波的幅值与激振器的运动距离相关。波形输出是通过阿尔泰PCI5655实现,激振器也是国产。通过采集

提交本地项目到GitHub

文章目录1下载git1.1通过homebrew安装Git1.2通过Xcode安装2创建sshkey、配置git3提交本地项目到GitHub说明:该博文参考这篇文章和这段视频1下载git1.1通过homebrew安装Git1、未安装homebrew,需安装homebrew/usr/bin/ruby-e"$(curl-fs

Unity中Shader的屏幕抓取 GrabPass

文章目录前言一、抓取1、抓取指令2、在使用抓取的屏幕前,需要像使用属性一样定义一下,_GrabTexture这个名字是Unity定义好的前言Unity中Shader的屏幕抓取GrabPass一、抓取1、抓取指令屏幕的抓取需要使用一个PassGrabPass{}GrabPass{“NAME”}2、在使用抓取的屏幕前,需要

Apache Doris 快速入门

1.基本概念FE,Frontend,前端节点,接收用户查询请求,SQL解析,执行计划生成,元数据管理,节点管理等BE,Backend,后端节点,数据存储,执行查询计划。前端节点FE和后端节点BE各自独立运行,互不影响。broker:用来和外部文件系统打交道2.修改配置DORIS_HOME=/export/server/

【数据结构】&&【C++】红黑树RBTree的模拟实现(平衡搜索二叉树)

【数据结构】&&【C++】红黑树的模拟实现(平衡搜索二叉树)一.红黑树的性质二.红黑树的模拟实现1.结点的定义2.搜索树的插入3.变色+向上处理4.旋转+变色三.红黑树与AVL树的差别四.完整代码一.红黑树的性质1.什么是红黑树?红黑树是一种搜索二叉树,但又在搜索树的基础上,在每个结点上增加一个存储位表示结点的颜色,颜

国际版阿里云/腾讯云免开户:云存储服务:云存储服务能够让你随时随地拜访和同享文件

云存储服务:云存储服务能够让你随时随地拜访和同享文件云存储服务是一种基于云技术的存储渠道,能够让用户存储、管理和同享各种类型的数据文件,如文档、图片、视频、音频等。这种服务具有许多长处,以下是对其进行的详细分析:长处:​随时随地拜访:云存储服务答应用户从任何地方、任何设备拜访文件,只要有互联网衔接即可。这对于在家办公、

Apache解析漏洞复现

一、多后缀解析漏洞1.漏洞说明配置apache时,对于apache配置不熟练,配置命令不清楚,在配置PHP文件处理程序时,配置命令存在问题:位于漏洞环境目录的conf/docker-php.conf里的配置命令(AddHandlerapplication/x-httpd-php.php),该命令会将后缀中只要含有.ph

热文推荐