特殊用途函数

这些函数很少会被用到,如果你的数据出现损坏情况,那么可能会用到这些函数。这些函数是用来解决一些麻烦的问题的,正常情况下,不会用到这些函数。

PostGIS_AddBBox

PostGIS_AddBBox — 给一个几何对象添加bounding box。

语法

postgis_addbbox ::=

参数

geomA

geometry类型。

返回值

返回值为geometry类型。

给一个几何对象添加bounding box。这会让查询更快,但是会增加几何对象的大小。

注解

边界框会自动添加到几何图形中,因此通常不需要这样做,除非生成的边界框以某种方式损坏,或者您的旧安装缺少边界框。然后你需要放下旧的和读过的。

示例

drop TABLE myspatial_table;
CREATE TABLE myspatial_table(gid serial, geom geometry);
INSERT INTO myspatial_table(geom) VALUES(ST_GeomFromText('LINESTRING(1 2, 3 4)',4326) );

select PostGIS_HasBBox(geom) from myspatial_table;
POSTGIS_HASBBOX(boolean)      |
------------------------------
false                         |
总数目:1
UPDATE myspatial_table SET geom =  PostGIS_AddBBox(geom) WHERE PostGIS_HasBBox(geom) = false;

select PostGIS_HasBBox(geom) from myspatial_table;
POSTGIS_HASBBOX(boolean)      |
------------------------------
true                          |
总数目:1

PostGIS_DropBBox

PostGIS_DropBBox — 删除一个geometry类型对象的bounding box 缓存。

语法

postgis_dropbbox ::=

参数

geomA

geometry类型。

返回值

返回值为geometry类型。

删除一个geometry类型对象的bounding box 缓存。这种操作会减小geometry类型对象的大小,但是会让查询变慢。该函数也用于丢弃一个损坏的bounding box。

所谓的损坏的bounding box是当函数ST_Intersects 以及其他关系查询中应该返回true 却被省略掉的几何对象。

注解

bounding box通常在查询中会被自动添加以便提高查询速度,因此这个函数通常不会被使用,除非因为未知原因bounding box被损坏了。在这种情况下,你需要丢弃旧的bounding box,并重新生成bounding box。

具体情况是当一个几何对象变更或者升级到没有导出及重新装载到新版本时候,原本正确的bounding box不会被重新计算。因此使用者可以手动使用如下方式重建bounding box或者dump 出数据,再reload。

示例

UPDATE myspatial_table SET geom =  PostGIS_DropBBox(geom) WHERE Not (Box2D(ST_AsBinary(geom)) = Box2D(geom));

PostGIS_HasBBox

PostGIS_HasBBox — 如果该几何对象的bounding box已被缓存,则返回TRUE,否则返回FALSE。

语法

postgis_hasbbox ::=

参数

geomA

geometry类型。

返回值

返回值为boolean类型。

如果该几何对象的bounding box已被缓存,则返回TRUE,否则返回FALSE,使用函数PostGIS_AddBBox和 PostGIS_DropBBox来控制缓存。

示例

SELECT geom FROM myspatial_table WHERE PostGIS_HasBBox(geom) = TRUE;
GEOM(GEOMETRY)      |
--------------------
0102000020E610000002|
000000000000000000F|
03F0000000000000040|
0000000000000840000|
0000000001040       |
总数目:1

drop TABLE myspatial_table;