vue+leaflet示例:结合geoserver实现地图空间查询(附源码下载)

news/2025/3/28 22:11:26/文章来源:https://www.cnblogs.com/giserhome/p/18791516

demo源码运行环境以及配置

  • 运行环境:依赖Node安装环境,demo本地Node版本:14.19.1。
  • 运行工具:vscode或者其他工具。
  • 配置方式:下载demo源码,vscode打开,然后顺序执行以下命令:
    (1)下载demo环境依赖包命令:npm i
    (2)启动demo命令:npm run dev
    (3)打包demo命令: npm run build:release

示例效果


本篇主要是leaflet通过调用geoserver发布的地图服务WFS,来达到地图空间查询的目的。具体是构造rest服务url参数形式来请求WFS服务,获取到地图数据源,然后利用leaflet来叠加显示在地图上展示。
利用leaflet插件绘制图形工具draw的回调函数获取绘制图形,作为空间查询过滤条件,绘制工具的github地址:
https://github.com/geoman-io/leaflet-geoman

  • 核心源码
<template><div id="map"></div><div class="titleContainer center"><span>vue+leaflet示例:结合geoserver实现地图空间查询</span></div>
</template><script setup>
import { onMounted, reactive, ref } from "vue";
import L from "leaflet";
import "proj4";
import "proj4leaflet";
import "@geoman-io/leaflet-geoman-free";
import "@geoman-io/leaflet-geoman-free/dist/leaflet-geoman.css";
import config from "../config";
import { useRouter } from "vue-router";
const router = useRouter();
//绘制geojson图层样式
const geoJsonStyle = {color: "#e6d933",weight: 3,opacity: 0.8,fillColor: "#e6d933",fillOpacity: 0.1,
};
//绘制geojson图层高亮样式
const geoJsonHLightStyle = {color: "#33CCFF",weight: 3,opacity: 1,fillColor: "#33CCFF",fillOpacity: 0,
};
const geoserverUrl = "http://localhost:8080/geoserver/ZKYGIS";
let map = null;
let geojsonLayer = null;
onMounted(() => {initMap();
});
const initMap = () => {// 创建地图对象map = L.map("map", {attributionControl: false,}).setView(L.latLng(37.550339, 104.114129), 4);//创建底图切换数据源const baseLayer = L.tileLayer("http://map.geoq.cn/ArcGIS/rest/services/ChinaOnlineStreetPurplishBlue/MapServer/tile/{z}/{y}/{x}");map.addLayer(baseLayer); //地图默认加载的底图geojsonLayer = L.Proj.geoJson(null, {style: geoJsonStyle,});map.addLayer(geojsonLayer);//L.tileLayer('https://server.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}').addTo(map);//监听图层鼠标事件geojsonLayer.on("mouseover", onMoveoverGeojsonLayer);geojsonLayer.on("mouseout", onMoveoutGeojsonLayer);//绘制工具drawmap.pm.addControls({position: "topleft",drawMarker: false,drawCircleMarker: false,drawCircle: false,drawPolyline: false,editMode: false,dragMode: false,cutPolygon: false,drawText: false});//绘制图形之前map.on("pm:drawstart", ({ workingLayer }) => {clearGeojsonLayer();});map.on("pm:create", (e) => {//console.log(e);let polygon = null;if (e.layer && e.layer._latlngs && e.layer._latlngs.length > 0) {//构造polygonpolygon = "";const data = e.layer._latlngs[0];for (var i = 0; i < data.length; i++) {const item = data[i];polygon += item.lng + "," + item.lat + " ";}polygon += data[0].lng + "," + data[0].lat;}console.log("polygon", polygon);if (polygon) {queryByPolygon(polygon, "bs_spot_t", callbackLastQueryWFSService);}});
};
/*空间查询图层*@method queryByPolygon*@param polygon 空间范围*@param typeName 图层名称*@return null*/
const queryByPolygon = async (polygon, typeName, callback) => {let filter ='<Filter xmlns="http://www.opengis.net/ogc" xmlns:gml="http://www.opengis.net/gml">';filter += "<Intersects>";filter += "<PropertyName>geom</PropertyName>";filter += "<gml:Polygon>";filter += "<gml:outerBoundaryIs>";filter += "<gml:LinearRing>";filter += "<gml:coordinates>" + polygon + "</gml:coordinates>";filter += "</gml:LinearRing>";filter += "</gml:outerBoundaryIs>";filter += "</gml:Polygon>";filter += "</Intersects>";filter += "</Filter>";const urlString = geoserverUrl + "/ows";const param = {service: "WFS",version: "1.0.0",request: "GetFeature",typeName: typeName,outputFormat: "application/json",filter: filter,};const geojsonUrl = urlString + L.Util.getParamString(param, urlString);$.ajax({url: geojsonUrl,async: true,type: "GET",dataType: "json",success(result) {callback(result);},error(err) {console.log(err);},});
};
……
</script><style scoped>
#map {width: 100vw;height: 100vh;
}
.titleContainer {position: absolute;top: 0;background: rgba(0, 0, 0, 0.45);height: 50px;width: 100vw;z-index: 999;font-size: 14px;color: #fff;font-size: 28px;
}
.center {display: flex;flex-direction: column;align-items: center;justify-content: center;
}
</style>

