【问题标题】:Geoserver - GetFeatureInfo of raster/wms layer multiple points/location or bounding boxGeoserver - 栅格/wms 图层多个点/位置或边界框的 GetFeatureInfo
【发布时间】:2017-08-05 22:21:33
【问题描述】:

我正在使用Geoserver 2.8.1 版本。我有netcdf and grib 文件,我正在通过Geoserver extensions 将这些文件上传到Geoserver。之后,我使用这些数据在地图中显示图层特征信息。 (根据缩放比例和图像大小)我在地图上放了箭头以参考wind and wave方向。我通过获取这样的netcdf信息来计算箭头将定位到哪个角度;

localhost:8080/geoserver/wms?Service=WMS&version=1.3&bbox=23.75,32.75,24.25,33.25&layers=it.geosolutions:u10&query_layers=it.geosolutions:u10&FEATURE_COUNT=10&REQUEST=GetFeatureInfo&INFO_FORMAT=application/json&WIDTH=20&HEIGHT=20& =10&y=10&time=2015-06-16T18:00:00.000Z

我对每个点仅更改 bbox 提出上述要求(可以说平均 1000 次)。它正在杀死我的应用程序。有什么方法可以在一个请求中获取所有单元格/点的特征信息/值?

我知道我现在不能用WMS - getFeatureInfo 做到这一点,但我愿意接受任何建议,唯一的限制是我需要使用 java。

注意:我不是在寻找多层中一个点的值,而是在寻找多个点的值。我已经可以获取多个层的值了。

