使用 GeoServer 提供大型栅格会导致 JAVA HEAP 内存不足

Serving large rasters using GeoServer results in JAVA HEAP out of memory

我在 GeoServer 上有非常大的栅格,例如 35000px X 30000px。(马赛克图像) 我目前正在做的是使用 WMS 下载这些图像,然后对该图像执行分析、修改(我正在为该图像的某些部分着色),然后将其上传回GeoServer 作为新层。

这适用于最大 20000px X 20000px 的图像,但之后 GeoServer 无法合并它们,而不是 geotiff 图像 returns 文件,其中包含 xml 内容:

错误 [geoserver.ows] - java.lang.OutOfMemoryError: Java堆space

现在在 java 选项变量中,我插入 Xmx 为 22 GB 并在 运行 jetty Xmx[=23 的内部脚本中=] 被放置为 20GB。我使用 top 和 free -m 命令密切关注平均负载,使用的内存从未超过 8GB。 我的服务器有 28GB RAM 和 8 个处理器,CPU 负载从未超过 700%。 有人可以提示我做错了什么以及我该怎么做才能下载如此大的 Geotiff 图像。 顺便说一句,我正在使用码头作为服务器。

虽然我没有意识到为什么会出现此错误,但我设法使用 Web 覆盖服务 (WCS) 而不是 WMS 从 GeoServer 下载了整个栅格。 WCS 是下载大光栅图像的正确方法。 因此,如果有人偶然发现类似问题,我建议您像这样向地理服务器上的 wcs 服务发送 post 请求 POSThttp://192.168.4.162:9090/geoserver/wcs 并且随着数据传递 xml 描述您的图层(您可以使用 Geoserver 中的 demos 菜单下的 WCS 请求生成器创建它)。我的看起来像这样:

<?xml version="1.0" encoding="UTF-8"?><GetCoverage version="1.0.0" service="WCS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.opengis.net/wcs" xmlns:ows="http://www.opengis.net/ows/1.1" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xsi:schemaLocation="http://www.opengis.net/wcs http://schemas.opengis.net/wcs/1.0.0/getCoverage.xsd">
  <sourceCoverage>fiware:test</sourceCoverage>
  <domainSubset>
    <spatialSubset>
      <gml:Envelope srsName="EPSG:4326">
        <gml:pos>-87.3539257 38.3719729154</gml:pos>
        <gml:pos>-87.3437449312 38.3783359</gml:pos>
      </gml:Envelope>
      <gml:Grid dimension="2">
        <gml:limits>
          <gml:GridEnvelope>
            <gml:low>0 0</gml:low>
            <gml:high>32768 20479</gml:high>
          </gml:GridEnvelope>
        </gml:limits>
        <gml:axisName>x</gml:axisName>
        <gml:axisName>y</gml:axisName>
      </gml:Grid>
    </spatialSubset>
  </domainSubset>
  <output>
    <crs>EPSG:4326</crs>
    <format>GeoTIFF</format>
  </output>
</GetCoverage>

并且不要忘记将 application/xml 作为内容类型。 干杯!