vue+leaflet示例:结合geoserver利用WFS服务实现图层新增功能(附源码下载)

news/2025/3/25 20:40:57/文章来源:https://www.cnblogs.com/giserhome/p/18792287

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来达到图层新增记录的目的。与GeoServer的WFS进行基于Rest交互关键就在于请求参数,值得注意的是这些请求最好采用POST方法发送。查询可以采用json,但增加,删除,修改都只能采用XML形式Transaction。最后利用leaflet来叠加显示在地图上展示。

  • 用leaflet插件绘制图形工具draw的新增图形以及回调函数获取绘制图形空间信息,绘制工具的github地址:
    https://github.com/geoman-io/leaflet-geoman

  • geoserver默认WFS服务是没有编辑操作权限的,所以需要在geoserver设置权限,允许编辑操作才行,截图如下:



  • 核心源码

<template><div id="map"></div><div class="titleContainer center"><span>vue+leaflet示例:结合geoserver利用WFS服务实现图层新增功能</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();
const geoserverUrl = "http://localhost:8080/geoserver/WebGIS";
let map = null;
let geojsonLayer = null;
let wmsLayer = null;
let latlng = null;
let isDraw = false;
onMounted(() => {initMap();
});
const initMap = () => {// 创建地图对象map = L.map("map", {attributionControl: false,}).setView(L.latLng(22.95186415, 113.90271877), 14);//创建底图切换数据源const baseLayer = L.tileLayer("http://map.geoq.cn/ArcGIS/rest/services/ChinaOnlineStreetPurplishBlue/MapServer/tile/{z}/{y}/{x}");map.addLayer(baseLayer); //地图默认加载的底图// 创建geoserver发布的wms图层wmsLayer = L.tileLayer.wms(geoserverUrl + "/wms", {layers: "WebGIS:testLayer",transparent: true,maxZoom: 20,format: "image/png",}).addTo(map);// 监听地图点击事件map.on("click", onClickMap);//绘制工具drawconst customTranslation = {tooltips: {finishLine: "单击任何存在的标记或者双击以完成",finishPoly: "单击第一个标记或者双击完成以完成",},};map.pm.setLang("customName", customTranslation, "zh");map.pm.addControls({position: "topleft",drawMarker: false,drawCircleMarker: false,drawCircle: false,drawPolyline: false,drawRectangle: false,editMode: false,dragMode: false,cutPolygon: false,drawText: false,});map.on("pm:drawstart", ({ workingLayer }) => {isDraw = true;if (geojsonLayer) {map.removeLayer(geojsonLayer);geojsonLayer = null;}});map.on("pm:create", (e) => {//console.log(e);isDraw = false;geojsonLayer = e.layer;geojsonLayer.addTo(map);e.layer.unbindPopup();const elements ='<span>名称:</span><input type="text" id="estate_num" /></br><span>备注:</span><input type="text" id="holder_nam" /></br><button type="button" id="addBtn">新增</button>';e.layer.on("popupopen", function (e) {$("#addBtn").click(function () {if (geojsonLayer) {//构造polygonlet polygon = "";const data = geojsonLayer.toGeoJSON().geometry.coordinates[0];for (let i = 0; i < data.length; i++) {const item = data[i];polygon += item[0] + "," + item[1] + " ";}polygon += data[0][0] + "," + data[0][1];addLayers(polygon,$("#estate_num").val(),$("#holder_nam").val(),callbackAddLayersWFSService);}});});// 获取绘制多边形中心点// console.log(turf.centroid(geojsonLayer.toGeoJSON()));const geo = turf.centroid(geojsonLayer.toGeoJSON());const latlng = [geo.geometry.coordinates[1],geo.geometry.coordinates[0]];e.layer.bindPopup(elements).openPopup(latlng);// e.layer.unbindPopup();});
};
/** 地图点击事件*/
const onClickMap = async (e) => {if (isDraw) return;//console.log('地图点击事件',e);latlng = e.latlng;const point = e.latlng.lng + "," + e.latlng.lat;queryByPoint(point, "testLayer", callbackLastQueryWFSService);
};
/*图层新增*@method addLayers*@param polygon 图形*@param fieldValue1 字段1值*@param fieldValue2 字段2值*@return callback*/
const addLayers = async (polygon, fieldValue1, fieldValue2, callback) => {let xml ='<wfs:Transaction service="WFS" version="1.0.0"    xmlns:opengis="http://webgis.com"    xmlns:wfs="http://www.opengis.net/wfs"    xmlns:ogc="http://www.opengis.net/ogc"   xmlns:gml="http://www.opengis.net/gml"   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://www.opengis.net/wfs   http://schemas.opengis.net/wfs/1.0.0/WFS-basic.xsd">';xml += '<wfs:Insert handle="WebGIS">';xml += "<opengis:testLayer>";xml += "<opengis:the_geom>";xml += '<gml:MultiPolygon srsName="EPSG:4326">';xml += "<gml:polygonMember>";xml += "<gml:Polygon>";xml += "<gml:outerBoundaryIs>";xml += "<gml:LinearRing>";xml +='<gml:coordinates decimal="." cs="," ts=" ">' +polygon +"</gml:coordinates>";xml += "</gml:LinearRing>";xml += "</gml:outerBoundaryIs>";xml += "</gml:Polygon>";xml += "</gml:polygonMember>";xml += "</gml:MultiPolygon>";xml += "</opengis:the_geom>";xml += "<opengis:estate_num>" + fieldValue1 + "</opengis:estate_num>";xml += "<opengis:holder_nam>" + fieldValue2 + "</opengis:holder_nam>";xml += "</opengis:testLayer>";xml += "</wfs:Insert>";xml += "</wfs:Transaction>";
……
};
……
</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>

