vue+openlayers 点击地图查询geoserver发布的WMS/WMTS图层的信息[矢量(点、线、面)+栅格]

news2024/11/18 9:38:08

一、基本介绍

网络地图服务 (WMS) 、网络地图切片服务 (WMTS) ,根据用户的请求返回相应的地图(包括PNG,GIF,JPEG等栅格形式或者是SVG和WEB CGM等矢量形式)。

下面是常见的geoserver发布的图层格式,有矢量图层(点、线、面),或栅格图层(具体概念不再赘述)

不论是WMS或者是WMTS,大部分请求回的是图片格式,所以我们没有办法直接获取到当前点击点的信息,但实际工作中,我们经常要查看某一点的具体信息,比如下图,我们想要查看影像图的像元信息 

 

二、查询

1、矢量图层查询

核心一:借助WFS点与面的相交,获取信息

点/线图层----核心是围绕当前点构造缓冲区与判断是否与图层点相交

围绕点击点构造缓冲区 geom

let polygonGeom = null
let pixel = this.map.getPixelFromCoordinate(mapEvt.coordinate);//获取点击点的x,y坐标
        
let bufPixel = 10; //缓冲距离
let p1 = [pixel[0] - bufPixel, pixel[1] - bufPixel];
let p2 = [pixel[0] + bufPixel, pixel[1] - bufPixel];
let p3 = [pixel[0] + bufPixel, pixel[1] + bufPixel];
let p4 = [pixel[0] - bufPixel, pixel[1] + bufPixel];
polygonGeom = new Polygon([([
          [
            this.map.getCoordinateFromPixel(p1),
            this.map.getCoordinateFromPixel(p2),
            this.map.getCoordinateFromPixel(p3),
            this.map.getCoordinateFromPixel(p4),
            this.map.getCoordinateFromPixel(p1),
          ],
])]); //构造缓冲区

面图层-----核心就是判断点击点与图层面是否相交

点击点的geom

let pointGeom = new Point(mapEvt.coordinate);

核心二、借助ECQL中的相交函数INTERSECTS

1、先将geom转为wkt格式

//如果是点/线 图层就是
let wkt = new WKT().writeGeometry(polygonGeom) //构造的缓冲区

// 如果是面图层就是
let wkt = new WKT().writeGeometry(pointGeom)

2、利用INTERSECTS 构造cql_filter 

//INTERSECTS用法,第一个字段是数据库表中的空间字段,第二个就是一个wkt字符串
INTERSECTS(the_geom'', wkt)

 核心三、发送wfs请求

下面是封装好的wfs请求函数

/** 
接收一个对象,对象里面的参数支持
    url(必传)
    layername (必传) bincheng:gis_xjqy
    cql(非必传)
    propertyname:需要返回的字段,参数是以逗号分割的字符串(默认返回全部)
**/
export function wfsQuery(obj = {}) {
    const { url, layername, cql, propertyname,srsName='EPSG:4326' } = obj
    return new Promise((resolve, reject) => {
        let featureRequest = {
            service: "WFS",
            version: "1.0.0",
            request: "GetFeature",
            srsName,
            typename: layername,
            outputFormat: "application/json",
        };
        if (cql) featureRequest.CQL_FILTER = cql
        if (propertyname) featureRequest.PROPERTYNAME = propertyname
        let fetchUrl = ''
        fetchUrl = `${url}${url.indexOf("?") > -1 ? '&' : '?'}${formateObjToParamStr(featureRequest)}`

        fetch(fetchUrl, {
                method: 'GET',
                headers: new Headers({
                    'Accept': 'application/json;charset=utf-8',
                    'Content-Type': 'application/x-www-form-urlencoded'
                }),
                mode: "cors"
            })
            .then(function(response) {
                return response.json();
            }).then(json => {
                resolve(json)
            }).catch((err) => {
                reject(err)
            })

    })
}


export function formateObjToParamStr(paramObj) {
    const params = new URLSearchParams();
    for (let attr in paramObj) {
        params.append(attr, paramObj[attr]);
    }
    return params.toString();
}

使用

            wfsQuery({
                layername:'test:cjqy',
                url:`http://localhost:8010/geoserver/wfs`,
                cql:`INTERSECTS(the_geom'',${wkt})`
            }).then(res => {
               console.log(res) //查询结果
            })

2、栅格图层查询

栅格图层查像元信息,主要借助的是getFeatureInfoUrl

调用代码

var viewResolution = this.map.getView().getResolution();
let url = this.layer.getSource().getFeatureInfoUrl(e.coordinate, viewResolution, this.projection || "EPSG:4326", {
        INFO_FORMAT: "application/json",
})
if(url){
   fetch(url).then(function (res) {
              return res.text(); //返回Promise
   }).then((data) => {
              let objData = JSON.parse(data);
              // let info = objData.features[0].properties.GRAY_INDEX;
              console.log(objData)
  });
}

三、查询示例(封装矢量/栅格--查询)

//wfsQuery函数,上面已经有了,这里不再重复写了


