Openlayers 加载 Geoserver 图层以及范围过滤

Openlayers 加载 Geoserver 图层以及范围过滤

    • 范围过滤核心代码
    • 完整代码:
    • 在线示例

Openlayers 加载 Geoserver 图层,除了会遇到属性条件查询需求,还经常遇到空间查询,这里介绍一些范围查询。

其实就是利用 Geoserver 的 CQL_FILTER 实现功能,即增加 BOX(EXTENT )条件。

本文包括范围过滤核心代码、完整代码以及在线示例。


范围过滤核心代码

Geoserver 范围过滤核心代码:


// 定义矩形
let geometryFunction = ol.interaction.Draw.createBox(4);

drawObject = new ol.interaction.Draw({
    source: drawLayer.getSource(),
    type: 'Circle',
    geometryFunction: geometryFunction,
});

// 清空之前标绘
drawObject.on('drawstart', function () {
    drawLayer && drawLayer.getSource().clear();
    geoserverFilter();
})

// 标绘完成回调
drawObject.on('drawend', function (e) {
    // 查询范围内数据
    geoserverFilter(e.feature.getGeometry().getExtent());
});

map.addInteraction(drawObject);



// 图层资源
const source = layer.getSource()

// 资源参数
let param = source.getParams();


let filter;

if (box) {

    box = box.join(",");

    // 注意空间字段名称和大小写
    filter = ' BBOX(the_geom,' + box + ')';

}
//过滤条件赋值
param.CQL_FILTER = filter;

//更新图层资源
source.updateParams(param);

//刷新资源
source.refresh();



完整代码:


<html lang="en">
<head>
    <meta charSet="utf-8">
    <!--注意:openlayers 原版的比较慢,这里引起自己服务器版-->
    <link rel="stylesheet" href="http://openlayers.vip/examples/css/ol.css" type="text/css">
    <style>
        /* 注意:这里必须给高度,否则地图初始化之后不显示;一般是计算得到高度,然后才初始化地图 */
        .map {
            height: 500px;
            width: 100%;
            float: left;
        }

        .ol-zoom {
            display: none;
        }

    </style>
    <!--注意:openlayers 原版的比较慢,这里引起自己服务器版-->
    <script src="http://openlayers.vip/examples/resources/ol.js"></script>
    <script src="http://openlayers.vip/examples/resources/turf.min.js"></script>
    <script src="./tiandituLayers.js"></script>
    <title>OpenLayers example</title>
    <script>
        var _hmt = _hmt || [];
        (function () {
            var hm = document.createElement("script");
            hm.src = "https://hm.baidu.com/hm.js?f80a36f14f8a73bb0f82e0fdbcee3058";
            var s = document.getElementsByTagName("script")[0];
            s.parentNode.insertBefore(hm, s);
        })();
    </script>
