Geoserver - raster/wms 层多个 points/location 或边界框的 GetFeatureInfo

Geoserver - GetFeatureInfo of raster/wms layer multiple points/location or bounding box

我正在使用 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&x=10&y=10&time=2015-06-16T18:00:00.000Z

我提出以上要求,每个点只改变 bbox(比如说平均 1000 次)。它正在杀死我的应用程序。有什么方法可以在一个请求中为所有cells/points获得特征info/values?

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

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

我认为没有编写新代码服务器端的好方法,无论是 ncWMS extensions 中的新操作还是执行相同操作的自定义 WPS 进程。

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

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

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

  1. 通过this guide
  2. 激活Geoserver中的WPS
  3. 然后转到Demos -> WPS Request Builder
  4. 选择进程作为gs:RasterAsPointCollection
  5. 输入栅格应该是你想要的。 Select 它来自那里的组合框。就我而言 WindWaveModel:u10
  6. TargetCRS 作为您的;就我而言 EPSG:4326
  7. interpolation 必须是 nearest,因为您正在尝试获取每个单元格的数据
  8. 处理输出 你必须从那里的组合框中 select application/json。如果你 select 任何其他 GeoServer 抛出异常。
  9. 不要填写emisphere(我认为代表半球)和scale.
  10. 可选:如果您想发现更多,可以按屏幕上的 DescribeProcess
  11. 对于request bodyGeoserver在页面底部提供从进程inputs/outputs生成XML按钮。您必须单击此按钮才能让 Geoserver 创建请求 XML。首先,看看 XML 并尝试理解它是什么。
  12. 首先,您会发现,您在页面表单中填写的内容在 XML 中作为输入。然后,您会看到表格中填写的内容更多;就像你的 raster layerbounding box。它自动从图层信息中提取,gs:RasterAsPointCollection 过程为您提供 bounding box 输入。这样你就可以获得only some part of your raster layer,而不是全部
  13. 其次,您会看到 process chaining,因为第一个 <wps:input>wcs:GetCoverage 服务的输出。这对我来说有点挑战,因为我的 netcdf layers 中有 time dimensionsgs: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_windnorthward_wind 值。然后我为每个单元格计算 euclidian sum,最后根据结果值创建一个颜色图。我也用类似的几何方程计算风箭头方向。

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

请让我知道,如果我可以加快这个过程,或者以任何其他方式优化它。