/* 
  coordinate:坐标点
  wfsUrl:wfs地址
  srs: 投影坐标系
  type类型,接收(Point/PolyLine/Polygon/tiff)
  shape(string|null): 空间字段,如果是矢量图层,则需要传,默认the_geom, 栅格图层传null即可
  layername: 图层
  */
  queryclickinfo({ coordinate, type, wfsUrl, shape, layername, srs }) {
    return new Promise((resolve, reject) => {
      {
        if (type == "tiff") {
          var viewResolution = this.map.getView().getResolution();
          let url = this.layer
            .getSource()
            .getFeatureInfoUrl(
              e.coordinate,
              viewResolution,
              srs || "EPSG:4326",
              {
                INFO_FORMAT: "application/json",
              }
            );
          if (url) {
            fetch(url)
              .then(function (res) {
                return res.text(); //返回Promise
              })
              .then((data) => {
                let objData = JSON.parse(data);
                // let info = objData.features[0].properties.GRAY_INDEX;
                resolve(objData);
              })
              .catch((err) => reject(err));
          }
        }
        let geom, wkt;
        if (type == "Point" || type == "PolyLine") {
          let pixel = this.map.getPixelFromCoordinate(coordinate); //获取点击点的x,y坐标

          let bufPixel = 10; //缓冲距离
          let p1 = [pixel[0] - bufPixel, pixel[1] - bufPixel];
          let p2 = [pixel[0] + bufPixel, pixel[1] - bufPixel];
          let p3 = [pixel[0] + bufPixel, pixel[1] + bufPixel];
          let p4 = [pixel[0] - bufPixel, pixel[1] + bufPixel];
          geom = new Polygon([
            [
              [
                this.map.getCoordinateFromPixel(p1),
                this.map.getCoordinateFromPixel(p2),
                this.map.getCoordinateFromPixel(p3),
                this.map.getCoordinateFromPixel(p4),
                this.map.getCoordinateFromPixel(p1),
              ],
            ],
          ]); //构造缓冲区
        }

        if (type == "Polygon") {
          geom = new Point(coordinate);
        }
        if (geom) wkt = new WKT().writeGeometry(geom);

        if (wkt) {
          this.wfsQuery({
            layername,
            url: wfsUrl,
            cql: `INTERSECTS(${shape},${wkt})`,
          })
            .then((res) => {
              resolve(res);
            })
            .catch((err) => reject(err));
        }
      }
    });
  }


返回结果如下 

 

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

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

相关文章

ODX(ISO22901)进阶——Intorduction to ODX

文章目录 前言一、Vehicle Diagnostic是什么?二、Diagnostic Data in ODX(诊断数据在ODX数据库)三、ODX企标概述(ODX Authoring Guidelines)总结前言 今天是2023年7月15日,距离2024年只剩下半年时间。伴随着各地疫情政策逐渐发开,三年的疫情终于迎来了不一样的变化。期…

AI绘画Stable Diffusion实战操作: 62个咒语调教-时尚杂志封面

今天来给大家分享,如何用sd简单的咒语输出好看的图片的教程,今天做的是时尚杂志专题,话不多说直入主题。 还不会StableDiffusion的基本操作,推荐看看这篇保姆级教程: AI绘画:Stable Diffusion 终极炼丹宝…

C++并发编程(1):基本概念、线程管控

学习视频与书籍 学习视频 c11并发与多线程视频课程 学习书籍 我本来打算去图书馆借《C新经典》的,偶然发现这本书,如获至宝 书挺新的,我看译者序是21年10月这本书挺贵的,后面写着139.80,大家还是去图书馆借吧作为基础…

Linux驱动之字符设备驱动框架与示例模板

目录 一、字符设备驱动简介 二、字符设备驱动开发步骤 1.确定设备号 2.定义 file_operations 结构体 3.实现操作函数 4.注册和注销字符设备 5.编译和加载模块 6.用户空间交互: 三、字符设备驱动示例模板 四、字符设备驱动开发总结 一、字符设备驱动简介 字…

未来Mac下载站怎么打不开了

重要公告: 未来软件园因业务需要现更换域名 原域名:Mac.orsoon.com 更为新域名:未来mac下载-Mac软件-mac软件下载-mac软件大全 程序已全面转移,请访问新域名

MySQL中的索引和事务 (数据库系列5)

目录 前言: 1.索引 1.1 索引的概念 1.2索引的作用 1.3索引的使用场景 1.4索引的使用 1.4.1查看索引 1.4.2创建索引 1.4.3删除索引 1.5索引背后的数据结构 1.5.1 B-树 1.5.2 B树 2.事务 2.1事务的概念 2.2数据库事务的四个特性 2.2.1原子性 2.2.2一…

城会玩,Selenium+Docker成功解决这一大难题

01、需求背景 日常测试中会遇到对web应用进行UI自动化的测试场景,一般常用的工具是使用Selenium,一套简单的UI自动化架构如下: 上图即为简单搭建的一套UI自动化测试架构,但 串行执行测试用例: 一台机器只能安装一个…

