标签
PostgreSQL , PostGIS , st_split , ST_GeometryN , ST_NumGeometries , ST_XMax , ST_XMin , ST_YMax , ST_YMin , UDF , st_area , ST_MakeBox2D, 面积占比
背景
前面介绍了空间包含(st_contains, st_within)搜索降CPU的优化方法,将长条形(相对于BOUND BOX空间占比很小)的对象切分成多个空间对象,提升相对于bound box的空间占比,从而减少扫描范围,提升命中率。
《PostgreSQL 空间st_contains,st_within空间包含搜索优化 - 降IO和降CPU(bound box)》
这种优化方法的关键是SPLIT,PostGIS提供了一种split函数,但是只能支持一次切两片,本文提供一种方法,可以根据用户的需求进行自由切割。(输入被切割的目标对象,横向切割多少刀,纵向切割多少刀,面积占比高于多少时不切割。)
八星八箭有木有:
空间split,目的是降低无效面积,看看这幅无效面积有多大吧,吓不吓人?
空间切割示例
切割逻辑
1、输入被切割的目标对象,横向切割多少刀,纵向切割多少刀,面积占比高于多少时不切割。
2、计算目标对象面积。
2、获取目标对象的bound box边界。计算BOUND BOX面积。
3、判断是否需要切割。
求横向切割线
切割
4、求切割后的geometry coll有几个对象。