【问题标题】:Postgis allows to add invalid geometryPostgis 允许添加无效的几何图形
【发布时间】:2016-07-12 08:33:24
【问题描述】:

我有一个表 layer 和一个几何列 geom。这个几何列有这样的限制:

 CONSTRAINT enforce_dims_geom CHECK (st_ndims(geom) = 2),
 CONSTRAINT enforce_geotype_geom CHECK (geometrytype(geom) = 'POLYGON'::text),
 CONSTRAINT enforce_srid_geom CHECK (st_srid(geom) = 3857)

所以,如您所见,这个几何列没有什么特别之处。但有趣的是,它允许我在表格中添加不正确的几何图形:

insert into layer (geom) values (
    ST_GeomFromText('POLYGON((4831087.7172221 7576170.7140277,
      4829023.9174584 7556144.212617, 
      4834450.9464667 7556602.8347867, 
      4833533.7021273 7575329.9067165, 
      4831087.7172221 7576170.7140277),
     (4815647.4375453 7566616.0854925, 
      4817864.1113651 7574183.3512927, 
      4825049.1920219 7573342.5439816, 
      4821609.5257499 7567609.7668602, 
      4815647.4375453 7566616.0854925))', 3857)
);

问题是这不是一个带有“洞”的多边形。这是两个分开的不同多边形。这是为什么?为什么 Postgis 允许添加不正确的几何图形?

编辑

我用ST_IsValid 检查了这个几何图形,它是错误的。所以,这一切看起来都像是 Postgis 中的一个错误。

【问题讨论】:

  • 这是设计使然,而不是错误。存在无效的几何图形,必须以某种方式存储并且理想地固定。如果您不希望它们出现在表中,请添加检查约束(正如我在评论中看到的那样)。

标签: postgresql gis postgis


【解决方案1】:

您可以从任何闭合线创建多边形,例如

ST_GeomFromText('POLYGON((0 0, 0 1, 1 0, 1 1, 0 0))')

即使这不会生成有效的多边形。

st_isvalid() 函数中使用检查约束!

【讨论】:

  • 谢谢!一个小问题:这个约束在表模式中应该是什么样子? CONSTRAINT enforce_valid_geom CHECK (st_isvalid(geom)) 之类的东西?
猜你喜欢
  • 1970-01-01
  • 2021-05-04
  • 2020-03-21
  • 2019-08-23
  • 1970-01-01
  • 2014-02-14
  • 2018-08-30
  • 2014-11-09
  • 2020-01-24
相关资源
最近更新 更多