GeoServer 发布大型影像数据

手头有一个 8.7GB 的 GeoTiff 高清航空影像,需要用 GeoServer 发布成地图服务。使用默认的 GeoTiff 方式时,WMS服务效率非常低,已经影响正常使用。为了改善地图服务的效率,可以为影像建立金字塔,再通过 GeoServer 的 Image Pyramid 扩展来发布。

用 FWTools 建立影像金字塔

首先,下载 FWTools 并安装。安装完成后需要修改 bin 目录下的gdal_retile.py(Windows 版),用编辑器打开bin/gdal_retile.py,把第273行修改成:

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

去掉 print 方法的最后一个参数 end=' ',否则在 cmd 中执行命令会报错。

修改完成后打开 FWTools Shell,使用下面的命令建立金字塔(文件名、路径千万不要有中文,否则不能在 GeoServer 中正常发布):

C:\Program Files (x86)\FWTools2.4.7\bin>python gdal_retile.py -v -r bilinear -le
vels 8 -ps 2048 2048 -co "TILED=YES" -co "COMPRESS=JPEG" -targetDir "D:\pyramid" "D:\origin.tif"

其中各个参数的意思是:

  • -v: verbose output,运行过程中输出详细信息(生成每个切片后输出一行提示)。
  • -r bilinear: 重采样算法设为双线性插值。
  • -levels 8: 影像金字塔的层数。
  • -ps 2048 2048: 每个切片的像素大小,注意2048要输入两次,分别指定长、宽。不指定-ps时,切片大小为256 * 256。
  • -co "TILED=YES: 为生成的每张 GeoTiff 切片使用内部切片(?inner tiled)
  • -co "COMPRESS=JPEG": 采用图片压缩。
  • -targetDir: 输出目录。
  • 最后指定源文件。

建立金字塔的过程比较耗时,上面提到的数据切片用了50分钟(虽然数据量大,但是覆盖的地理范围很小),顶层切片一共1775个。

如果在 GeoServer 中发布金字塔时发现个别切片有黑边,可以把有损的 COMPRESS=JPEG 模式改成 COMPRESS=LZW 无损压缩模式(改完还会有一些黑边的情况,但是不明显)。另外,如果切片数量很大,可以加上-useDirForEachRow选项,一个目录下图片数量过多会影响数据服务性能,尤其是在Windows下。更多优化选项可参考这个文档

打开输出目录,可以看到输出的切片图像:

在 GeoServer 中发布 Image Pyramid

要发布影像金字塔,首先要给 GeoServer 安装对应版本的 Image Pyramid 扩展。在 GeoServer 下载页面可以找到 Image Pyramid 扩展的下载链接,下载完成后,解压出所需要的 .jar 包,并复制到 GeoServer 的 WEB-INF/lib 目录下,再重启 GeoServer 。

Image Pyramid 扩展安装完成后,把上一步得到的金字塔目录复制到 GeoServer 的数据文件夹,之后在 GeoServer 中新建一个 Data Store,类型选择为 Image Pyramid,将数据路径手动修改为数据文件夹下对应的目录(这里不能通过文件管理器来指定)。

之后,再新建图层,数据源选择刚刚创建的 Data Store。为了和其他互联网地图配合使用,如果原始数据的投影不是 EPSG:3857(Web墨卡托投影,Google Maps、OSM 默认采用的投影),就需要将 Declared SRS 设置为 EPSG:3857,并将 SRS handling 设置成 'Reproject native to declared'。然后点击对应的按钮计算 Native Bounding Box 和 Lat/Lon Bounding Box,保存图层设置即可。

在 Layer Preview 中查看刚刚发布的影像金字塔,每个切片加载延时100ms左右,图片传输时间在2ms以内,效果非常理想。

参考