将gdal压缩GeoTIFF与GeoServer

时间:2017-06-09 13:19:24

标签: gdal geoserver image-compression wms geotiff

我想要通过GeoServer(v.2.11)中的WMS流式传输大型GeoTIFF。图像的大小约为7GB,包含非常大的高分辨率RGB图像。我已经在JVM中允许了足够的堆空间来显示图像。但是,我想压缩图像,以便在浏览时更具响应性,因此它将分配更少的内存。我已经遵循了一些建议here

我的策略是使用JPEG压缩来压缩GeoTIFF ,并将其用作GeoServer中的数据存储。但是,这似乎不起作用。这是我用来翻译图像的gdal命令:

gdal_translate -of GTiff -co "BIGTIFF=YES" -co "COMPRESS=JPEG"  -co "TILED=YES" -co "BLOCKXSIZE=512" -co "BLOCKYSIZE=512" -a_srs "EPSG:3057" D:\raster\image.tif 
D:\raster\image_translate.tif

使用openlayers预览图像时,我什么都没有,只是一个空白的底图。来自GeoServer的日志告诉我投影中的某些内容变坏了

2017-06-09 13:16:47,551 INFO [geoserver.wms] - 
Request: getServiceInfo
2017-06-09 13:16:47,561 WARN [lite.gridcoverage2d] - Could not reduce the grid geometry inside the valid area bounds: ReferencedEnvelope[-1.7976931348623157E308 : 1.7976931348623157E308, -85.0 : 85.0]
Grid geometry isGridGeometry2D[GeneralGridEnvelope[0..357, 0..357], PARAM_MT["Affine", 
  PARAMETER["num_row", 3], 
  PARAMETER["num_col", 3], 
  PARAMETER["elt_0_0", 0.7353351955307262], 
  PARAMETER["elt_0_2", 584219.1848475977], 
  PARAMETER["elt_1_1", -0.7353351955307262], 
  PARAMETER["elt_1_2", 383937.61122240225]]]
2017-06-09 13:16:47,566 ERROR [geoserver.ows] - 
org.geoserver.platform.ServiceException: Error rendering coverage on the fast path

然后我尝试在GDAL中使用另一种压缩策略,即" DEFLATE"

gdal_translate -of GTiff -co COMPRESS=DEFLATE -co PREDICTOR=2 -co ZLEVEL=9 -co "BIGTIFF=YES" -a_srs "EPSG:3057"  D:\raster\image.tif D:\raster\image_translate2.tif
在openlayers中预览时,

有效。这是GeoServer日志:

2017-06-09 13:28:27,137 INFO [geoserver.wms] - 
Request: getServiceInfo
2017-06-09 13:28:27,146 WARN [lite.gridcoverage2d] - Could not reduce the grid geometry inside the valid area bounds: ReferencedEnvelope[-1.7976931348623157E308 : 1.7976931348623157E308, -85.0 : 85.0]
Grid geometry isGridGeometry2D[GeneralGridEnvelope[0..357, 0..357], PARAM_MT["Affine", 
  PARAMETER["num_row", 3], 
  PARAMETER["num_col", 3], 
  PARAMETER["elt_0_0", 0.7353351955307262], 
  PARAMETER["elt_0_2", 584219.1848475977], 
  PARAMETER["elt_1_1", -0.7353351955307262], 
  PARAMETER["elt_1_2", 383937.61122240225]]]
2017-06-09 13:28:27,231 INFO [geoserver.wms] - 
Request: getMap

我还尝试使用JPEG压缩和无平铺来执行gdal_translate,并且我在GeoServer日志中也出现错误,并且openlayers预览没有显示任何内容。

所以我的问题是,压缩GeoTIFF文件以在WMS中使用的最佳策略是什么?目前,似乎DEFLATE是唯一有效的,但压缩不是最好。 有没有人能够成功将JPEG压缩的GeoTIFF上传到Geoserver?

2 个答案:

答案 0 :(得分:0)

如果对我有帮助,请按以下步骤操作。

首先,我将栅格切成较小的图块,大小并不重要,对我来说通常是256x256、512x512或1024x124。

我使用了从gdal2tiles.py到我自己的本地C#应用程序的许多不同程序。

重要的是,这些瓷砖是正方形的。

一旦我在文件夹中放置了图块,就可以使用gdaltindex

这会为每个图块创建一个带有一个正方形的shapefile,并正确地进行地理定位(假设您的栅格是)以及每个图块的名称,我通常会告诉gdaltindex将绝对路径写入shapefile。

然后我将形状称为地图服务器中的图块层,我不能说geoserver是否会接受基于形状的图块索引,但是由于gdal可以使它们和其他基于WMS的服务器可用的开源(mapserver)可以使用它们,那么如果geoserver无法使用它们,我将感到非常惊讶。

答案 1 :(得分:0)

这在tiff大于2GB的情况下有效。只要TIFF小于2GB,GeoServer就能有效地处理带有概述的大型TIFF。 使用图像金字塔可以使tiff加载更快,因为它可以使不同缩放级别的多个图像镶嵌在一起。 使用以下命令:-

mkdir bmpyramid
gdal_retile.py -v -r bilinear -levels 4 -ps 2048 2048 -co "TILED=YES" -co "COMPRESS=JPEG" -targetDir bmpyramid bmreduced.tiff

您可以在这里查看 https://docs.geoserver.org/stable/en/user/tutorials/imagepyramid/imagepyramid.html