开源GIS(十三)——openlayers通过geoserver中WFS添加要素

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xcymorningsun/article/details/84653179

目录

一、引言

二、WFS添加要素实现

三、WFS添加要素原理

1、请求xml

2、postman使用

3、要素添加

4、返回xml

四、总结


 

一、引言

 

        ArcGIS server的要素增删改查实在是太重了,现在正好使用开源的openlayers和geoserver,就研究了一下使用wfs对要素进行增删改查。WFS是web feature service的简称,主要有GetCapabilities(获取服务功能),它下面能看到很多服务

        看似比较多,而我们主要用到的就是其中的操作

        这些操作比较多,我们最常用的就是getfeature,这次增删改查要用到的就是transaction操作。

 

 

二、WFS添加要素实现

        下面的代码是在前端使用interaction中的draw对象画出polygon后,在监听事件中将polygon添加到服务器中。

        draw.once("drawend",function (e) {
            draw.setActive(false);
            //map.removeInteraction(draw);
            var feature=e.feature;
            /*        var wktformat= new ol.format.WKT();
             alert(wktformat.writeGeometry(feature.getGeometry()));*/
            var newFeature = new ol.Feature({
                the_geom: new ol.geom.MultiPolygon([feature.getGeometry().getCoordinates()]),
                Layer:"Layer",
                SubClasses:"SubClasses",
                ExtendedEn:"ExtendedEn",
                Linetype:"Linetype",
                EntityHand:"EntityHand",
                Text:"Text"
            });
            //newFeature.setGeometryName("geometry");
            var WFSTSerializer = new ol.format.WFS();
            var featObject = WFSTSerializer.writeTransaction([newFeature],
                null, null, {
                    featureNS: 'http://geoserver.org/nyc',
                    featurePrefix: "xcy",//工作空间名称
                    featureType: "polygon",//图层名称
                    //srsName: 'EPSG:4326'
                });
            var serializer = new XMLSerializer();
            var featString = serializer.serializeToString(featObject);
            $.ajax({
                url: "http://localhost:8080/geoserver/wfs",
                type:"POST",
                data: featString,
                contentType: 'text/xml',
                success: function (req) {
                    console.log(req);
                    //window.location.reload();
                }
            });

        });

        这里最重要的就是新feature的创建与初始化,之所以使用multipolygon是因为geoserver将shp文件解析为multipolygon,如果shp在geoserver解析为polygon那这里就应该new polygon;

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

        再往下就是openlayers封装的WFS创建transaction,解析为xml通过http请求添加要素,比较简单了。

 

 

三、WFS添加要素原理

        通过上面的过程,我们可以清楚的看到其实WFS添加要素实质就是一种http请求,只不过发送的数据为xml,下面我是用postman模拟一下wfs添加要素的请求。

1、请求xml

<?xml version="1.0" encoding="utf-8"?>

<Transaction xmlns="http://www.opengis.net/wfs" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" service="WFS" version="1.1.0" xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd">
  <Insert>
    <polygon xmlns="http://geoserver.org/nyc">
      <the_geom>
        <MultiPolygon xmlns="http://www.opengis.net/gml">
          <polygonMember>
            <Polygon>
              <exterior>
                <LinearRing>
                  <posList srsDimension="2">508657.6692772488 299894.7088340543 508682.1530128714 299878.5853984004 508667.8210700679 299851.71300564386 508636.17136304354 299854.1016627778 508633.1855416262 299877.98823411687 508657.6692772488 299894.7088340543</posList>
                </LinearRing>
              </exterior>
            </Polygon>
          </polygonMember>
        </MultiPolygon>
      </the_geom>
      <Layer>Layer</Layer>
      <SubClasses>SubClasses</SubClasses>
      <ExtendedEn>ExtendedEn</ExtendedEn>
      <Linetype>Linetype</Linetype>
      <EntityHand>EntityHand</EntityHand>
      <Text>Text</Text>
    </polygon>
  </Insert>
</Transaction>

2、postman使用

3、要素添加

 

4、返回xml

<?xml version="1.0" encoding="UTF-8"?>
<wfs:TransactionResponse xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:wfs="http://www.opengis.net/wfs" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns:ows="http://www.opengis.net/ows" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.1.0" xsi:schemaLocation="http://www.opengis.net/wfs http://localhost:8080/geoserver/schemas/wfs/1.1.0/wfs.xsd">
    <wfs:TransactionSummary>
        <wfs:totalInserted>1</wfs:totalInserted>
        <wfs:totalUpdated>0</wfs:totalUpdated>
        <wfs:totalDeleted>0</wfs:totalDeleted>
    </wfs:TransactionSummary>
    <wfs:TransactionResults/>
    <wfs:InsertResults>
        <wfs:Feature>
            <ogc:FeatureId fid="new0"/>
        </wfs:Feature>
    </wfs:InsertResults>
</wfs:TransactionResponse>

 

 

四、总结

 

  • WFS要素添加所处位置;

 

  • WFS要素添加实现;

 

  • WFS要素添加原理;

——————————————————————————————————————————————————————

补充,好多提到read-only问题,这个主要是因为geoserver中wfs服务的设置问题,解决方法

设置geoserver设置级别为complete

设置data中添加anonymous角色

 

阅读更多

扫码向博主提问

gis_morningsun

有所付出,有所收获
  • 擅长领域:
  • WebGIS
  • openlayers
  • geoserver
  • arcgisjs
  • javaweb
去开通我的Chat快问

没有更多推荐了,返回首页