首页 文章

Openlayers-3 WFS-T(通过geoserver发布postgis功能)

提问于
浏览
4

我有一个问题,通过geoservers wfs将ol3中的功能发布到postgis数据库中 . 当我运行此代码时,我只设法插入gid(pk)和bin列,但the_geom(Geometry)列为空 .

function addInteraction() {
   draw = new ol.interaction.Draw({
     features: featureOverlay.getFeatures(),
     type: /** @type {ol.geom.GeometryType} */ (typeSelect.value)

   });
   draw.on('drawend', function(evt) {
        var feature = evt.feature;
        feature.set('bin', 0);
        var fid = feature.getId();
        var node = format.writeTransaction([feature], null, null, {
            gmlOptions: {srsName: "EPSG:3857"},
            featureNS: "fiware",
            featureType: "nyc_buildings"        
        });
        $.ajax({
            type: "POST",
            url: "http://192.168.4.33:9090/geoserver/wfs",
            data: new XMLSerializer().serializeToString(node),

            contentType: 'text/xml',
            success: function(data) {
                var result = format.readTransactionResponse(data);
                feature.setId(result.insertIds[0]);

            },
            error: function(e) {
                var errorMsg = e? (e.status + ' ' + e.statusText) : "";
                bootbox.alert('Error saving this feature to GeoServer.<br><br>'
                    + errorMsg);
            },
            context: this
        });

   });
   map.addInteraction(draw);
}

我得到的Xml是:

<Transaction xmlns="http://www.opengis.net/wfs" service="WFS"  version="1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/wfs                         http://schemas.opengis.net/wfs/1.1.0/WFS-transaction.xsd                        http://192.168.4.33:9090/geoserver/grp/wfs/DescribeFeatureType?typename=fiware:nyc_buildings">
  <Insert>
     <nyc_buildings>
       <geometry>
         <Polygon xmlns="http://www.opengis.net/gml" srsName="EPSG:3857">
           <exterior>
             <LinearRing srsName="EPSG:3857">
               <posList>-12682023.77343518 4567060.841291264 -11077457.675672762 2571137.15870874 -9629434.611838378 5819405.112715591 -12682023.77343518 4567060.841291264
               </posList> 
             </LinearRing>
            </exterior>
          </Polygon>
       </geometry>
       <bin>0</bin>
    </nyc_buildings>
 </Insert>
</Transaction>

我知道它工作的xml是:

<wfs:Transaction
service="WFS"
version="1.1.0"
xmlns:fiware="fiware"
xmlns:wfs="http://www.opengis.net/wfs"
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.1.0/WFS-transaction.xsd
http://192.168.4.33:9090/geoserver/grp/wfs    /DescribeFeatureType?typename=fiware:nyc_buildings">
<wfs:Insert>
    <fiware:nyc_buildings>
        <fiware:bin>0</fiware:bin>
        <fiware:the_geom>
            <gml:MultiSurface srsDimension="2" srsName="http://www.opengis.net/gml/srs/epsg.xml#2908">
                <gml:surfaceMember>
                    <gml:Polygon srsDimension="2">
                        <gml:exterior>
                            <gml:LinearRing srsDimension="2">
                                <gml:posList>988431.501 208900.429 988414.001 208910.222 988393.197 208921.866 988439.703 209005.415 988460.579 208993.729 988481.799 208981.856 988462.619 208948.07 988456.73 208951.37 988442.511 208925.97 988448.961 208922.361 988439.27 208904.93 988435.53 208898.25 988431.501 208900.429</gml:posList>
                            </gml:LinearRing>
                        </gml:exterior>
                    </gml:Polygon>
                </gml:surfaceMember>
            </gml:MultiSurface>
        </fiware:the_geom>
    </fiware:nyc_buildings>
</wfs:Insert>

任何的想法?

2 回答

  • 3

    这里有关于wfs-t的更完整的代码:

    var format = new ol.format.WFS({featureNS:"fiware",featureType:'fw_core',schemaLocation:"http://www.opengis.net/wfs \
                        http://schemas.opengis.net/wfs/1.1.0/WFS-transaction.xsd \
                        http://192.168.4.33:9090/geoserver/grp/wfs/DescribeFeatureType?typename=fiware:fw_core"});
    function addInteraction() {
               draw = new ol.interaction.Draw({
                 features: featureOverlay.getFeatures(),
                 type: /** @type {ol.geom.GeometryType} */ (typeSelect.value)
    
               });
               draw.on('drawend', function(evt) {
                    // create a unique id
                    // it is later needed to delete features
                    // give the feature this id
                    var feature = evt.feature;
                   feature.set('geometry', feature.getGeometry()); 
                   var node = format.writeTransaction([feature], null, null, {
                        gmlOptions: {srsName: "EPSG:3857"},
                        featureNS: "fiware",
                        featureType: "fiware:fw_core"
    
    
                    });
    
                    $.ajax({
                        type: "POST",
                        url: "http://192.168.4.33:9090/geoserver/wfs",
                        data: new XMLSerializer().serializeToString(node),
    
                        contentType: 'text/xml',
                        success: function(data) {
                            var result = format.readTransactionResponse(data);
                            feature.setId(result.insertIds[0]);
    
                        },
                        error: function(e) {
                            var errorMsg = e? (e.status + ' ' + e.statusText) : "";
                            bootbox.alert('Error saving this feature to GeoServer.<br><br>'
                                + errorMsg);
                        },
                        context: this
                    });
    
                  });
               map.addInteraction(draw);
    
             }
    

    此外,在Geoserver上定义矢量图层时,在发布选项卡中,您必须定义要用作几何图形列的列 .

    另一件事,取决于OpenLayers 3版本,你可能需要在这行代码中使用 node.impl 而不是 node

    new XMLSerializer().serializeToString(node.impl)
    

    希望能帮助到你!

  • 1

    我想通了,因为列的名称是几何,我必须设置同名的属性 . 所以我做的是:

    draw.on('drawend', function(evt) {
                var feature = evt.feature;
                feature.set('geometry', feature.getGeometry());
                var fid = feature.getId();
                var node = format.writeTransaction([feature], null, null, {
                    gmlOptions: {srsName: "EPSG:3857"},
                    featureNS: "fiware",
                    featureType: "nyc_buildings"        
                });
    

相关问题