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 数据。所以,不用担心过程很慢,实际上它很快。
- 通过this guide
激活Geoserver中的WPS
- 然后转到Demos -> WPS Request Builder
- 选择进程作为gs:RasterAsPointCollection
- 输入栅格应该是你想要的。 Select 它来自那里的组合框。就我而言
WindWaveModel:u10
- TargetCRS 作为您的;就我而言
EPSG:4326
- interpolation 必须是 nearest,因为您正在尝试获取每个单元格的数据
- 处理输出 你必须从那里的组合框中 select application/json。如果你 select 任何其他
GeoServer
抛出异常。
- 不要填写emisphere(我认为代表半球)和scale.
- 可选:如果您想发现更多,可以按屏幕上的 DescribeProcess。
- 对于
request body
,Geoserver
在页面底部提供从进程inputs/outputs生成XML按钮。您必须单击此按钮才能让 Geoserver 创建请求 XML。首先,看看 XML 并尝试理解它是什么。
- 首先,您会发现,您在页面表单中填写的内容在 XML 中作为输入。然后,您会看到表格中填写的内容更多;就像你的
raster layer
的 bounding box
。它自动从图层信息中提取,gs:RasterAsPointCollection 过程为您提供 bounding box
输入。这样你就可以获得only some part of your raster layer
,而不是全部
- 其次,您会看到
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
现在,我正在查询 u10 和 v10 栅格图层(进行 2 次 WPS 调用) 用于获取 eastward_wind 和 northward_wind 值。然后我为每个单元格计算 euclidian sum
,最后根据结果值创建一个颜色图。我也用类似的几何方程计算风箭头方向。
我希望这对其他人也有帮助。
请让我知道,如果我可以加快这个过程,或者以任何其他方式优化它。
我正在使用 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 数据。所以,不用担心过程很慢,实际上它很快。
- 通过this guide 激活Geoserver中的WPS
- 然后转到Demos -> WPS Request Builder
- 选择进程作为gs:RasterAsPointCollection
- 输入栅格应该是你想要的。 Select 它来自那里的组合框。就我而言
WindWaveModel:u10
- TargetCRS 作为您的;就我而言
EPSG:4326
- interpolation 必须是 nearest,因为您正在尝试获取每个单元格的数据
- 处理输出 你必须从那里的组合框中 select application/json。如果你 select 任何其他
GeoServer
抛出异常。 - 不要填写emisphere(我认为代表半球)和scale.
- 可选:如果您想发现更多,可以按屏幕上的 DescribeProcess。
- 对于
request body
,Geoserver
在页面底部提供从进程inputs/outputs生成XML按钮。您必须单击此按钮才能让 Geoserver 创建请求 XML。首先,看看 XML 并尝试理解它是什么。 - 首先,您会发现,您在页面表单中填写的内容在 XML 中作为输入。然后,您会看到表格中填写的内容更多;就像你的
raster layer
的bounding box
。它自动从图层信息中提取,gs:RasterAsPointCollection 过程为您提供bounding box
输入。这样你就可以获得only some part of your raster layer
,而不是全部 - 其次,您会看到
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
现在,我正在查询 u10 和 v10 栅格图层(进行 2 次 WPS 调用) 用于获取 eastward_wind 和 northward_wind 值。然后我为每个单元格计算 euclidian sum
,最后根据结果值创建一个颜色图。我也用类似的几何方程计算风箭头方向。
我希望这对其他人也有帮助。
请让我知道,如果我可以加快这个过程,或者以任何其他方式优化它。