ST_UpdatePyramid

对矢量金字塔进行局部更新,更新范围由参数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;

-- 为geom列创建索引
CREATE INDEX ON test_update_line using gist(geom);

-- 创建矢量金字塔,加速数据显示,如果同时安装了Raster插件,则需要给各参数添加::cstring避免冲突。
SELECT ST_BuildPyramid('test_update_line', 'geom', 'id', '{"parallel":16}');

-- 插入测试数据
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}';