问题描述
从本地通过WFS请求发送三维数据到GeoServer后,再通过WFS的GetFeature请求获取数据返回确实二维数据。
请求如下:
<?xml version="1.0"?>
<wfs:Transaction xmlns:wfs="http://www.opengis.net/wfs/2.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
service="WFS" version="2.0.0"
xmlns:gml="http://www.opengis.net/gml/3.2"
xmlns:ogc="http://www.opengis.net/ogc"
xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/2.0.0/wfs.xsd http://localhost:8080/test_wfs http://192.168.4.53:8080/geoserver/wfs?SERVICE=WFS&VERSION=2.0.0&TYPENAME=test_wfs:wfs_test&outFormat=GML3.2&srsName=EPSG:4326&REQUEST=DescribeFeatureType">
<wfs:Insert>
<feature:wfs_test xmlns:feature="http://localhost:8080/test_wfs">
<feature:type>3</feature:type>
<feature:geom>
<gml:Point srsName="urn:ogc:def:crs:EPSG::4326">
<gml:pos>
0 200 9
</gml:pos>
</gml:Point>
</feature:geom>
<feature:doublevalue>33.0124</feature:doublevalue>
<feature:stringvalue>点5</feature:stringvalue>
</feature:wfs_test>
</wfs:Insert>
</wfs:Transaction>
返回数据如下:
<?xml version="1.0" encoding="UTF-8"?>
<wfs:FeatureCollection xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:wfs="http://www.opengis.net/wfs/2.0" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:test_wfs="http://localhost:8080/test_wfs" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" numberMatched="1" numberReturned="1" timeStamp="2023-04-28T08:45:38.401Z" xsi:schemaLocation="http://localhost:8080/test_wfs http://192.168.4.53:8080/geoserver/wfs?service=WFS&version=2.0.0&request=DescribeFeatureType&typeName=test_wfs%3Awfs_test http://www.opengis.net/wfs/2.0 http://192.168.4.53:8080/geoserver/schemas/wfs/2.0/wfs.xsd http://www.opengis.net/gml/3.2 http://192.168.4.53:8080/geoserver/schemas/gml/3.2.1/gml.xsd">
<wfs:member>
<test_wfs:wfs_test gml:id="wfs_test.115">
<test_wfs:type>3</test_wfs:type>
<test_wfs:geom>
<gml:Point srsName="EPSG:4326" srsDimension="2" gml:id="wfs_test.115.geom">
<gml:pos>0 200</gml:pos>
</gml:Point>
</test_wfs:geom>
<test_wfs:doublevalue>33.0124</test_wfs:doublevalue>
<test_wfs:stringvalue>点5</test_wfs:stringvalue>
</test_wfs:wfs_test>
</wfs:member>
</wfs:FeatureCollection>
最后将请求到的数据写入数据库时,报错显示类型不匹配。
原因分析:
GeoServer请求的图层储存在postgre数据库,在建矢量表时,将geom字段的类型建为Geomtry类型,而Geomtry类型只支持二维,GeoServer会显式的将三维数据转换为二维存储,导致请求下来的数据变成了二维。
解决方案:
在建postgre矢量表时,geom字段采用GeomtryZ类型【建表sql语句创建】,就可以支持三维。如想要支持四维则类型为GeomtryZM。
返回数据如下:
<?xml version="1.0" encoding="UTF-8"?>
<wfs:FeatureCollection xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:wfs="http://www.opengis.net/wfs/2.0" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:test_wfs="http://localhost:8080/test_wfs" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" numberMatched="1" numberReturned="1" timeStamp="2023-04-28T08:45:38.401Z" xsi:schemaLocation="http://localhost:8080/test_wfs http://192.168.4.53:8080/geoserver/wfs?service=WFS&version=2.0.0&request=DescribeFeatureType&typeName=test_wfs%3Awfs_test http://www.opengis.net/wfs/2.0 http://192.168.4.53:8080/geoserver/schemas/wfs/2.0/wfs.xsd http://www.opengis.net/gml/3.2 http://192.168.4.53:8080/geoserver/schemas/gml/3.2.1/gml.xsd">
<wfs:member>
<test_wfs:wfs_test gml:id="wfs_test.115">
<test_wfs:type>3</test_wfs:type>
<test_wfs:geom>
<gml:Point srsName="EPSG:4326" srsDimension="3" gml:id="wfs_test.115.geom">
<gml:pos>0 200 9</gml:pos>
</gml:Point>
</test_wfs:geom>
<test_wfs:doublevalue>33.0124</test_wfs:doublevalue>
<test_wfs:stringvalue>点5</test_wfs:stringvalue>
</test_wfs:wfs_test>
</wfs:member>
</wfs:FeatureCollection>
注意:有网上的解决方案提出将geom的类型改为geography,该类型支持点线面带Z、M或ZM,但是GeoServer目前的版本,至少我使用的2.21.11版本并不支持该类型,当使用WFS请求时,会返回一个Unknow wkb type 233的一个异常。