GeoServer发布超过2G的GeoTIFF数据

1,625 阅读4分钟

我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第1篇文章,点击查看活动详情

0.我的环境配置

软件版本
GDAL3.1.2
JDK1.8
GeoServer2.20.1
Tomcat7.0.55
Python3.6.4

为避免您浪费时间,给出我的环境版本信息

1. 问题背景

  GeoServer 拥有发布 GeoTIFF 文件地图的能力,但在文件大于 2GB 时,其前端渲染效率便会下降,文件越大下降得越快,甚至于崩溃。

  正如 Configuring an Image Pyramid 中提到,超过 2GB,你就要思考要不要使用 image pyramid 了。

2. 什么是 ImagePyramid

  它的含义是影像金字塔,它通过把大文件分层级切割再建立一些列索引的方式来解决发布过大栅格地图文件可能导致发布地图的服务器崩溃的问题。

详情可以参考 ArcGIS 的官方文档:栅格金字塔

  我们的流程总共分两步,第一步是使用 FWTools 切割文件,第二步是安装 pyramid-plugin 插件发布地图。

3.切割大图的 FWTools

3.1.下载安装

  首先我们在 Windows 下,需要下载 FWTools ,这里我给出两个地址:

  安装完 FWTools 后,我们在它的 bin 目录下,可以找到一个文件叫 gdal_retile.py ,这个文件有两个问题,需要修改。

  第一个问题是第273行的最后一个参数 end=' '报错,需要改为:

print("Building internal Index for %d tile(s) ..." % len(inputTiles))

  第二个问题是,计算过程中取整数在python3中应该为//,需要在发生 pythonTypeError: 'float' object cannot be interpreted as an integer 错误的地方进行修改。

至少修改两处:

  1. 580行左右
levelOutputTileInfo = tile_info(levelMosaicInfo.xsize/2, levelMosaicInfo.ysize/2, tileWidth, tileHeight)

改为

levelOutputTileInfo = tile_info(levelMosaicInfo.xsize//2, levelMosaicInfo.ysize//2, tileWidth, tileHeight)
  1. 110行左右
self.countTilesX = xsize / tileWidth
self.countTilesY = ysize / tileHeight

改为

self.countTilesX = xsize // tileWidth
self.countTilesY = ysize // tileHeight

3.2.执行金字塔构建(重新瓦片化)

  在 gdal_retile.py 的同级目录打开命令行,执行:

python gdal_retile.py -v -r bilinear -levels 8 -ps 2048 2048 -co "TILED=YES" -co "COMPRESS=JPEG" -targetDir "D:\pyramid" "D:\origin.tif"

  下面说一下参数的含义

参数名含义
-v允许用户在每个文件生成时看到打印,因为大文件可能会处理几个小时
-r bilinear在低层构建过程中使用 bilinear (双线性插值)
-levels 8金字塔层数
-ps 2048 2048每层 GeoTIFF 文件大小为 2048x2048
-co “TILED=YES”为生成的每张 GeoTiff 切片使用内部切片
-co "COMPRESS=JPEG"采用图片压缩,COMPRESS=LZW 为无损模式
-targetDir输出目录
D:\origin.tif源文件

  执行过程中会遇到没有安装 GDAL 的错误提示,使用需要使用安装 whl 文件的方式,请访问www.lfd.uci.edu/~gohlke/pyt… ,对应自己的 python 版本和 GDAL 版本和电脑位数来下载安装。

这里说点题外话,很多人问GDAL对应哪个python版本好,其实没有绝对的,我觉得你直接看whl文件会有很好的收获。比如 GDAL‑3.4.3‑cp38‑cp38‑win_amd64.whl 就表明 GDAL3.4.3 可以对应 Python3.8。找一个稳定的成系统的版本就好,没必要要求最新。

  下载好后,执行安装命令即可

pip install .\GDAL-3.1.4-cp36-cp36m-win_amd64.whl

4.发布金字塔文件目录到 GeoServer

  访问 GeoServer Files,找到你对应版本的目录,点进去,有一个 extensions 目录,在这个目录中搜索geoserver-版本号-pyramid-plugin.zip文件,下载下来。

  解压缩后有一个 gt-imagepyramid-版本号.jar 的jar包,把它放在 Tomcat 下对应 GeoServer 的目录下的WEB-INF\lib 目录,其相对路径为 Tomcat\webapps\geoserver\WEB-INF\lib

  重启 Tomcat 访问 GeoServer,可以看到在添加数据存储的界面出现了ImagePyramid

image.png

  填写必填的参数即可:

image.png

5. 预览效果

  最后点开GeoServer的图层预览,OpenLayers看一下效果即可。

6. 2G 以内的 tiff 文件有无加速方式?

  可以构建一个金字塔文件,2G以内的地图可以使用金字塔文件,此文件可以由 ArcGIS 生成,也可以参考这篇文章:GDAL建立GeoTIFF金字塔文件,如果外部构建,有单独的 .ovr(Overviews) 文件,需要和同名的tiff文件放在同级目录进行发布。

  具体为什么可以加速,参考这篇文章:GDAL指定自定义的金字塔目录

参考

文章编写历史

更新日期修改内容
2022年9月9日完成初稿
2022年9月15日补充了2G以内TIFF文件加速方式