几点说明:
1.xmlns:opengis="http://webgis.com",geoserver工作区的url;

2.WebGIS,geoserver工作区;
3.testLayer,操作图层名称;
4.the_geom,操作图层的几何字段;
5.estate_num,holder_nam,分别是操作图层的属性字段。

  • 图层新增回调函数,操作成功或者失败,可以在网页的控制台网络看请求结果

由于单位的geoserver地图服务数据保密性,矢量图层数据不公开

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

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

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

相关文章

vue+leaflet示例:结合geoserver利用WFS服务实现图层编辑功能(附源码下载)

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

IDEA使用Docker插件打包+推送+部署

前提条件:在服务器或者虚拟机中已经安装好了Docker1、确认是否安装插件2、配置SSH链接信息3、构建一个简单的SpringBootDemo工程4、编写一点测试代码 @RestController public class HelloController {@GetMapping("/hello")public String hello(){return "<…

蓝桥真题

有奖问答 这种选择导致分支可以使用递归 我个人觉得洛谷的答案错了,如果按能得到洛谷答案的代码,改成求30题对30道,最多对30道的话,得到的是0,应该把限制条件改为能计算答对10道题的方案,因为最多十道题不是不能达到10道题DFS #include <bits/stdc++.h> using name…

day:29 python接口测试——断言、封装、关联接口

一.request断言 1、if断言 代码: if wb["msg"]=="登录成功!":print("ok") else:print("no")案例:import requests s=requests.Session() url1="http://49.233.201.254:8080/cms/manage/loginJump.do" data1={userAccou…

基于光度立体的复杂结构件表面缺陷检测数据集

为解决非平面零部件缺陷检测时,高低起伏的形貌所形成的阴影或表面反光导致的误报和漏检问题,作者提出了一种基于深度学习和光度立体的新型缺陷检测技术。摘要 为解决非平面零部件缺陷检测时,高低起伏的形貌所形成的阴影或表面反光导致的误报和漏检问题,作者提出了一种基于深…

02_Redis之数据类型及操作

本文介绍redis常用数据类型和相关操作。02_Redis之数据类型及操作一、String类型及操作 是二进制安全的,可以存放任意类型的数据。 # 设置与获取值 set k1 value1 get k1# 设置key对应的值为string 类型的value。如果key已存在,返回0,nx 是 not exist 的意思 setnx k1 value…

解析四款功能强大的GIS工具箱软件

随着GIS技术的不断发展,各类专业的GIS工具箱软件不断涌现,帮助专业人士在空间数据分析、地图可视化、三维建模等方面提供强有力的支持。本文将介绍四款GIS工具箱软件,这几款软件专注于GIS切片和GIS数据处理,适用于多个领域的地理信息数据处理,能够帮助用户高效处理和可视化…

什么是「Agentic 工作流程」?丨社区来稿

摘要分享者:Richard 林旅强(RTE 开发者社区联合主理人)什么是「Agentic 工作流程」?它是一种让 AI 智能代理(Agent)更主动、更灵活、更像人的方式来处理复杂任务的系统。刚才读到了一篇言简意赅的文章(链接在文末),我想就基于以下每一张文中的图示,来说说什么是 Agen…

2025中国生命科学与医疗行业调研报告160+份汇总解读|附PDF下载

原文链接:https://tecdat.cn/?p=41106 中国生命科学与医疗行业正经历深刻变革:政策监管趋严、技术创新加速、全球化竞争加剧,企业需在不确定性中寻找增长锚点。本报告通过数据驱动的分析框架,深度解析行业现状、挑战及未来机遇,为从业者提供战略参考。 本报告汇总解读基于…

可结合的元素对

转换条件:lowbit(a[i]+a[j])==a[i]+a[j] 转换为 a[i]+a[j]=2^k, 第一个for按顺序枚举a[i],然后第二个for枚举k的所有情况,两层循环中找a[j](即a[i]-2^k)的个数即可 代码展示: #include<bits/stdc++.h> #define int long long using namespace std;int a[100010]; un…

专题|Python贝叶斯金融数据应用实例合集:随机波动率SV模型、逻辑回归、参数更新、绩效比较BEST分析亚马逊股票、标准普尔500指数|附数据代码

原文链接:https://tecdat.cn/?p=41020 原文出处:拓端数据部落公众号 本专题合集系统梳理了贝叶斯方法在金融数据分析与分类建模中的前沿应用。合集聚焦于PyMC3概率编程框架,深度探讨了共轭先验参数更新、贝叶斯逻辑回归、贝叶斯夏普比率等核心算法在实际场景中的落地实践。…