openlayer geoserver 实现wfs 的更新

跨域问题:https://blog.csdn.net/neimeng0/article/details/80094333

关于线的wfs 更新:

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no"/>
    <title></title>
    <link rel="stylesheet" href="https://openlayers.org/en/v4.6.5/css/ol.css" type="text/css">
    <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
   <script src="ol-debug.js"></script>
    <style type="text/css">
        body {
             100%;
            height: 100%;
            position: absolute;
            overflow: hidden;
            margin: 0 0 0 0;
        }

        .map {
             100%;
            height: 92%;
        }
    </style>
</head>
<body>
<div id="map" class="map"></div>
<form class="form-inline">
    <label>Geometry type  </label>
    <select id="type">
        <option value="Point">Point</option>
        <option value="LineString">LineString</option>
        <option value="Polygon">Polygon</option>
        <option value="Circle">Circle</option>
    </select>
</form>
 <input type="button" value="查询" onclick="queryWfs();" />
  <input id="add" type="checkbox" value="add" />新增
  <input id="saveNew" type="button" value="保存" onclick="onSaveNew();" />

  <div id="map" style="100%;height:100%;"></div>

</body>
</html>
<script>
          var newId = 1;
    var wfsVectorLayer = null;
    var drawedFeature = null;

    // 创建用于新绘制feature的layer
    var drawLayer = new ol.layer.Vector({
      source: new ol.source.Vector(),
      style: new ol.style.Style({
        stroke: new ol.style.Stroke({
          color: 'blue',
           5
        })
      })
    });

    // 添加绘制新图形的interaction,用于添加新的线条
    var drawInteraction = new ol.interaction.Draw({
      type: 'LineString', // 设定为线条
      style: new ol.style.Style({
        stroke: new ol.style.Stroke({
          color: 'red',
           10
        })
      }),
      source: drawLayer.getSource()
    });
    drawInteraction.on('drawend', function(e) {
      // 绘制结束时暂存绘制的feature
      drawedFeature = e.feature;
    });

    var map = new ol.Map({
      layers: [new ol.layer.Tile({
        source: new ol.source.OSM()
      }), drawLayer],
      target: 'map',
      view: new ol.View({
        center: [126.23967989932228,48.036040730554284],
        maxZoom: 19,
        zoom: 13,
        projection: 'EPSG:4326'
      })
    });

    function queryWfs() {
      if (wfsVectorLayer) {
        map.removeLayer(wfsVectorLayer);
      }

      wfsVectorLayer = new ol.layer.Vector({
        source: new ol.source.Vector({
          format: new ol.format.GeoJSON({
            geometryName: 'the_geom'
          }),
          url: 'http://192.168.20.80:8085/geoserver/wfs?service=wfs&version=1.1.0&request=GetFeature&typeNames=KD:WH_0217&outputFormat=application/json&srsname=EPSG:4326'
        }),
        style: function(feature, resolution) {
          return new ol.style.Style({
            stroke: new ol.style.Stroke({
              color: 'blue',
               5
            })
          });
        }
      });
      map.addLayer(wfsVectorLayer);
    }

    $('#add').change(function() {
      if (this.checked) {
        // 勾选新增复选框时,添加绘制的Interaction
        map.removeInteraction(drawInteraction);
        map.addInteraction(drawInteraction);
      } else {
        // 取消勾选新增复选框时,移出绘制的Interaction,删除已经绘制的feature
        map.removeInteraction(drawInteraction);
        if (drawedFeature) {
          drawLayer.getSource().removeFeature(drawedFeature);
        }
        drawedFeature = null;
      }
    });

    // 保存新绘制的feature
    function onSaveNew() {
      // 转换坐标
      var geometry = drawedFeature.getGeometry().clone();
      geometry.applyTransform(function(flatCoordinates, flatCoordinates2, stride) {
        for (var j = 0; j < flatCoordinates.length; j += stride) {
          var y = flatCoordinates[j];
          var x = flatCoordinates[j + 1];
          flatCoordinates[j] = x;
          flatCoordinates[j + 1] = y;
        }
      });

      // 设置feature对应的属性,这些属性是根据数据源的字段来设置的
      var newFeature = new ol.Feature({
	  THE_GEOM: new ol.geom.MultiLineString([geometry.getCoordinates()]),
	  });
      newFeature.setId('WH_0217.' + newId);
     //newFeature.setGeometryName('the_geom');
    // newFeature.set('the_geom', null);
     newFeature.set('name', newFeature.getId());
     newFeature.set('modified', newFeature.getId());
     newFeature.set('OBJID', '2333');
     newFeature.set('OBJNAME', '');
     newFeature.set('DEPTCODE1', '');
     newFeature.set('DEPTNAME1', newId);
     newFeature.set('DEPTCODE2', '1');
     newFeature.set('DEPTNAME2', '2');
     newFeature.set('DEPTCODE3', null);
     newFeature.set('DEPTNAME3', '');
     newFeature.set('BGID', null);
     newFeature.set('ORDATE', null);
     newFeature.set('CHDATE', null);
	 newFeature.set('NOTE_', null);
	 newFeature.set('PICTURE', null);
	 newFeature.set('SHAPE_LENG', null);
	 newFeature.set('SHAPE_LE_1', null);
	 newFeature.set('SHAPE_LE_2', null);
	 newFeature.set('DLMC', null);
    // newFeature.setGeometry(new ol.geom.MultiLineString([geometry.getCoordinates()]));

      addWfs([newFeature]);
      // 更新id
      newId = newId + 1;
      // 3秒后,自动刷新页面上的feature
      setTimeout(function() {
        drawLayer.getSource().clear();
        queryWfs();
      }, 3000);
    }

    // 添加到服务器端
    function addWfs(features) {
      var WFSTSerializer = new ol.format.WFS();
      var featObject = WFSTSerializer.writeTransaction(features,
        null, null, {
          featureType: 'WH_0217',                    //layerName
          featureNS: 'http://geoserver.KD.netKD',   //设置kd工作空间的时候填写的连接
          srsName: 'EPSG:4326'
        });
      var serializer = new XMLSerializer();
      var featString = serializer.serializeToString(featObject);
      var request = new XMLHttpRequest();
      request.open('POST', 'http://192.168.20.80:8085/geoserver/wfs?service=wfs');
      request.setRequestHeader('Content-Type', 'text/xml');
      request.send(featString);
    }


