I’m running QGIS 2.18.15 against Geoserver 2.12.1 (full version details below). I have a custom layer serving a single feature type with an Id, Location (geometry) and name (see GML below). When I try ‘Add WFS layer’ pointing to the geoserver I get the errors (see below)
The QGIS error references Complex Features, which I’ve seen elsewhere cannot be imported directly.
If this is true, how can I get my feature layer to integrate with QGIS?
I’ve seen reference to GDAL and GMLAS, although the later seems to be a command line tool for XML to GML conversion.
If this is not the way to go, can QGIS be convinced to accept a Geometry/Point?
QGIS error
2018-02-20T11:12:50 1 Analysis of DescribeFeatureType response failed for url srsname='EPSG:4326' typename='trueDb:Pole' url='http://localhost:8080/geoserver/wfs' version='auto' table="" sql=: it is probably a schema for Complex Features
And in the geoserver log
20 Feb 11:12:38 INFO [org.geoserver.wfs] -
Request: getServiceInfo
20 Feb 11:12:38 INFO [org.geoserver.wfs] -
Request: getCapabilities
acceptVersions:
version[0] = 2.0.0version[0] = 1.1.0version[0] = 1.0.0
baseUrl = http://localhost:8080/geoserver/
service = WFS
20 Feb 11:12:50 INFO [org.geoserver.wfs] -
Request: getServiceInfo
20 Feb 11:12:50 INFO [org.geoserver.wfs] -
Request: getCapabilities
acceptVersions:
version[0] = 2.0.0version[0] = 1.1.0version[0] = 1.0.0
baseUrl = http://localhost:8080/geoserver/
service = WFS
20 Feb 11:12:50 INFO [org.geoserver.wfs] -
Request: getServiceInfo
20 Feb 11:12:50 INFO [org.geoserver.wfs] -
Request: describeFeatureType
service = WFS
version = 2.0.0
baseUrl = http://localhost:8080/geoserver/
typeName[0] = {trueDb}Pole
outputFormat = application/gml+xml; version=3.2
20 Feb 11:12:50 WARN [org.geoserver.wfs] - Could not build xml schema for type: Pole
java.lang.NullPointerException: Could not find a type for property: Location of type: org.opengis.geometry.primitive.Point
…
GML result of manual browser request
<wfs:FeatureCollection xmlns="http://www.opengis.net/wfs" xmlns:wfs="http://www.opengis.net/wfs" xmlns:trueDb="trueDb" xmlns:gml="http://www.opengis.net/gml"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="trueDb http://localhost:8080/geoserver/wfs?service=WFS&version=1.0.0&request=DescribeFeatureType&typeName=trueDb%3APole http://www.opengis.net/wfs http://localhost:8080/geoserver/schemas/wfs/1.0.0/WFS-basic.xsd">
<gml:boundedBy>
<gml:null>unknown</gml:null>
</gml:boundedBy>
<gml:featureMember>
<trueDb:Pole fid="1425580">
<trueDb:Location>
<gml:Point srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
<gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="." cs="," ts=" ">-2.48143876,51.37922549</gml:coordinates>
</gml:Point>
</trueDb:Location>
<trueDb:Name>GPS0017</trueDb:Name>
</trueDb:Pole>
</gml:featureMember>
….
Versions
QGIS
QGIS version
2.18.15
QGIS code branch
Release 2.18
Compiled against Qt
4.8.6
Running against Qt
4.8.6
Compiled against GDAL/OGR
2.1.3
Running against GDAL/OGR
2.1.3
Compiled against GEOS
3.6.2-CAPI-1.10.2
Running against GEOS
3.6.1-CAPI-1.10.1 r0
PostgreSQL Client Version
9.3.4
SpatiaLite Version
4.3.0a
QWT Version
6.1.3
PROJ.4 Version
492
QScintilla2 Version
2.9.3
GeoServer
Build Information
GeoServer Version
2.12.1
Git Revision
5927e49e781ddcdbf9213d32a439418347c17480
Build Date
21-Nov-2017 22:02
GeoTools Version
18.1 (rev 306cf3bdde1bee0110dc1c3ba77819f1e294a45b)
GeoWebCache Version
1.12.1 (rev 1.12.x/22d18b47c9e80316d563c28d280602cb3dde624c)
DescribeFeatureType request
<?xml version="1.0" encoding="UTF-8"?><xsd:schema xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:trueDb="trueDb" xmlns:wfs="http://www.opengis.net/wfs/2.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="trueDb">
<xsd:import namespace="http://www.opengis.net/gml/3.2" schemaLocation="http://localhost:8080/geoserver/schemas/gml/3.2.1/gml.xsd"/>
</xsd:schema>
Groovy Code to generate the feature
geometryFactory = JTSFactoryFinder.getGeometryFactory(null)
SimpleFeature toOpenGIS(Feature feature) {
def point = geometryFactory.createPoint(new Coordinate(feature.geometry.asPoint().location.longitude,
feature.geometry.asPoint().location.latitude))
builder.set("Location", point)
builder.set("Name", feature.name)
builder.buildFeature(feature.id)
}