Geoserver - 栅格/ wms图层的GetFeatureInfo多个点/位置或边界框

时间:2017-03-15 09:10:53

标签: java gis netcdf geoserver wms

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

  

本地主机:8080 /的GeoServer / WMS服务= WMS&安培;版本= 1.3&安培; BBOX = 23.75,32.75,24.25,33.25&安培;多层= it.geosolutions:U10&安培; QUERY_LAYERS = it.geosolutions:U10&安培; FEATURE_COUNT = 10安培; REQUEST =的GetFeatureInfo&安培; INFO_FORMAT =应用/ JSON&安培; WIDTH = 20&安培; HEIGHT = 20安培; X = 10安培; Y = 10安培;时间= 2015-06-16T18:00:00.000Z

我对每个点只更改bbox进行上述请求(让我们说平均1000次)。它正在杀死我的申请。有什么方法可以在一个请求中获取所有单元格/点的功能信息/值吗?

我知道我现在无法使用WMS - getFeatureInfo,但我对任何建议持开放态度,唯一的限制是我需要使用java。

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

2 个答案:

答案 0 :(得分:2)

我不相信在没有编写新的代码服务器端的情况下可以做到这一点,ncWMS extensions中的新操作或自定义WPS进程也是如此。

答案 1 :(得分:2)

我在尝试了很多方法后解决了这个问题,但到现在为止还没有时间在这里发布答案。

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

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

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

    目前,我正在查询 u10 v10 栅格图层(进行2次WPS调用)以获取 eastward_wind northward_wind 值。然后我为每个单元格计算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 ,最后用结果值创建一个颜色图。我还用类似的几何方程计算风箭头方向。

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

    请告诉我,如果我能更快地完成此过程,或以任何其他方式对其进行优化。