</head>
<body>
<h2 style="height: 60px;">Openlayers geoserver extent</h2>
<!--地图容器,需要指定 id -->
<div id="map" class="map"></div>
<script type="text/javascript">

    // 初始化地图
    var map = new ol.Map({
        // 地图容器
        target: 'map',
        // 地图图层,比如底图、矢量图等
        layers: [
            getVEC_CLayer(),
            getCVA_CLayer(),
        ],
        // 地图视野
        view: new ol.View({
            projection: "EPSG:4326",
            // 定位
            center: [115.67724700667199, 37.73879478106912],
            // 缩放
            zoom: 6,
            maxZoom: 18,
            minZoom: 1,
        })
    });

    // 加载 geoserver 图层
    let layer;

    // 添加图层
    function geoserverFunc() {

        clearFunc();

        layer = new ol.layer.Tile({
            extent: [
                115.41380999600005,
                39.44197808500007,
                117.49920000500002,
                41.05928408300005
            ],
            source: new ol.source.TileWMS({
                // geoserver 地址
                url: 'http://openlayers.vip/geoserver/cite/wms',
                params: {
                    // 图层名称
                    LAYERS: 'cite:2000',
                    TILED: true
                },
                serverType: 'geoserver',
                transition: 0
            })
        })

        map.addLayer(layer);
        // 定位
        map.getView().fit(layer.getExtent(), map.getSize());

        draw();
    }

    // 图层过滤
    function geoserverFilter(box) {

        if (layer) {

            // 图层资源
            const source = layer.getSource()

            // 资源参数
            let param = source.getParams();


            let filter;

            if (box) {

                box = box.join(",");

                // 注意空间字段名称和大小写
                filter = ' BBOX(the_geom,' + box + ')';

            }
            //过滤条件赋值
            param.CQL_FILTER = filter;

            //更新图层资源
            source.updateParams(param);

            //刷新资源
            source.refresh();
        }
    }

    // 标绘样式
    var defaultStyle = [
        new ol.style.Style({
            stroke: new ol.style.Stroke({
                color: '#0000ff',
                width: 0.5,
            })
        }), new ol.style.Style({
            stroke: new ol.style.Stroke({
                color: '#00f0f0',
                width: 6,
            })
        }), new ol.style.Style({
            stroke: new ol.style.Stroke({
                color: '#0000ff',
                width: 0.5,
            })
        }), new ol.style.Style({
            //填充样式
            fill: new ol.style.Fill({
                color: 'rgba(0, 0, 255, 0.3)',
            }),
            image: new ol.style.Circle({
                radius: 5,
                fill: new ol.style.Fill({
                    color: 'white',
                })
            })
        })]

    /**
     * @todo 矢量图层
     * @returns {VectorLayer}
     * @constructor
     */
    function initVectorLayer() {
        //实例化一个矢量图层Vector作为绘制层
        let source = new ol.source.Vector();
        //创建一个图层
        let customVectorLayer = new ol.layer.Vector({
            source: source,
            zIndex: 2,
            //设置样式
            style: defaultStyle,
        });
        //将绘制层添加到地图容器中
        map.addLayer(customVectorLayer);

        return customVectorLayer;
    }

    // 标绘图层
    var drawLayer = initVectorLayer();

    // 标绘对象、查询到的图形要素
    let drawObject, feature;

    // 标绘查询方法
    // openlayers 范围查询(extent)
    function draw() {

        // 移除上次标绘
        drawObject && map.removeInteraction(drawObject);

        // 定义矩形
        let geometryFunction = ol.interaction.Draw.createBox(4);

        drawObject = new ol.interaction.Draw({
            source: drawLayer.getSource(),
            type: 'Circle',
            geometryFunction: geometryFunction,
        });

        // 清空之前标绘
        drawObject.on('drawstart', function () {
            drawLayer && drawLayer.getSource().clear();
            geoserverFilter();
        })

        // 标绘完成回调
        drawObject.on('drawend', function (e) {
            // 查询范围内数据
            geoserverFilter(e.feature.getGeometry().getExtent());
        });

        map.addInteraction(drawObject);
    }

    // 清空
    function clearFunc() {
        layer && map.removeLayer(layer) , layer = undefined;
        drawLayer && drawLayer.getSource().clear();
        drawObject && map.removeInteraction(drawObject);
    }

    geoserverFunc();


</script>
<button id="geoserverFunc" onClick="geoserverFunc()">geoserver</button>
<button id="restoreFunc" onClick="geoserverFilter()">restoreFunc</button>
<button id="clearFunc" onClick="clearFunc()">清空</button>
</body>
</html>


在线示例

在这里插入图片描述

在这里插入图片描述

Openlayers 在线示例:Geoserver 图层以及范围过滤

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS应用程序框架

应用程序入口—UIAbility的使用 UIAbility概述 UIAbility是一种包含用户界面的应用组件&#xff0c;主要用于和用户进行交互。UIAbility也是系统调度的单元&#xff0c;为应用提供窗口在其中绘制界面。 每一个UIAbility实例&#xff0c;都对应于一个最近任务列表中的任务。 …

