对矢量金字塔进行局部更新,更新范围由参数update_extent(Box2D格式)指定。主要用于,当原始矢量数据表进行了数据更新(插入、删除或修改)后,将更新发生的坐标系范围作为参数调用本函数,从而允许用户看到更新后的可视化结果。

语法

boolean ST_UpdatePyramid(cstring table, cstring geom_field, cstring id_field, BOX2D update_extent, cstring rules) ;

参数

参数名称 描述
table 矢量数据表的名称。
geom_field 矢量数据表中Geometry属性的列名。
id_field 矢量数据表中ID属性的列名。
update_extent 需要进行更新的EPSG格式坐标区域范围(Box2D格式),EPSG格式由参数rules指定,默认为4326。

例如:Box2D(ST_GeomFromText('LINESTRING(-120 -80, -100 -50)'))指定-120<经度<-100, -80<纬度<-50的更新范围。

rules JSON格式的更新参数值,参数包括updateBoxScale和sourceSRS。
  • 参数updateBoxScale会影响到更新自底向上最高传递到哪一层,如updateBoxScale=2,用户指定的更新区域的最大宽高值为100时,只会更新Level1的瓦片(假设全局范围是全球经纬度),因为Level为1的瓦片的最大宽高值除以100小于2,而Level为0的瓦片的最大宽高值除以100大于2。updateBoxScale默认值为10。
  • sourceSRS指定参数update_extent的EPSG格式,默认值为4326。
说明
updateBoxScale用于控制更新在精度和效率之间的取舍:
  • 使用较小的updateBoxScale时,需要更新的瓦片较少,但是会有更多较浅的瓦片不能体现出数据更新的结果。
  • 使用较大的updateBoxScale时,需要更新的瓦片较多,但是更新能够体现在更多瓦片上,比如updateBoxScale=100000,则一直向上更新到包括根结点(假设maxLevel=16)。

示例

DROP TABLE IF EXISTS test_update_line;
CREATE TABLE test_update_line(id int primary key, geom geometry(LineString, 4326));
INSERT INTO test_update_line(id, geom)
SELECT i,
    ST_GeomFromText(format('LINESTRING(%s,%s,%s,%s)',
                        (floor(i/100)*0.01+10), (floor(i%100)*0.01+10),
                        (floor(i/100+1)*0.01+10), (floor(i%100+1)*0.01+10)), 4326)
FROM generate_series(1, 10000) i;
CREATE INDEX ON test_update_line using gist(geom);
SELECT ST_BuildPyramid('test_update_line', 'geom', 'id', '{"parallel":16}');
st_buildpyramid
-----------------
t
(1 row)
INSERT INTO test_update_line(id, geom)
SELECT i,
    ST_GeomFromText(
    format('LINESTRING(%s,%s,%s,%s)',
          (floor(i/100)*0.01-10), (floor(i%100)*0.01-10),
          (floor(i/100+1)*0.01+10), (floor(i%100+1)*0.01+10)),
          4326)
  FROM generate_series(10001, 15000) i;
SELECT ST_UpdatePyramid('test_update_line', 'geom', 'id', Box2D(ST_GeomFromText('LINESTRING(-20 -20, 20 20)')), '{"updateBoxScale":10}';
st_updatepyramid
-----------------
t
(1 row)