《英雄联盟》提示丢失D3DCompiler_43.dll的三个解决方法

在我们打开游戏《英雄联盟》的时候,计算机报错提示“由于找不到D3DCompiler_43.dll,无法继续执行此代码”,“D3DCompiler_43.dll丢失”是怎么回事呢?D3DCompiler_43.dll是一个Microsoft DirectX的组件文件,它是用于编译…

博客系统(使用前后端分离)

博客系统 前言一.准备工作1.1 准备好前端文件1.2 设计数据库1.3 编写基本的数据库代码1.4 封装好数据库的连接操作1.5 根据设计的表创建实体类1.6 根据实体类,提供一些简单的增删改查操作 二.博客要实现的功能2.1 博客列表页功能2.2 博客详情页2.3 博客登录页2.4 页面强制登录功…

涵子来信——AI的无限未来——谈谈想法

大家好: 这一次,我想要跟大家讲一讲我对AI的看法和未来的展望,谈谈我的想法。 AI(Artificial Intelligence,中文人工智能),是我们生活中处处都可以见到的,小到一个语音助手&#x…

ylb-接口13实名认证

总览: 在api模块下的service包,创建一个充值接口RechargeService,并创建一个(根据userID查询它的充值记录)方法: package com.bjpowernode.api.service;import com.bjpowernode.api.model.RechargeRecord…

迪赛智慧数——柱状图(多色柱状图):旅行灵感来源

效果图 涉足旅行就是一次睿智的选择,心系未来、永不停步,让精神和思维得到滋养,更加懂得珍惜和感恩,这是旅行给予生活的灵感。西方一位哲人也说过,“生命的意义在于尝试,体验不同的可能”,旅行能…

基于springboot+Redis的前后端分离项目(九)-【黑马点评】

🎁🎁资源文件分享 链接:https://pan.baidu.com/s/1189u6u4icQYHg_9_7ovWmA?pwdeh11 提取码:eh11 附近的商户、用户签到、UV统计 (一)附近的商户1.附近商户-GEO数据结构的基本用法2.附近商户-导入店铺数据到…

Python实现登陆界面+生日界面

文章目录 1. 需求分析1.1 功能分析1.2 性能分析 2. 技术原理3. 详细设计3.1 登录界面3.2 注册界面3.3 修改密码3.4 注销账户3.5 生日界面 4. 功能实现4.1 登陆界面4.2 注册界面4.3 修改密码4.4 注销账户4.5 生日界面 1. 需求分析 1.1 功能分析 ① 登录界面实现用户的登录、注…

消费者行为分析VR情景模拟演练系统

VR虚拟现实技术是一种先进的技术,利用VR开展消费者行为分析课程是一种创新的教育方式,它可以提高学生的学习兴趣和效果,同时也可以为企业提供更好的人才培训和发展机会。 1.帮助学生更好地理解和应用心理学概念:VR技术可以让学生…

【Vite搭建Vue3项目】如何使用自定义的svg

Vite搭建Vue3项目如何使用自定义的svg 1. 准备一份svg图标集放入到自己想放的目录2. 下载对应的插件并进行配置3. 测试使用 绪论:当用 vite 构建 vue3 项目的时候,咱可以使用 Element-plus 为我们提供的图标,但是它是一个个标签,当…

HTTP1.1 wireshark分析

本地springboot启动一个简单的服务,然后请求测试 tcpdump -i lo0 -nnvv -w tmp.cap tcpdump 本地回环网卡 http1.1 HTTP/1.0 每进行一次通信,都需要经历建立连接、传输数据和断开连接三个阶段。当一个页面引用了较多的外部文件时,这个建立…

两种异步日志方案的介绍

文章目录 一、日志写入逻辑1.1 相关接口函数1.2 写入逻辑 二、log4cpp 日志框架2.1 下载和编译2.2 日志级别2.3 日志格式2.4 日志输出2.5 日志回滚 三、muduo 异步日志库3.1 异步日志机制3.2 双缓冲机制3.3 前端日志写入3.4 后端日志落盘3.5 coredump 查找未落盘的日志3.6 总结…

复习第六课 C语言-排序,初识指针

目录 【1】冒泡排序&#xff08;从小到大&#xff09; 【2】选择排序 【3】二维数组 【4】指针 【5】指针修饰 【6】大小端 【7】初见二级指针 练习&#xff1a; 【1】冒泡排序&#xff08;从小到大&#xff09; #include <stdio.h> //数组哪里的\0?自己和字符串…

论文阅读-2:基于深度学习的大尺度遥感图像建筑物分割研究

一、该网络中采用了上下文信息捕获模块。通过扩大感受野&#xff0c;在保留细节信息的同时&#xff0c;在中心部分进行多尺度特征的融合&#xff0c;缓解了传统算法中细节信息丢失的问题&#xff1b;通过自适应地融合局部语义特征&#xff0c;该网络在空间特征和通道特征之间建…