I want to create some squared features with OpenLayers 4, add attributes to each feature and want to save them on the GeoServer to load them later on to another map. I am able to create the features, add attributes to them, read the attributes again and load a layers as WFS again.
My only problem is to save the created features to the GeoServer. I figured out that saving and loading should be possible with WFS-t. I found some examples online but they don't seem to work properly.
When i send the feature to the GeoServer with the function transactWFS
at line 133 I get the Error
"org.geoserver.wfs.WFSTransactionException: Feature type 'Stairways' is not available"
in the GeoServer log file. The Layer Stairways exists on the GeoServer.
This is the XML file that is sent:
<?xml version="1.0"?>
<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>
<Stairways xmlns="http://localhost:8080/geoserver/wfs">
<geometry>
<Polygon xmlns="http://www.opengis.net/gml" srsName="EPSG:3857">
<exterior>
<LinearRing srsName="EPSG:3857">
<posList>1528915.8154546698
6627851.731194374 1528917.9110709063
6627858.932471524 1528925.1123480562
6627856.836855288 1528923.0167318196
6627849.635578138 1528915.8154546698
6627851.731194374</posList>
</LinearRing>
</exterior>
</Polygon>
</geometry>
</Stairways>
</Insert>
</Transaction>
This is my whole Code:
GridSource.addFeature(NewSquare);
var attr = {};
var key = "TestAttr";
attr[key] = "This is a Test";
NewSquare.attributes = attr;
transactWFS('insert', NewSquare);
}
var formatWFS = new ol.format.WFS();
var formatGML = new ol.format.GML({
featureNS: gs.wfs,
featurePrefix: 'HTW_Erd',
featureType: 'Stairways',
srsName: 'EPSG:3857'
});
var xs = new XMLSerializer();
var transactWFS = function (mode, f) {
var node;
switch (mode) {
case 'insert':
node = formatWFS.writeTransaction([f], null, null, formatGML);
break;
case 'update':
node = formatWFS.writeTransaction(null, [f], null, formatGML);
break;
case 'delete':
node = formatWFS.writeTransaction(null, null, [f], formatGML);
break;
}
var payload = xs.serializeToString(node);
$.ajax(gs.ows, {
service: 'WFS',
type: 'POST',
dataType: 'xml',
processData: false,
contentType: 'text/xml',
data: payload,
error: function(e) {
var errorMsg = e? (e.status + ' ' + e.statusText) : "";
alert('Error saving this feature to GeoServer. \n\n'
+ errorMsg);
}
}).done();
};
Edit:
I saw in the log file that i wasnt allowed to write on that layer so i set the permissions. I also changed the projection of the GridLayer to 3857 and the name of the feature to geometry. But that didn't help either. I now don't get any errors and the log looks like this:
2017-07-30 23:47:07,676 INFO [geoserver.wfs] -
Request: getServiceInfo
2017-07-30 23:47:07,709 INFO [geoserver.wfs] -
Request: getServiceInfo
2017-07-30 23:47:07,744 INFO [geoserver.gwc] - DataStoreChange: {https://localhost:8080/geoserver/htw_erd}Stairways PreInsert
2017-07-30 23:47:07,749 INFO [geoserver.gwc] - DataStoreChange: {https://localhost:8080/geoserver/htw_erd}Stairways PostInsert
2017-07-30 23:47:07,751 INFO [geoserver.wfs] -
Request: getFeature
service = WFS
version = 1.1.0
baseUrl = http://localhost:8080/geoserver/
query[0]:
filter = [ bbox POLYGON ((1528628.1984057308 6627469.038650171, 1528628.1984057308 6628141.798427672, 1529548.9368749668 6628141.798427672, 1529548.9368749668 6627469.038650171, 1528628.1984057308 6627469.038650171)) ]
srsName = EPSG:3857
typeName[0] = {https://localhost:8080/geoserver/htw_erd}Stairways
outputFormat = application/json
resultType = results
2017-07-30 23:47:07,754 INFO [wfs.json] - about to encode JSON
2017-07-30 23:47:07,801 INFO [geoserver.wfs] -
Request: transaction
service = WFS
version = 1.1.0
baseUrl = http://localhost:8080/geoserver/
group[0] = wfs:insert=net.opengis.wfs.impl.InsertElementTypeImpl@e314ac (feature: [SimpleFeatureImpl:Stairways=[SimpleFeatureImpl.Attribute: the_geom<the_geom id=fid--2e9bc012_15d95498172_-7ffe>=null, SimpleFeatureImpl.Attribute: id<id id=fid--2e9bc012_15d95498172_-7ffe>=null, SimpleFeatureImpl.Attribute: indoor_are<indoor_are id=fid--2e9bc012_15d95498172_-7ffe>=null, SimpleFeatureImpl.Attribute: indoor_lev<indoor_lev id=fid--2e9bc012_15d95498172_-7ffe>=null, SimpleFeatureImpl.Attribute: indoor_l_1<indoor_l_1 id=fid--2e9bc012_15d95498172_-7ffe>=null]], handle: null, idgen: <unset>, inputFormat: <unset>, srsName: null)
insert[0]:
feature[0] = SimpleFeatureImpl:Stairways=[SimpleFeatureImpl.Attribute: the_geom<the_geom id=fid--2e9bc012_15d95498172_-7ffe>=null, SimpleFeatureImpl.Attribute: id<id id=fid--2e9bc012_15d95498172_-7ffe>=null, SimpleFeatureImpl.Attribute: indoor_are<indoor_are id=fid--2e9bc012_15d95498172_-7ffe>=null, SimpleFeatureImpl.Attribute: indoor_lev<indoor_lev id=fid--2e9bc012_15d95498172_-7ffe>=null, SimpleFeatureImpl.Attribute: indoor_l_1<indoor_l_1 id=fid--2e9bc012_15d95498172_-7ffe>=null]
idgen = GenerateNew
inputFormat = text/xml; subtype=gml/3.1.1
releaseAction = ALL
All the features that are already in the Layer named 'the_geom', renaming the feature to the_geom doesn't help.
Edit 2: This is the Output
<ows:ExceptionReport xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ows="http://www.opengis.net/ows" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0.0" xsi:schemaLocation="http://www.opengis.net/ows http://localhost:8080/geoserver/schemas/ows/1.0.0/owsExceptionReport.xsd">
<ows:Exception exceptionCode="InvalidParameterValue" locator="service">
<ows:ExceptionText>No service: ( wfs\ )</ows:ExceptionText>
</ows:Exception>
</ows:ExceptionReport>
I have to add that I dont have the default layers anymore, so i dont have the topp workgroup and the layer states anymore.
Edit 3: This is the Output for this link: http://localhost:8080/geoserver/wfs?service=wfs&version=1.1.0&request=DescribeFeatureType&typeName=HTW_Erd:Stairways
<xsd:schema xmlns:HTW_Erd="https://localhost:8080/geoserver/htw_erd" xmlns:gml="http://www.opengis.net/gml" xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="https://localhost:8080/geoserver/htw_erd">
<xsd:import namespace="http://www.opengis.net/gml" schemaLocation="http://localhost:8080/geoserver/schemas/gml/3.1.1/base/gml.xsd"/>
<xsd:complexType name="StairwaysType">
<xsd:complexContent>
<xsd:extension base="gml:AbstractFeatureType">
<xsd:sequence>
<xsd:element maxOccurs="1" minOccurs="0" name="the_geom" nillable="true" type="gml:MultiSurfacePropertyType"/>
<xsd:element maxOccurs="1" minOccurs="0" name="id" nillable="true" type="xsd:long"/>
<xsd:element maxOccurs="1" minOccurs="0" name="indoor_are" nillable="true" type="xsd:string"/>
<xsd:element maxOccurs="1" minOccurs="0" name="indoor_lev" nillable="true" type="xsd:string"/>
<xsd:element maxOccurs="1" minOccurs="0" name="indoor_l_1" nillable="true" type="xsd:string"/>
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
<xsd:element name="Stairways" substitutionGroup="gml:_Feature" type="HTW_Erd:StairwaysType"/>
</xsd:schema>