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

news2024/11/18 9:25:09

一、需求

       使用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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1025282.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

git 私有创建分支,合并及发布主干

文章目录 概要整体架构流程技术细节小结 概要 整体架构流程 例如: clone 复制代码下载地址到本地文件夹,并显示在idea上面new Branch 创建新的分支Repositories 本地资源,从本地资源创建分支Romote 远程 技术细节 提示:这里可…

为了这辆 G9,小鹏「砍了10个高管」

作者 | 张祥威 编辑 | 德新 “在25到30万之间的中高端SUV市场做到中国第一。” 9月19日,小鹏G9 2024款上市,何小鹏再战G9。 2024款的小鹏G9 共有5个版本: •650 Max 35.99万元 •702 Max 30.99万元 •570 Max 28.99万元 •702 Pro 28.39万…

ctf web基础php

1.preg_match函数绕过 1.数组绕过 <?php $pass$_GET[zx]; if(!preg_match("/admin/",$zx)false){die(hacker); } echo flag; ?> ?zx[]admin 2.换行符绕过 <?php $pass$_GET[zx]; if(!preg_match("/^.(admin).$/",$zx)false){die(hacker)…

兽医诊所温湿度失衡,该如何止损?

在现代社会中&#xff0c;宠物已经成为家庭的一员&#xff0c;人们越来越重视宠物的健康和幸福。兽医诊所作为照顾和治疗宠物的重要场所&#xff0c;不仅承担着宠物医疗护理的责任&#xff0c;还肩负着确保宠物在诊所内舒适、安全的任务。 然而&#xff0c;很多时候&#xff0c…

JMeter接口测试之文件上传

最近用JMeter做接口测试&#xff0c;频繁遇到了文件上传的接口&#xff0c;与其他一般接口的处理方式不一样&#xff0c;想着分享下&#xff0c;希望能给测试同学一点启发。 文章将围绕三个部分进行展开&#xff1a; 一、用户场景 二、接口请求参数 三、JMeter脚本编写步骤…

数字孪生相关政策梳理--数字孪生整体规划(可下载)

自2021年国家“十四五”规划纲要提出“探索建设数字孪生城市”以来&#xff0c;国家发展和改革委员会、工业和信息化部、住房和城乡建设部、水利部、农业农村部等部门纷纷出台政策&#xff0c;大力推动数字孪生在千行百业的落地发展。这些政策不仅为数字孪生的应用提供了广阔的…

期权策略篇: 实现买方狂欢,让卖方稳赚不赔的策略

欢迎来到期权策略篇: 实现买方狂欢&#xff0c;让卖方稳赚不赔的策略&#xff0c;今天给大家带来的期权策略比较简单&#xff0c;是我们比较常见的四种单腿期权策略&#xff0c;这四种策略分别是买入看涨期权、买入看跌期权、卖出看涨期权、卖出看跌期权策略。本文来自&#xf…

C. Binary Strings are Fun

Problem - C - Codeforces 思路&#xff1a;我们发现如果sisi-1&#xff0c;那么假设为00&#xff0c;用f[i-1]表示si-1能够组成的合法的个数&#xff0c;那么si-1扩展的字符串中至少会有i-1个0&#xff0c;那么si有两种放法&#xff0c;1种是放一个1&#xff0c;一种是放一个0…

python文件(概念、基本操作、常用操作、文本文件的编码方式)

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 &#x1f447; &#x1f447; &#x1f447; 更多精彩机密、教程&#xff0c;尽在下方&#xff0c;赶紧点击了解吧~ python源码、视频教程、插件安装教程、资料我都准备好了&#xff0c;直接在文末名片自取就可 1. 文件的概念…

python装13的一些写法

一些当你离职后&#xff0c;让老板觉拍大腿的代码 1. any(** in ** for ** in **) 判断某个集合元素&#xff0c;是否包含某个/某些元素 代码&#xff1a; if __name__ __main__:# 判断 list1 中是否包含某个/某些元素list1 [1,2,3,4]a any(x in [5,4] for x in list1) 输…

深拷贝与浅拷贝,就是这么简单

目录 1.拷贝的概念2.浅拷贝2.1. 浅拷贝的定义2.2. 浅拷贝的实现方式2.3 在内存中&#xff1a; 3. 深拷贝3.1. 深拷贝的定义3.2. 深拷贝的实现方式3.3 在内存中 4. 深拷贝与浅拷贝的区别5. 原型模式与深浅拷贝的关系6. 总结 1.拷贝的概念 在编程中&#xff0c;拷贝&#xff08;或…

循环神经网络--01 序列模型

生成数据 import torch from torch import nn from d2l import torch as d2lT 1000 time torch.arange(1,T1,dtypetorch.float32) x torch.sin(0.01*time)torch.normal(0,0.2,(T,)) d2l.plot(time,x,time,xlim[1,1000],figsize(6,3))将序列转换为特征-标签对&#xff08;fe…

【大数据之Kafka】十五、Kafka-Kraft模式

1 Kafka-Kraft架构 左图为 Kafka 现有架构&#xff0c;元数据在 zookeeper 中&#xff0c;运行时动态选举 controller&#xff0c;由controller 进行 Kafka 集群管理。   右图为 kraft 模式架构&#xff08;实验性&#xff09;&#xff0c;不再依赖 zookeeper 集群&#xff0…

以服务方式启动安防监控系统EasyNVR程序出现播放异常,是什么原因?

EasyNVR安防视频监控平台的特点是基于RTSP/Onvif协议&#xff0c;将前端设备统一接入&#xff0c;在平台进行转码、直播、处理及分发&#xff0c;在智慧安防视频监控场景中&#xff0c;EasyNVR可实现实时监控、云端录像、检索与回放、云存储、告警、级联等视频能力&#xff0c;…

湖南株洲三维扫描检测CNC机加工零件截面检测弧度测量-CASAIM中科广电

自工业时代开始以来&#xff0c;机械加工及零部件产业已经涵盖了各大电器零部件、汽车零部件、建筑机械零部件、航空航天零部件、海洋工程零部件等领域&#xff0c;涉及多种机械机床及工具仪器的制造。 零件在加工过程中&#xff0c;受制于加工工艺等各方面的因素&#xff0c;…

Tomcat调优【精简版】

Tomcat调优 优化Tomcat内存分配 调整Tomcat启动脚本contalina.sh,设置tomcat启动时分配的内存很可使用的最大内存; CATALINA_OPTS 调整Tomcat线程池 Tomcat默认使用的线程池:ThreadPoolExecutor 可以通过修改server.xml的 Connector 节点下的 maxThreads、minSpareThread…

关于删除的一些小纰漏

前端ajax如果传参不正确&#xff0c;会报500的错&#xff0c;可能是路径文件夹名字不对&#xff0c;一定要确认好&#xff0c;大写与小写的区别&#xff1a;question/QuestionStem_deleteList.do?ids"ids, 还有后面要加get请求后面要加"id",然后后面要加入传的…

004:vue使用relation-graph实现关系图谱

文章目录 1. 效果2. relation-graph简介3. 安装及使用4. 其他更多示例 1. 效果 2. relation-graph简介 这是一个Vue关系图谱组件&#xff0c;可以展示如组织机构图谱、股权架构图谱、集团关系图谱等知识图谱&#xff0c;可提供多种图谱布局&#xff0c;包括树状布局、中心布局…

神经网络训练防止过拟合和欠拟合的方法

神经网络训练防止过拟合和欠拟合的方法 1 过拟合的概念2 欠拟合的概念3 防止过拟合和欠拟合的方法 1 过拟合的概念 如上图所示&#xff0c;模型在训练时表现较好&#xff0c;在验证或测试时&#xff0c;表现较差&#xff0c;即表示过拟合。 过拟合的本质是模型对训练样本过度学…

Linux CentOS7 wc命令

wc命令的功能为统计指定文件中的字节数、字数、行数, 并将统计结果显示输出。 录入 man wc 可以查看相关信息 基本语法&#xff1a; wc [选项] 文件… 说明&#xff1a;该命令统计给定文件中的字节数、字数、行数。如果没有给出文件名&#xff0c;则从标准输入读取。wc同时也…