PostGIS教程十七:相等

目录

 

一、精确相等

二、空间相等

三、等边界


    在处理几何图形时确定相等可能很困难。PostGIS支持三种不同的函数,可以用来确定不同级别的相等,不过为了清晰起见,我们将使用下面的定义。为了说明这些函数,我们将使用以下多边形。

_images/polygon-table.png

    使用以下命令加载这些多边形:

CREATE TABLE polygons (id integer, name varchar, poly geometry);

INSERT INTO polygons VALUES
  (1, 'Polygon 1', 'POLYGON((-1 1.732,1 1.732,2 0,1 -1.732,
      -1 -1.732,-2 0,-1 1.732))'),
  (2, 'Polygon 2', 'POLYGON((-1 1.732,-2 0,-1 -1.732,1 -1.732,
      2 0,1 1.732,-1 1.732))'),
  (3, 'Polygon 3', 'POLYGON((1 -1.732,2 0,1 1.732,-1 1.732,
      -2 0,-1 -1.732,1 -1.732))'),
  (4, 'Polygon 4', 'POLYGON((-1 1.732,0 1.732, 1 1.732,1.5 0.866,
      2 0,1.5 -0.866,1 -1.732,0 -1.732,-1 -1.732,-1.5 -0.866,
      -2 0,-1.5 0.866,-1 1.732))'),
  (5, 'Polygon 5', 'POLYGON((-2 -1.732,2 -1.732,2 1.732,
      -2 1.732,-2 -1.732))');

 

一、精确相等

    精确相等是通过按顺序逐个比较两个几何图形的顶点来确定的,以确保它们在位置上是相同的。下面的例子说明了这种方法的有效性是如何受到限制的。

SELECT a.name, b.name, CASE WHEN ST_OrderingEquals(a.poly, b.poly)
    THEN 'Exactly Equal' ELSE 'Not Exactly Equal' end
  FROM polygons as a, polygons as b;

    在此示例中,多边形仅与自身相等,而不等于其他看似相等的多边形(如在多边形1到3的情况下)。对于多边形1、2和3,顶点处于相同的位置,但定义顺序不同。多边形4在六边形边上有共线(因此是冗余的)顶点,导致与多边形1不相等。

 

二、空间相等

    正如我们在上面看到的,精确的相等并没有考虑到几何图形的空间性质。有一个名为ST_Equals的函数,可用于测试几何图形的空间相等性或等价性。

SELECT a.name, b.name, CASE WHEN ST_Equals(a.poly, b.poly)
    THEN 'Spatially Equal' ELSE 'Not Equal' end
  FROM polygons as a, polygons as b;

    这些结果更符合我们对相等的直觉理解。多边形1到4被认为是相等的,因为它们包含相同的区域。请注意,无论是绘制多边形的方向、定义多边形的起点,还是使用的点的个数在这里都不重要。重要的是多边形包含相同的空间

 

三、等边界

    在最坏的情况下,需要精确相等来比较几何图形中的每个顶点以确定相等。这可能会比较慢,并且可能不适合数量大的几何图形。为了更快地进行比较,提供了等边界运算符 ‘ = ‘ 。这仅在边界框(矩形)上操作,确保几何图形占用相同的二维范围,但不一定占用相同的空间

SELECT a.name, b.name, CASE WHEN a.poly = b.poly
    THEN 'Equal Bounds' ELSE 'Non-equal Bounds' end
  FROM polygons as a, polygons as b;

    如你所见,我们所有在空间上相等的几何图形也有相等的边界框。不幸的是,在此测试中返回的多边形5也是相等的,因为它与其他几何图形共享相同的边界框。那这有什么用呢?虽然这将在稍后详细介绍,但简短的答案是,这允许使用空间索引,在连接或筛选数据时,可以将大量的比较集快速减少到更易于管理的块中

 

    附录:PostGIS官方教程汇总目录

转载自:https://blog.csdn.net/qq_35732147/article/details/87343551

You may also like...