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 {
            width: 100%;
            height: 100%;
            position: absolute;
            overflow: hidden;
            margin: 0 0 0 0;
        }

        .map {
            width: 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="width: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',
          width: 5
        })
      })
    });

    // 添加繪制新圖形的interaction,用於添加新的線條
    var drawInteraction = new ol.interaction.Draw({
      type: 'LineString', // 設定為線條
      style: new ol.style.Style({
        stroke: new ol.style.Stroke({
          color: 'red',
          width: 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',
              width: 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 {
            width: 100%;
            height: 100%;
            position: absolute;
            overflow: hidden;
            margin: 0 0 0 0;
        }

        .map {
            width: 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="width: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',
        width: 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',
        width: 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',
        width: 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;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM