前言
因业务需求,需要发布同一区域多时相数据。第一反应就是image mosaic,但是以前没用过,于是开启了探险之旅。
搜资料阶段
经过一番搜索,发现了一篇帮助极大的文章。
《GeoServer官方教程:使用图像镶嵌插件组织并发布时间序列栅格数据》
但是其中部分内容对我来说过于晦涩难懂——个人水平有限【汗】,于是又找了geoserver官网的文档,对照着进行了尝试(感谢网易有道词典)。
geoserver官网image mosaic介绍
下面就是这次尝试的总结。
目录
- 准备
- 数据
- 服务
- 问题
准备
- geoserver。我的版本是2.15.0。
- postgresql(postgis)。PostgreSQL版本不低于9.1,PostGIS版本不低于2.0。
- 多时相的tif数据。
数据
- 将数据放入geoserver的数据目录下,或者任何一个geoserver可以访问到的目录。
- 按一定格式修改数据名,使程序可以读到日期/时间。我这里是“tem_时间.tif”。
- 数据的同一目录下创建timeregex.properties文件。内容:
regex=[0-9,T]+
- 数据的同一目录下创建indexer.properties文件。内容:
TimeAttribute=ingestion
Schema=*the_geom:Polygon,location:String,ingestion:java.util.Date
PropertyCollectors=TimestampFileNameExtractorSPI[timeregex](ingestion)
Caching=false
AbsolutePath=false
- 数据的同一目录下创建datastore.properties文件,内容:
SPI=org.geotools.data.postgis.PostgisNGDataStoreFactory
host=192.168.0.18
port=5432
database=testmosaic
schema=public
user=postgres
passwd=postgres
Loose\ bbox=true
Estimated\ extends=false
validate\ connections=true
Connection\ timeout=10
preparedStatements=true
现在的数据目录:
服务
- 创建工作空间:testMosaic。
- 添加新的数据存储(ImageMosaic)。
- 选择工作空间,填写数据源名称,找到数据目录,点击保存。
如果在这里遇到报错,请跳至问题模块。
====================分割线====================
- 在【编辑图层】界面【数据】下,修改Granule Sorting (WFS like syntax)的值:
- 在【编辑图层】界面【维度】下,启用时间,【简报】为列表:
- 点击保存,发布成功。
- 调用服务。可以在链接中添加
&time=<Pattern>
来显示特定时间的栅格数据,这里的Pattern可以使用下图中ingestion列的值。
问题
在整个过程中,我在数据阶段遇到的问题最多。其实搞懂之后也不难,关键就在配置文件。
三个配置文件,一个是连上数据库,一个是读取tif文件名中的时间,一个是在数据库中创建表,并把读取到的时间写进去。最终数据库中会多一个图层名一致的表,表中的内容如下所示:
下面请对照着这张图,来看看三个配置文件的含义。
- datastore.properties是连接数据库,修改IP、端口、数据库、用户名、密码即可。
- timeregex.properties是用正则表达式来提取tif文件名中的时间。
regex=[0-9,T]+
的效果是从tem_20220121T080000.tif
中取出20220121T080000
赋值给regex
变量。
ps. 这里的时间最好符合ISO8601
标准。当然也可以用自己的格式,但要有新参数。官方文档如下图:
ps. 此外,如果日期在上层目录名中,可以采用以下方式:
如果还需要海拔字段,可以再添加一个elevationregex.properties
文件;其他相关内容详见官方文档。 - indexer.properties文件说明了将在数据库中添加的字段。
如Schema=*the_geom:Polygon,location:String,ingestion:java.util.Date
就代表会创建三个字段,分别是the_geom
(Polygon类型)、location
(String类型)、ingestion
(java.util.Date,也就是日期类型)。其中前两者是固定不变、必须要有的,其他的可根据自己需求添加。
TimeAttribute=ingestion
表示用ingestion
字段存储时间值。
PropertyCollectors=TimestampFileNameExtractorSPI[timeregex](ingestion)
,这句的重点在[]和()中。[timeregex]
是timeregex.properties的文件名。这一句的意思是把从timeregex.properties中读取到的值regex
交给ingestion
字段。
配置好相关信息后,应该就可以成功发布image mosaic服务了。如果出现问题,多检查检查tif文件名、正则表达式、配置文件等内容。
最后,再次感谢大佬的作品《GeoServer官方教程:使用图像镶嵌插件组织并发布时间序列栅格数据》。