【问题讨论】:

    标签: java gis netcdf geoserver wms


    【解决方案1】:

    如果不编写新的服务器端代码(ncWMS extensions 中的新操作或执行相同操作的自定义 WPS 进程),我认为没有什么好方法可以做到这一点。

    【讨论】:

    • 谢谢安德里亚。这些似乎不是短期适用的解决方案。不过我有一个问题,实现您建议的最佳方法是使用 geoserver 源代码,对吗?
    • 是的。在此处获取 GeoServer 新功能的更全面指南:github.com/geoserver/geoserver/wiki/…
    • 你好,Andrea,我现在可以实现一个示例 WPS 流程。谢谢你指导我。但是,我不太了解如何将 netCDF 数据读入二维数组。你能否在这方面给我指出正确的方向。现在我主要关注 netCDF 插件是如何实现的。
    【解决方案2】:

    我尝试了很多方法后解决了这个问题,但直到现在才找到时间在这里发布答案。

    首先,我正在开发自己的 WPS 流程。然而,在搜索代码示例的过程中,我发现 Geoserver 已经有一个用于获取原始 Raster 数据的 WPS 进程。所以,我决定尝试一下。

    阅读步骤前的第一个重要提示;如果您使用SOAP Ui 或类似于测试请求的东西,而不是尝试编写代码。您应该知道从请求中获得响应对我来说需要几毫秒,但是 Soap Ui 需要 10-15 分钟 来解析返回的 json 数据。所以,不要担心这个过程很慢,实际上它很快。

    1. 通过this guide 在 Geoserver 中激活 WPS
    2. 然后转到Demos -> WPS Request Builder
    3. 选择进程gs:RasterAsPointCollection
    4. 输入栅格应该是您想要的。从那里的组合框中选择它。在我的情况下WindWaveModel:u10
    5. TargetCRS 属于你的;在我的情况下EPSG:4326
    6. 当您尝试获取每个单元格的数据时,插值必须是最近的
    7. 处理输出,您必须从那里的组合框中选择 application/json。如果您选择任何其他 GeoServer 将引发异常。
    8. 不要填充 emisphere(我认为代表半球)和 scale
    9. 可选:如果您想了解更多信息,可以按屏幕上的DescribeProcess
    10. 对于request bodyGeoserver 在页面底部提供从流程输入/输出生成 XML 按钮。您必须单击此按钮,Geoserver 才能创建请求 XML。首先,查看 XML 并尝试了解它是什么。
    11. 首先,您将意识到,您在页面表单中填写的内容作为输入存在于 XML 中。然后,您会看到表格中填写的内容不止于此;就像你的raster layerbounding box。它是从图层信息中自动提取的,gs:RasterAsPointCollection 进程为您提供bounding box 输入。这样您就可以获得only some part of your raster layer,而不是全部。
    12. 其次,您会看到process chaining,因为第一个<wps:input>wcs:GetCoverage 服务的输出。这对我来说有点挑战,因为我的netcdf layers 中有time dimensions。而 gs:RasterAsPointCollection 使用的是 wcs:1.1.1 规范。如果您查看 wcs:1.1.1 规范,您将看到没有时间维度输入。那里对我来说有很多尝试和失败,我将跳过细节,因为我会为您提供final result in the XML form,并添加time dimension input

    <?xml version="1.0" encoding="UTF-8"?><wps:Execute version="1.0.0" service="WPS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.opengis.net/wps/1.0.0" xmlns:wfs="http://www.opengis.net/wfs" xmlns:wps="http://www.opengis.net/wps/1.0.0" xmlns:ows="http://www.opengis.net/ows/1.1" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns:wcs="http://www.opengis.net/wcs/1.1.1" xmlns:xlink="http://www.w3.org/1999/xlink" xsi:schemaLocation="http://www.opengis.net/wps/1.0.0 http://schemas.opengis.net/wps/1.0.0/wpsAll.xsd">
      <ows:Identifier>gs:RasterAsPointCollection</ows:Identifier>
      <wps:DataInputs>
        <wps:Input>
          <ows:Identifier>data</ows:Identifier>
          <wps:Reference mimeType="image/tiff" xlink:href="http://geoserver/wcs" method="POST">
            <wps:Body>
              <wcs:GetCoverage service="WCS" version="1.1.1">
                <ows:Identifier>yourWorkspace:yourRasterLayer(e.g. it.geosolutions:u10)</ows:Identifier>
                <wcs:DomainSubset>
                  <ows:BoundingBox crs="http://www.opengis.net/gml/srs/epsg.xml#4326">
                    <ows:LowerCorner>minLon minLat(e.g. 20.0 30.0)</ows:LowerCorner>
                    <ows:UpperCorner>maxLon maxLat(e.g. 55.0 48.0)</ows:UpperCorner>
                  </ows:BoundingBox>
                  <wcs:TemporalSubset>
                    <gml:TimePosition>yourTimeDimesion(e.g.2017-03-15T06:00:00.000Z)</gml:TimePosition>
                  </wcs:TemporalSubset>
                </wcs:DomainSubset>
                <wcs:Output format="image/tiff"/>
              </wcs:GetCoverage>
            </wps:Body>
          </wps:Reference>
        </wps:Input>
        <wps:Input>
          <ows:Identifier>targetCRS</ows:Identifier>
          <wps:Data>
            <wps:LiteralData>EPSG:4326</wps:LiteralData>
          </wps:Data>
        </wps:Input>
        <wps:Input>
          <ows:Identifier>interpolation</ows:Identifier>
          <wps:Data>
            <wps:LiteralData>nearest</wps:LiteralData>
          </wps:Data>
        </wps:Input>
      </wps:DataInputs>
      <wps:ResponseForm>
        <wps:RawDataOutput mimeType="application/json">
          <ows:Identifier>result</ows:Identifier>
        </wps:RawDataOutput>
      </wps:ResponseForm>
    </wps:Execute>
    

    HttpClient client = new DefaultHttpClient();
    HttpPost post = new HttpPost("http://localhost:8090/geoserver/ows?Service=WPS");
    HttpEntity entity = new ByteArrayEntity(xmlString.getBytes("UTF-8"));
    post.setEntity(entity);
    HttpResponse response = client.execute(post);
    // parse the json data in the response with a streaming model as it will be big
    

    现在,我正在查询 u10v10 栅格图层(进行 2 次 WPS 调用)以获取 eastward_wind em> 和 northward_wind 值。然后我为每个单元格计算euclidian sum,最后用结果值创建一个颜色图。我还用类似的几何方程计算风箭头方向。

    我希望这对其他人也有帮助。

    请告诉我,如果我可以加快这个过程,或者以其他方式优化它。

    【讨论】:

    • 我知道这是一篇旧文章,但在您的 XML 文件中,您是同时获取多个点的栅格数据,还是仅获取边界框?如果是后者,你会如何处理前者?
    • 这个答案为给定的边界框和时间层获取 NetCDF 文件中所有点的数据。
    • 如果这些点在矢量图层中,您是否知道如何同时获取许多特定点的数据?
    • 第一个问题是针对栅格的,第二个问题是针对矢量图层的。我认为您应该将您的问题作为一个单独的问题提出,而不是在 cmets 部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-02
    • 1970-01-01
    • 2015-02-17
    • 2023-04-06
    • 2023-03-22
    • 1970-01-01
    • 2015-03-09
    相关资源
    最近更新 更多