我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第1篇文章,点击查看活动详情
0.我的环境配置
| 软件 | 版本 |
|---|---|
| GDAL | 3.1.2 |
| JDK | 1.8 |
| GeoServer | 2.20.1 |
| Tomcat | 7.0.55 |
| Python | 3.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 ,这里我给出两个地址:
- 官方地址:不知为何,我总是下载失败
- softpedia地址: 找了很久才发现这里可以下载
安装完 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 错误的地方进行修改。
至少修改两处:
- 第580行左右
levelOutputTileInfo = tile_info(levelMosaicInfo.xsize/2, levelMosaicInfo.ysize/2, tileWidth, tileHeight)
改为
levelOutputTileInfo = tile_info(levelMosaicInfo.xsize//2, levelMosaicInfo.ysize//2, tileWidth, tileHeight)
- 第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:
填写必填的参数即可:
5. 预览效果
最后点开GeoServer的图层预览,OpenLayers看一下效果即可。
6. 2G 以内的 tiff 文件有无加速方式?
可以构建一个金字塔文件,2G以内的地图可以使用金字塔文件,此文件可以由 ArcGIS 生成,也可以参考这篇文章:GDAL建立GeoTIFF金字塔文件,如果外部构建,有单独的 .ovr(Overviews) 文件,需要和同名的tiff文件放在同级目录进行发布。
具体为什么可以加速,参考这篇文章:GDAL指定自定义的金字塔目录
参考
文章编写历史
| 更新日期 | 修改内容 |
|---|---|
| 2022年9月9日 | 完成初稿 |
| 2022年9月15日 | 补充了2G以内TIFF文件加速方式 |