GeoServer的WFS请求获取三维数据问题

问题描述

从本地通过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&amp;VERSION=2.0.0&amp;TYPENAME=test_wfs:wfs_test&amp;outFormat=GML3.2&amp;srsName=EPSG:4326&amp;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&amp;version=2.0.0&amp;request=DescribeFeatureType&amp;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&amp;version=2.0.0&amp;request=DescribeFeatureType&amp;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的一个异常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值