</script>

  点更新:

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no"/>
    <title></title>
    <link rel="stylesheet" href="https://openlayers.org/en/v4.6.5/css/ol.css" type="text/css">
    <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
   <script src="ol-debug.js"></script>
    <style type="text/css">
        body {
             100%;
            height: 100%;
            position: absolute;
            overflow: hidden;
            margin: 0 0 0 0;
        }

        .map {
             100%;
            height: 92%;
        }
    </style>
</head>
<body>
<div id="map" class="map"></div>
<form class="form-inline">
    <label>Geometry type  </label>
    <select id="type">
        <option value="Point">Point</option>
        <option value="LineString">LineString</option>
        <option value="Polygon">Polygon</option>
        <option value="Circle">Circle</option>
    </select>
</form>
 <input type="button" value="查询" onclick="queryWfs();" />
  <input id="add" type="checkbox" value="add" />新增
  <input id="saveNew" type="button" value="保存" onclick="onSaveNew();" />

  <div id="map" style="100%;height:100%;"></div>

</body>
</html>
<script>
          var newId = 1;
    var wfsVectorLayer = null;
    var drawedFeature = null;

    // 创建用于新绘制feature的layer
    var drawLayer = new ol.layer.Vector({
      source: new ol.source.Vector(),
      style: new ol.style.Style({
            //填充色
        fill: new ol.style.Fill({
        color: 'red'
        }),
        //边线颜色
        stroke: new ol.style.Stroke({
        color: 'black',
         3
        }),
        //形状
       image: new ol.style.Circle({
        radius: 4,
        fill: new ol.style.Fill({
        color: 'red'
            })
            })
        })
    });

    // 添加绘制新图形的interaction,用于添加新的线条
    var drawInteraction = new ol.interaction.Draw({
      type: 'Point', // 设定为线条
      style:		new ol.style.Style({
            //填充色
        fill: new ol.style.Fill({
        color: 'red'
        }),
        //边线颜色
        stroke: new ol.style.Stroke({
        color: 'black',
         3
        }),
        //形状
       image: new ol.style.Circle({
        radius: 4,
        fill: new ol.style.Fill({
        color: 'red'
            })
            })
        }),
      source: drawLayer.getSource()
    });
    drawInteraction.on('drawend', function(e) {
      // 绘制结束时暂存绘制的feature
      drawedFeature = e.feature;
    });

    var map = new ol.Map({
      layers: [new ol.layer.Tile({
        source: new ol.source.OSM()
      }), drawLayer],
      target: 'map',
      view: new ol.View({
        center: [126.23967989932228,48.036040730554284],
        maxZoom: 19,
        zoom: 13,
        projection: 'EPSG:4326'
      })
    });

    function queryWfs() {
      if (wfsVectorLayer) {
        map.removeLayer(wfsVectorLayer);
      }

      wfsVectorLayer = new ol.layer.Vector({
        source: new ol.source.Vector({
          format: new ol.format.GeoJSON({
            geometryName: 'THE_GEOM'
          }),
          url: 'http://192.168.20.80:8085/geoserver/wfs?service=wfs&version=1.1.0&request=GetFeature&typeNames=KD:WH_0101&outputFormat=application/json&srsname=EPSG:4326'
        }),
        style: function(feature, resolution) {
          return new ol.style.Style({
            //填充色
        fill: new ol.style.Fill({
        color: 'red'
        }),
        //边线颜色
        stroke: new ol.style.Stroke({
        color: 'black',
         3
        }),
        //形状
       image: new ol.style.Circle({
        radius: 4,
        fill: new ol.style.Fill({
        color: 'red'
            })
            })
        });
        }
      });
      map.addLayer(wfsVectorLayer);
    }

    $('#add').change(function() {
      if (this.checked) {
        // 勾选新增复选框时,添加绘制的Interaction
        map.removeInteraction(drawInteraction);
        map.addInteraction(drawInteraction);
      } else {
        // 取消勾选新增复选框时,移出绘制的Interaction,删除已经绘制的feature
        map.removeInteraction(drawInteraction);
        if (drawedFeature) {
          drawLayer.getSource().removeFeature(drawedFeature);
        }
        drawedFeature = null;
      }
    });

    // 保存新绘制的feature
    function onSaveNew() {
      // 转换坐标
      var geometry = drawedFeature.getGeometry().clone();
      geometry.applyTransform(function(flatCoordinates, flatCoordinates2, stride) {
        for (var j = 0; j < flatCoordinates.length; j += stride) {
          var y = flatCoordinates[j];
          var x = flatCoordinates[j + 1];
          flatCoordinates[j] = x;
          flatCoordinates[j + 1] = y;
        }
      });

      // 设置feature对应的属性,这些属性是根据数据源的字段来设置的
      var newFeature = new ol.Feature({
	  THE_GEOM: new ol.geom.Point(geometry.getCoordinates()),
	  });
      newFeature.setId('WH_0101.' + newId);
     //newFeature.setGeometryName('the_geom');
    // newFeature.set('the_geom', null);
     //newFeature.set('name', newFeature.getId());
     //newFeature.set('modified', newFeature.getId());
     //newFeature.set('OBJID', '2333');
     //newFeature.set('OBJNAME', '');
     //newFeature.set('DEPTCODE1', '');
     //newFeature.set('DEPTNAME1', newId);
     //newFeature.set('DEPTCODE2', '1');
     //newFeature.set('DEPTNAME2', '2');
     //newFeature.set('DEPTCODE3', null);
     //newFeature.set('DEPTNAME3', '');
     //newFeature.set('BGID', null);
     //newFeature.set('ORDATE', null);
     //newFeature.set('CHDATE', null);
	 //newFeature.set('NOTE_', null);
	 //newFeature.set('PICTURE', null);
	 //newFeature.set('SHAPE_LENG', null);
	 //newFeature.set('SHAPE_LE_1', null);
	 //newFeature.set('SHAPE_LE_2', null);
	 //newFeature.set('DLMC', null);
    // newFeature.setGeometry(new ol.geom.MultiLineString([geometry.getCoordinates()]));

      addWfs([newFeature]);
      // 更新id
      newId = newId + 1;
      // 3秒后,自动刷新页面上的feature
      setTimeout(function() {
        drawLayer.getSource().clear();
        queryWfs();
      }, 3000);
    }

    // 添加到服务器端
    function addWfs(features) {
      var WFSTSerializer = new ol.format.WFS();
      var featObject = WFSTSerializer.writeTransaction(features,
        null, null, {
          featureType: 'WH_0101',
          featureNS: 'http://geoserver.KD.netKD',
          srsName: 'EPSG:4326'
        });
      var serializer = new XMLSerializer();
      var featString = serializer.serializeToString(featObject);
      var request = new XMLHttpRequest();
      request.open('POST', 'http://192.168.20.80:8085/geoserver/wfs?service=wfs');
      request.setRequestHeader('Content-Type', 'text/xml');
      request.send(featString);
    }


</script>

  重点:需要注意的是我初始化feature几何字段使用了the_geom,这里一定要和geoserver中的集合字段对应,不然可以添加成功,但是没有geometry;

原文地址:https://www.cnblogs.com/HuangDaDa/p/10384003.html