深入理解Dubbo-8.Dubbo的失败重试设计

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码、Kafka原理、分布式技术原理&#x1f525;如果感觉博主的文章还不错的话&#xff…

搭建Tomcat调试环境并分析CVE-2017-12615

准备 下载存在漏洞版本tomcat&#xff0c;这里下的是8.0.45 https://archive.apache.org/dist/tomcat/tomcat-8/v8.0.45/ 可执行文件和源码都需要下载 用idea打开源码文件&#xff0c;然后将java目录设置为源码目录 配置一下jdk 转成maven项目 添加一些依赖 <dependencie…

DS冲刺整理做题定理(二)线性表、栈、队列的套路

继续归纳套路&#xff0c;做题练习非常重要&#xff0c;王道的基本上足够了&#xff0c;学有余力可以做一下数据结构1800~ DS冲刺整理做题定理&#xff08;一&#xff09;二叉树专题https://blog.csdn.net/jsl123x/article/details/134949736?spm1001.2014.3001.5501 目录 一…

复旦微固化流程

生成boot.bin 如图所示&#xff0c;psoc下的create boot image&#xff0c;选择文件配置路径output bif&#xff0c;任意命名 点击右侧add&#xff0c;分别添加三部分 1.编译FSBL工程后SDK\system_platform\FSBL\Debug\Exe路径下的FSBL.out 2.PL侧的bit文件 3.编译工程后SDK\sy…

1.【Multisim仿真】数电模电学习,仿真软件的初步使用

学习计划路径&#xff1a; >Multisim电路仿真软件熟练掌握 >数字电路基础课程 >逻辑电路设计与应用 >熟练掌握存储器、脉冲波形发生器、D/A和A/D转换器原理 >基本元器件熟练掌握 >晶体管放大电路及负反馈放大电路 >集成运算放大器设计 >电压变电流电路…

Springboot整合阿里巴巴SMS

前提条件 要确保用户有这个权限 还要确保组要有这个权限 讲反了要先保证组有这个权限然后保证用户有这个权限&#xff0c;然后就可以使用这个用户的权限的key来调取api了 申请资质、签名等 申请资质 点击这个进入声请就可以了然后等2个小时左右就可以通过了 申请签名 这个是为…

实操Nginx(4层代理+7层代理)+Tomcat多实例部署,实现负载均衡和动静分离

目录 前言 一、tomcat多实例部署 步骤一&#xff1a;先安装jdk&#xff0c;设置jdk的环境变量&#xff0c;验证是否安装完成&#xff08;192.168.20.8&#xff09; 步骤二&#xff1a;安装tomcat&#xff08;192.168.20.18&#xff09; 步骤三&#xff1a;安装tomcat多实例…

Python数据科学视频讲解:Python保留字与标识符

2.6 Python保留字与标识符 视频为《Python数据科学应用从入门到精通》张甜 杨维忠 清华大学出版社一书的随书赠送视频讲解2.6节内容。本书已正式出版上市&#xff0c;当当、京东、淘宝等平台热销中&#xff0c;搜索书名即可。内容涵盖数据科学应用的全流程&#xff0c;包括数据…

VPN 在网络安全中的应用

虚拟专用网络&#xff08;Virtual Private Network&#xff0c;VPN&#xff09;是指利用不安全的公共网络如 Internet 等作为传输媒介&#xff0c;通过一系列的安全技术处理&#xff0c;实现类似专用网络的安全性能&#xff0c;保证重要信息的安全传输的一种网络技术。 1&#…

【网络通信原理之套接字】

目录 概念 分类 数据报套接字&#xff1a;使用传输层UDP协议 流套接字&#xff1a;使用传输层TCP协议 原始套接字 Socket编程注意事项 前言&#xff1a;本文主要介绍了在什么是套接字及在Java中套接字是什么&#xff0c;和在套接字编程的注意事项。 概念 Socket套接…

