是否可以在 PostGIS 中使用 `st_intersects` 来设置排除约束?

问题描述 投票:0回答:1

我正在使用 PostGIS 来存储地理多边形:

create table Polygons(id primary key, position geography);

如果有人试图创建两个多边形彼此重叠的情况,我希望 DBMS 抛出错误。

到目前为止,我尝试通过排除约束来做到这一点:

alter table polygons
add constraint polygons_overlapping
exclude using gist (
    position with &&
) where (...);

但是,

&&
仅检查轴对齐的边界框是否相交。我希望有相同的排除约束,但使用
st_intersects
,因为它使用实际几何形状进行相交检查。

所以,类似:

alter table polygons
add constraint polygons_overlapping
exclude using gist (
    position with st_intersects
) where (...);

在某些情况下,可以通过将字段提升为具有适当运算符的其他类型来完成此类操作。然而,据我所知,这种情况不存在这样的类型。

需要明确的是,它最终不一定是排除约束 - 如果您有其他想法可以满足我的需求,我很高兴听到!

postgresql postgis exclusion-constraint
1个回答
0
投票

使用

constraint trigger
,您可以对您的值进行任意检查 - 在您的情况下,如果它们
st_intersect()
表中的任何内容,请拒绝它们。确保在列上设置 GiST 索引。

不幸的是,排除约束的想法虽然直观上很简单,但您无法轻松配置或添加。所有 PostGIS 布尔运算符都使用边界框,并且没有用于 full

ST_Intersects()
的运算符。每个运算符都有一个相应的函数,但并非所有函数都定义了等效的运算符。由于 R-Tree-over-GiST 索引,所有可以加速的函数实际上只需在索引支持的实际调用中添加一个 bbox 运算符,并使用它来预过滤行,然后对剩余的内容执行主要操作.

您需要在排除约束定义中指定的比较必须使用

operator
,而不是直接使用
function
。此外,该运算符必须属于索引支持的
operator class
,而索引又必须受到排除约束的支持。您基本上必须将
st_intersects()
包装在一个运算符中,并将其添加到 GiST 支持的操作类中,这并不是很简单。
38.16。将扩展连接到索引可以让您了解需要覆盖多少内容才能说服排除约束来完成您可以使用
constraint trigger
在一分钟内设置的工作。

© www.soinside.com 2019 - 2024. All rights reserved.