Openlayers-3 WFS-T (Post feature to postgis via geoserver)

﹥>﹥吖頭↗ 提交于 2019-12-18 17:11:53

问题


I have a problem with posting features from ol3 into postgis db via geoservers wfs.When i run this code, i only manage to insert gid(pk) and bin columns but the_geom(Geometry) column is empty.

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 that i get is:

<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>

And xml that i know it works is:

<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>

Any idea?


回答1:


Here is more complete code regarding 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);

         }

Also when defining vector layer on Geoserver, in publishing tab you must define what column you are using as geometry column.

Another thing, depending on OpenLayers 3 version you might need to use node.impl instead of just node in this line of code:

new XMLSerializer().serializeToString(node.impl)

Hope it helps!




回答2:


I figured it out, because the name of the column was geometry i had to set attribute with same name.So what i did is:

 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"        
            });


来源:https://stackoverflow.com/questions/30440460/openlayers-3-wfs-t-post-feature-to-postgis-via-geoserver

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!