轮转数组00

题目链接 轮转数组 题目描述 注意点 使用空间复杂度为 O(1) 的 原地 算法解决这个问题 解答思路 本题有多种思路&#xff0c;一种是复制nums数组&#xff0c;然后将k个位置后的值赋值给当前位置即可&#xff0c;但是空间复杂度为O(n)还有一种思路是先将整个数组进行翻转&a…

参数学习——糖果问题(人工智能期末复习)

之前看了好久都不知道这题咋写&#xff0c;后来看了这篇机器智能-高频问题&#xff1a;糖果问题&#xff0c;大概看明白了&#xff0c;其实主要围绕着这两个公式 光看公式也看不懂&#xff0c;还是要结合题目来 己知有草莓味和酸橙味两种类型的糖果&#xff0c;分别放入5种不同…

【FPGA/verilog -入门学习10】verilog 查表法实现正弦波形发生器

0&#xff0c;需求 用查找表设计实现一个正弦波形发生器 寻址的位宽是10位&#xff0c;数据量是1024个&#xff0c;输出的数据是16位 1&#xff0c;需求分析 数据量是1024个&#xff1a; x linspace(0,2*pi,1024) 输出数据是16位: y范围&#xff1a;0~2^16 -1 0~65535…

Docker部署Mysql5.7x和Myslq8.x

Docker部署Mysql5.7x和Myslq8.x 文章目录 1.部署mysql5.7.x2.部署mysql8.x3.创建用户授权及远程登录3.1 mysql5.7创建用户授权及远程登录3.2 mysql8创建用户授权及远程登录 4.总结 1.部署mysql5.7.x 在D盘下的mysql目录下新建如下目录&#xff1a; D:\mysql\conf\my.cnf内容如下…

8GB内存的 MacBook Pro够用吗?苹果高管回应:完全够用

苹果 2023 年 M3 芯片款 MacBook Pro 运行内存为 8GB 起步&#xff0c;因此招致了外界广泛的批评&#xff0c;外媒 MacRumors 日前评价了配备相关运行内存的 MacBook Pro&#xff0c;认为 8GB RAM 在“专业和创意工作中”不够用&#xff0c;只适合“网页浏览、文档编辑、播放影…

java实现局域网内视频投屏播放(四)投屏实现

代码链接​​​​​​​​​​​​​​​​​​​​​ 设备发现 上一篇文章说过&#xff0c;设备的发现有两种情况&#xff0c;主动和被动&#xff0c;下面我们来用java实现这两种模式 主动发现 构建一个UDP请求发送到239.255.255.250:1900获取设备信息&#xff0c;UDP包的…

对比学习学习记录1

对比学习学习记录 SimCLR Framework 关键在于定义正负样本判断异同相同的就是正例不同的就是负例让模型学到其中的规律 通过encoder对图像提取特征得到一个向量这里的encoder可以是resnet还需要定义相似度的函数计算正负样本之间的距离 对于上面的图片首先对图片进行两种随机的…

zabbix——实现高效网络监控

在当今的数字化时代&#xff0c;网络和服务器的健康状况对于企业的正常运营至关重要。为了及时发现和解决潜在的问题&#xff0c;许多企业选择使用网络监控工具来追踪服务器的性能和网络参数。其中&#xff0c;Zabbix是一个功能强大且开源的网络监控工具&#xff0c;被广泛应用…

环境搭建及源码运行_java环境搭建_mysql安装

1、介绍 MySQL是一个关系型数据库管理系统&#xff0c;由瑞典MySQL AB 公司开发&#xff0c;属于 Oracle旗下产品。MySQL是最流行的关系型数据库管理系统之一 1、源码中涉及到的表&#xff1a;mysql 表&#xff1a;订单、意见反馈、用户基础信息、商品、购物车等表 2、订单属于…