由于单位的geoserver地图服务数据保密性,geoserver发布的地图服务真实url不公开

下载源码:GIS之家的学习交流圈

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

tinygo window安装和使用

支持的型号https://tinygo.org/docs/reference/microcontrollers/ 下载win版本https://github.com/tinygo-org/tinygo/releases 新建环境变量D:\Program_Files\tinygo\bin 验证tinygo version 在 VSCode 中创建一个新的文件,命名为 hello.gopackage main import "fmt&q…

基于ARM微处理器的无线串口集线器的总体设计

1 引言 随着21世纪科学技术的不断进步,无线与移动通信相应得到了迅猛的发展。方便快捷的无线接入和无线 互连等新概念和新产品,已逐渐融入人们的工作领域和日常生活中。由于如今对无线频率的大量使用,使无线频率资源日渐匮乏,短距离宽带无线通信技术受到世界许多国家工业界…

Pycharm中配置基于深度学习模型Yolov5的入门车辆识别Python项目

基于Yolov5的入门车辆识别 环境部署 ANACONDA环境 Anaconda官网下载:https://www.anaconda.com/download/ 进入会显示需要注册,直接跳过即可选择对应的系统版本下载安装注意选择安装位置(建议不要安装在C盘)没什么其他特别选项,直接安装即可 安装完成后使用win+r输入cmd打…

在PyCharm中提升编程效率:通义灵码(DeepSeek)助手全攻略(新版)

最近小栈在PyCharm中使用了阿里的 通义灵码 插件还不错,本次就再分享一个好用的AI代码助手,让编码过程更加方便!作者:ISEE小栈 转载来源:「ISEE小栈」微信公众号 最近小栈在PyCharm中使用了阿里的 通义灵码 插件还不错,本次就再分享一个好用的AI代码助手,让编码过程更加…

vue+leaflet示例:矢量瓦片展示(附源码下载)

demo源码运行环境以及配置运行环境:依赖Node安装环境,demo本地Node版本:14.19.1。 运行工具:vscode或者其他工具。 配置方式:下载demo源码,vscode打开,然后顺序执行以下命令: (1)下载demo环境依赖包命令:npm i (2)启动demo命令:npm run dev (3)打包demo命令: n…

vue+leaflet示例:图层管理控件样式优化(附源码下载)

demo源码运行环境以及配置运行环境:依赖Node安装环境,demo本地Node版本:14.19.1。 运行工具:vscode或者其他工具。 配置方式:下载demo源码,vscode打开,然后顺序执行以下命令: (1)下载demo环境依赖包命令:npm i (2)启动demo命令:npm run dev (3)打包demo命令: n…

2025西安交大集训Day4:单调栈,单调队列,线段树

2025西安交大集训Day4:单调栈,单调队列,线段树 引入 何为单调栈?顾名思义,单调栈即满足单调性的栈结构。与单调队列相比,其只在一端进行进出。 为了描述方便,以下举例及伪代码以维护一个整数的单调递增栈为例。 过程 插入 将一个元素插入单调栈时,为了维护栈的单调性,需要…

日事清甘特图制作工具:一键生成,精准管理项目周期

还在为制作甘特图而焦虑吗?别担心,日事清甘特图重磅登场,轻松帮你完美化解难题,让复杂任务规划变得简单高效!在工作中,我们很多岗位都经常需要对项目进度进行追踪,例如人事经理需要要追踪招聘进度或员工培训计划, 项目经理负责监督项目的各个阶段以保证按计划执行, 软…

网站自动备份同步工具,自动备份同步工具有哪些?

网站自动备份同步工具是保障网站数据安全的关键,需兼顾实时性、可靠性、易用性。以下是分场景推荐的工具及部署方案:一、工具分类推荐80KM备份软件 功能:支持多种备份方式,如系统备份、磁盘备份、文件备份等,支持定时备份。 步骤:管理端点新增,不管选择从管理端备份到客…

智慧运维如何赋能现代医院?看某中西医结合医院的数字化转型之路

在医疗信息化浪潮中,某中西医结合医院作为一家集医疗、教学、科研于一体的三甲医院,始终走在创新前沿。面对业务系统庞杂、跨部门协作效率待提升等挑战,医院携手采和科技,以“智慧运维”为核心理念,开启了一场数字化转型的深度实践。 痛点破局:从“人找服务”到“服务找人…