cesium结合geoserver利用WFS服务实现图层编辑(附源码下载)
前言
cesium 官网的api文档介绍地址cesium官网api,里面详细的介绍 cesium 各个类的介绍,还有就是在线例子:cesium 官网在线例子,这个也是学习 cesium 的好素材。
内容概览
1.cesium结合geoserver利用WFS服务实现图层编辑功能
2.源代码demo下载
效果图如下:
本篇主要是在上一篇cesium结合geoserver利用WFS服务实现图层新增(附源码下载)基础上实现的,cesium通过调用geoserver发布的地图服务WFS来达到图层编辑记录的目的。与GeoServer的WFS进行基于Rest交互关键就在于请求参数,值得注意的是这些请求最好采用POST方法发送。查询可以采用json,但增加,删除,修改都只能采用XML形式Transaction
- 部分核心代码,完整的见源码demo下载
- //绘制geojson图层样式
- var geoJsonStyle = {
- stroke: Cesium.Color.YELLOW,
- strokeWidth: 3,
- fill: Cesium.Color.YELLOW.withAlpha(0.1)
- };
- var geoserverUrl = 'http://localhost:8080/geoserver/WebGIS';
- var image_Source = new Cesium.UrlTemplateImageryProvider({
- //url: 'http://mt0.google.cn/vt/lyrs=t,r&hl=zh-CN&gl=cn&x={x}&y={y}&z={z}',
- //url: 'https://server.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}',
- url: "http://map.geoq.cn/ArcGIS/rest/services/ChinaOnlineStreetPurplishBlue/MapServer/tile/{z}/{y}/{x}",
- //tilingScheme : new Cesium.GeographicTilingScheme(),
- credit: ''
- });
- var viewer = new Cesium.Viewer('map', {
- geocoder: false,
- homeButton: false,
- sceneModePicker: false,
- fullscreenButton: false,
- vrButton: false,
- baseLayerPicker: false,
- infoBox: false,
- selectionIndicator: false,
- animation: false,
- timeline: false,
- shouldAnimate: true,
- navigationHelpButton: false,
- navigationInstructionsInitiallyVisible: false,
- imageryProvider: image_Source
- });
- //加载geoserver wms服务
- var wms = new Cesium.WebMapServiceImageryProvider({
- url: geoserverUrl+'/wms',
- layers: 'WebGIS:testLayer',
- parameters: {
- service : 'WMS',
- format: 'image/png',
- transparent: true,
- }
- });
- viewer.imageryLayers.addImageryProvider(wms);
- viewer._cesiumWidget._creditContainer.style.display = "none";
- viewer.scene.globe.enableLighting = false;
- //viewer.scene.globe.depthTestAgainstTerrain = true;
- viewer.scene.globe.showGroundAtmosphere = false;
- viewer.camera.flyTo({
- destination : Cesium.Cartesian3.fromDegrees(113.90271877, 22.95186415,30000.0)
- });
- var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
- var ellipsoid = viewer.scene.globe.ellipsoid;
- handler.setInputAction(function (movement) {
- //通过指定的椭球或者地图对应的坐标系,将鼠标的二维坐标转换为对应椭球体三维坐标
- cartesian = viewer.camera.pickEllipsoid(movement.position, ellipsoid);
- if (cartesian) {
- //将笛卡尔坐标转换为地理坐标
- var cartographic = ellipsoid.cartesianToCartographic(cartesian);
- //将弧度转为度的十进制度表示
- var longitudeString = Cesium.Math.toDegrees(cartographic.longitude);
- var latitudeString = Cesium.Math.toDegrees(cartographic.latitude);
- var point = longitudeString + ',' + latitudeString;
- queryByPoint(point,'testLayer',callbackLastQueryWFSService);
- }
- }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
- /*点查图层
- *@method queryByPoint
- *@param point 点查
- *@param typeName 图层名称
- *@return null
- */
- function queryByPoint(point, typeName, callback){
- var filter =
- '<Filter xmlns="http://www.opengis.net/ogc" xmlns:gml="http://www.opengis.net/gml">';
- filter += '<Intersects>';
- filter += '<PropertyName>the_geom</PropertyName>';
- filter += '<gml:Point>';
- filter += '<gml:coordinates>' + point + '</gml:coordinates>';
- filter += '</gml:Point>';
- filter += '</Intersects>';
- filter += '</Filter>';
- var urlString = geoserverUrl + '/ows';
- var param = {
- service: 'WFS',
- version: '1.0.0',
- request: 'GetFeature',
- typeName: typeName,
- outputFormat: 'application/json',
- filter: filter
- };
- var geojsonUrl = urlString + getParamString(param, urlString);
- $.ajax({
- url: geojsonUrl,
- async: true,
- type:'GET',
- dataType: 'json',
- success(result) {
- callback(result);
- },
- error(err) {
- console.log(err);
- }
- })
- }
- function getParamString(obj, existingUrl, uppercase){
- var params = [];
- for (var i in obj) {
- params.push(encodeURIComponent(uppercase ? i.toUpperCase() : i) + '=' + encodeURIComponent(obj[i]));
- }
- return ((!existingUrl || existingUrl.indexOf('?') === -1) ? '?' : '&') + params.join('&');
- }
- /*
- * 点查图层回调函数
- */
- function callbackLastQueryWFSService(data){
- console.log('data',data);
- if(data && data.features.length>0){
- clearGeojsonLayer();
- loadGeojsonLayer(data);
- //气泡窗口显示
- var properties = data.features[0].properties;
- var id = data.features[0].id;
- var geometry = data.features[0].geometry;
- //var content = '名称:'+properties.estate_num+'</br>备注:'+properties.holder_nam;
- var content = '<span>名称:</span><input type="text" id="estate_num" value = "'+properties.estate_num+'" /></br><span>备注:</span><input type="text" id="holder_nam" value = "'+properties.holder_nam+'" /></br><button type="button" id="editBtn">编辑</button>';
- $("#infowindow").show();
- $("#infowindow").empty();
- $("#infowindow").append(content);
- $("#editBtn").click(function(){
- //console.log('编辑按钮点击事件');
- if(id)
- {
- //构造polygon
- var polygon = '';
- var data = geometry.coordinates[0][0];
- for(var i=0;i<data.length;i++){
- var item = data[i];
- polygon += item[0] + ',' + item[1] + ' ' ;
- }
- polygon += data[0][0] + ',' + data[0][1];
- //只编辑属性信息,默认图形信息不变,感兴趣的,读者你们可自行编辑图形变化信息,这里预留图形参数传值了的
- editLayers(id,polygon,$("#estate_num").val(),$("#holder_nam").val(),callbackEditLayersWFSService);
- }
- });
- }
- else{
- //clearMap();
- $("#infowindow").hide();
- }
- }
- /*
- * 绘制图形函数
- */
- function loadGeojsonLayer(geojson){
- var promise = Cesium.GeoJsonDataSource.load(geojson,geoJsonStyle);
- promise.then(function(dataSource) {
- viewer.dataSources.add(dataSource);
- //viewer.zoomTo(dataSource);
- }).otherwise(function(error){
- window.alert(error);
- });
- }
- /*
- * 清空绘制图形函数
- */
- function clearGeojsonLayer(){
- viewer.dataSources.removeAll();
- }
- function clearMap(){
- if (drawTool) {
- drawTool.destroy();
- }
- clearGeojsonLayer();
- }
- /*图层编辑
- *@method editLayers
- *@param polygon 图形
- *@param fid 记录fid值
- *@param fieldValue1 字段1值
- *@param fieldValue2 字段2值
- *@return callback
- */
- function editLayers(fid,polygon,fieldValue1,fieldValue2, callback){
- var 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:Update typeName="WebGIS:testLayer">';
- xml += '<wfs:Property>';
- xml += '<wfs:Name>the_geom</wfs:Name>';
- ……
……- }
几点说明:
1.WebGIS,geoserver工作区;
2.testLayer,操作图层名称;
3.fid,操作图层的默认固有属性字段。
4.estate_num,holder_nam,操作图层属性字段。
图层编辑回调函数,操作成功或者失败,可以在网页的控制台网络看请求结果
完整demo源码见小专栏文章尾部:小专栏
文章尾部提供源代码下载,对本专栏感兴趣的话,可以关注一波
cesium结合geoserver利用WFS服务实现图层编辑(附源码下载)的更多相关文章
- cesium结合geoserver利用WFS服务实现图层删除(附源码下载)
前言 cesium 官网的api文档介绍地址cesium官网api,里面详细的介绍 cesium 各个类的介绍,还有就是在线例子:cesium 官网在线例子,这个也是学习 cesium 的好素材. 内 ...
- cesium结合geoserver利用WFS服务实现图层新增(附源码下载)
前言 cesium 官网的api文档介绍地址cesium官网api,里面详细的介绍 cesium 各个类的介绍,还有就是在线例子:cesium 官网在线例子,这个也是学习 cesium 的好素材. 内 ...
- leaflet结合geoserver利用WFS服务实现图层删除功能(附源码下载)
前言 leaflet 入门开发系列环境知识点了解: leaflet api文档介绍,详细介绍 leaflet 每个类的函数以及属性等等 leaflet 在线例子 leaflet 插件,leaflet ...
- openlayers6结合geoserver利用WFS服务实现图层新增功能(附源码下载)
内容概览 1.openlayers6结合geoserver利用WFS服务实现图层新增功能2.源代码demo下载 效果图如下: 本篇主要是openlayers6通过调用geoserver发布的地图服务W ...
- leaflet结合geoserver利用WFS服务实现图层新增功能(附源码下载)
前言 leaflet 入门开发系列环境知识点了解: leaflet api文档介绍,详细介绍 leaflet 每个类的函数以及属性等等 leaflet 在线例子 leaflet 插件,leaflet ...
- Cesium专栏-地形开挖2-任意多边形开挖(附源码下载)
“任意多边形地形开挖” 是“地形开挖”的补充篇,在这节里,我们介绍关于如何使用任意多边形对地形进行开挖,同时,由于有不少小伙伴也咨询了关于“地形开挖”篇后序内容中的填充地形的效果,之前没放出来,是想让 ...
- Cesium专栏-空间分析之坡向分析(附源码下载)
Cesium Cesium 是一款面向三维地球和地图的,世界级的JavaScript开源产品.它提供了基于JavaScript语言的开发包,方便用户快速搭建一款零插件的虚拟地球Web应用,并在性能,精 ...
- cesium 入门开发系列矢量瓦片加载展示(附源码下载)
前言 cesium 入门开发系列环境知识点了解:cesium api文档介绍,详细介绍 cesium 每个类的函数以及属性等等cesium 在线例子 内容概览 cesium 实现矢量瓦片加载效果 源代 ...
- Cesium专栏-裁剪效果(基于3dtiles模型,附源码下载)
Cesium Cesium 是一款面向三维地球和地图的,世界级的JavaScript开源产品.它提供了基于JavaScript语言的开发包,方便用户快速搭建一款零插件的虚拟地球Web应用,并在性能,精 ...
随机推荐
- java 数据类型:<泛型>在方法中和在构造器中的应用
背景: Java不允许我们把对象放在一个未知的集合中. import java.util.ArrayList; import java.util.List; /** * @ClassName Meth ...
- Paramiko模块学习
#!/usr/bin/env python # Author:Zhangmingda import paramiko '''创建ssh对象''' ssh = paramiko.SSHClient() ...
- 使用docker-compose一起安装kafka(zookeeper)
要先安装docker-compose Linux安装docker-compose 参考:https://www.cnblogs.com/pxblog/p/15049362.html 创建docker- ...
- Mybatis一对一、一对多级联查询使用
在A对象的xml配置文件中 一对一<association property="shop" column="shop_id" select="c ...
- js(JQuery)引入select2
官方项目地址:https://select2.org/ 引入css和js <link href="https://cdnjs.cloudflare.com/ajax/libs/sele ...
- Caused by: redis.clients.jedis.exceptions.JedisDataException: READONLY You can't write against a read only slave.
Caused by: redis.clients.jedis.exceptions.JedisDataException: READONLY You can't write against a rea ...
- RabbitMQ学习笔记三:Java实现RabbitMQ之与Spring集成
搭建好maven项目环境,加入RabbitMQ依赖包 <dependency> <groupId>org.springframework.amqp</groupId> ...
- Normalization Methods
目录 概 主要内容 Batch Normalization Layer Normalization Instance Normalization Group Normalization Ioffe S ...
- Hadoop开启Kerberos安全模式
Hadoop开启Kerberos安全模式, 基于已经安装好的Hadoop的2.7.1环境, 在此基础上开启Kerberos安全模式. 1.安装规划 已经安装好Hadoop的环境 10.43.159.7 ...
- 集合不安全之 ArrayList及其三种解决方案【CopyOnWriteArrayList 、synchronizedList、Vector 】
@ 目录 一.前言 二.为什么线程不安全 三.解决方案一CopyOnWriteArrayList (推荐,读多写少场景) 四.Collections.synchronizedList(加锁) 五.Ve ...