我正在使用 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 (...);
在某些情况下,可以通过将字段提升为具有适当运算符的其他类型来完成此类操作。然而,据我所知,这种情况不存在这样的类型。
需要明确的是,它最终不一定是排除约束 - 如果您有其他想法可以满足我的需求,我很高兴听到!
constraint trigger
,您可以对您的值进行任意检查 - 在您的情况下,如果它们st_intersect()
表中的任何内容,请拒绝它们。确保在列上设置 GiST 索引。
不幸的是,排除约束的想法虽然直观上很简单,但您无法轻松配置或添加。所有 PostGIS 布尔运算符都使用边界框,并且没有用于 full
ST_Intersects()
的运算符。每个运算符都有一个相应的函数,但并非所有函数都定义了等效的运算符。由于 R-Tree-over-GiST 索引,所有可以加速的函数实际上只需在索引支持的实际调用中添加一个 bbox 运算符,并使用它来预过滤行,然后对剩余的内容执行主要操作.
operator
,而不是直接使用 function
。此外,该运算符必须属于索引支持的 operator class
,而索引又必须受到排除约束的支持。您基本上必须将 st_intersects()
包装在一个运算符中,并将其添加到 GiST 支持的操作类中,这并不是很简单。constraint trigger
在一分钟内设置的工作。