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以内,效果非常理想。