postgis不同的栅格存储方式和查询的速度以及区域统计
很多应用都需要综合处理栅格和矢量数据进行统计,如果两者在同一个数据库里就很方便。
但是有些影像太大了,而且还经常得更新,所以我这次想用文件式的管理,只把索引入库,一查postgis是支持这种的。
raster2pgsql -s 3857 -R -C -I -M -F "raster.tif" -t 50x50 public.tablename |psql -U postgres -d database
根据这个博客的说法,入库的时候要使用下面的几种参数,可以变快(大概)
- -R代表使用outdb的存储方式,不把栅格本身入库
- -C是使用约束,比如srid、像素尺寸等等。
- -I是建立索引
- -M是运行vacuum
- -t是把栅格切片,分成多个记录,大小不同速度也不同
- 还有一个-l 是建立金字塔,QGIS显示的时候可以构建很多级据说就能流畅浏览
相关的讨论也可以在gis.stackexchange上也有不少,大多数说得都差不多,但是好像多数人都没有觉得这样的速度有多么好,不过因为我可能经常得操作源栅格进行科学计算,所以文件式存储至少是方便了很多。。。
另外其实有一个需求,就是我有时想快速概览一下存储的栅格,官方有一个教程,这个教程,但是要用他们的插件,我倒是想在postgis里面看
然后就是查询统计的问题了,同样博客和论坛上都说有两种方法裁剪出需要的区域,可以用st_clip来切,可以用st_intersection来切。前者是把矢量变成栅格,之后叠加出需要的区域,后者是把栅格矢量化之后做裁剪。前者快但是不准,后者慢一些但是准确。
一个官方ppt
我在自己的电脑和服务器上胡乱测试了一下,神奇的是因为两者有不同版本的postgis插件和postgresql版本,有些sql语句就不能运行,或者结果就不一样了。。。
但是这里有一点要注意,我试的时候切片切得过多,然后还加了constraints,在服务器上入库的时候入了几十张大影像,慢得简直怀疑人生,我直接睡觉去了(那个玩意儿本来就超卡,并不知道为什么)
所以说要适当地调整一下参数
最后是统计的部分,网上给出了很多统计函数,比如ST_SummaryStatsAgg,但是不同的Postgis就不通用(老的得用ST_SummaryStatsAgg),甚至还说我有拓扑错误。(消除拓扑错误之后仍然这样说)所以我最后也没有用函数,用的暴力直接计算。。。
网上搜Postgis的zonal statistics还是有一些教程,github好像还有魔改Postgis插件的超简单调用接口,这些就以后再说吧。。。
转载自:https://blog.csdn.net/Theropod/article/details/79584444