本文介绍了Openlayers-3 WFS-T(通过地理服务器将功能发布到Postgis)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在通过geoservers wfs将功能从ol3发布到postgis db时遇到问题.运行此代码时,我仅设法插入gid(pk)和bin列,但the_geom(Geometry)列为空.

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

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

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>

有什么主意吗?

推荐答案

以下是有关wfs-t的更完整的代码:

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

         }

此外,在Geoserver上定义矢量层时,还必须在发布"标签中定义将哪个列用作几何列.

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

另一件事,根据OpenLayers 3版本,您可能需要在此代码行中使用 node.impl 而不是仅 node :

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)

希望有帮助!

这篇关于Openlayers-3 WFS-T(通过地理服务器将功能发布到Postgis)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-18 13:09