ST_Equals

Definition

ST_Equals compares two ST_Geometries and returns 1 (Oracle) or t (PostgreSQL) if the geometries are identical; otherwise, it returns 0 (Oracle) or f (PostgreSQL).

Syntax

sde.st_equals (g1 sde.st_geometry, g2 sde.st_geometry)

Return type

Integer (Boolean)

Example

The city GIS technician suspects that some of the data in the bldgs table was duplicated. To alleviate his concern, he queries the table to determine whether any of the footprint multipolygons are equal.

The bldgs table was created and populated with the following statements. The bldg_id column uniquely identifies the buildings, and the footprint stores the building's geometry.

Oracle

CREATE TABLE bldgs (bldg_id integer unique,
footprint sde.st_geometry);

INSERT INTO BLDGS (bldg_id, footprint) VALUES (
1,
sde.st_polygon ('polygon ((0 0, 0 10, 10 10, 10 0, 0 0))', 0)
);

INSERT INTO BLDGS (bldg_id, footprint) VALUES (
2,
sde.st_polygon ('polygon ((20 0, 20 10, 30 10, 30 0, 20 0))', 0)
);

INSERT INTO BLDGS (bldg_id, footprint) VALUES (
3,
sde.st_polygon ('polygon ((40 0, 40 10, 50 10, 50 0, 40 0))', 0)
);

INSERT INTO BLDGS (bldg_id, footprint) VALUES (
4,
sde.st_polygon ('polygon ((0 0, 0 10, 10 10, 10 0, 0 0))', 0)
);

PostgreSQL

CREATE TABLE bldgs (bldg_id integer unique,
footprint st_geometry);

INSERT INTO bldgs (bldg_id, footprint) VALUES (
1,
st_polygon ('polygon ((0 0, 0 10, 10 10, 10 0, 0 0))', 0)
);

INSERT INTO bldgs (bldg_id, footprint) VALUES (
2,
st_polygon ('polygon ((20 0, 20 10, 30 10, 30 0, 20 0))', 0)
);

INSERT INTO bldgs (bldg_id, footprint) VALUES (
3,
st_polygon ('polygon ((40 0, 40 10, 50 10, 50 0, 40 0))', 0)
);

INSERT INTO bldgs (bldg_id, footprint) VALUES (
4,
st_polygon ('polygon ((0 0, 0 10, 10 10, 10 0, 0 0))', 0)
);

The bldgs table is spatially joined to itself by the equal predicate, which returns 1 whenever it finds two multipolygons that are equal. The b1.bldg_id<>b2.bldg_id condition eliminates the comparison of a geometry to itself.

Oracle

SELECT UNIQUE (b1.bldg_id), b2.bldg_id
FROM BLDGS b1, BLDGS b2
WHERE sde.st_equals (b1.footprint, b2.footprint) = 1
AND b1.bldg_id <> b2.bldg_id;

BLDG_ID   BLDG_ID

    4           1
    1           4

PostgreSQL

SELECT DISTINCT (b1.bldg_id), b2.bldg_id
FROM bldgs b1, bldgs b2
WHERE st_equals (b1.footprint, b2.footprint) = 't'
AND b1.bldg_id <> b2.bldg_id;

bldg_id   bldg_id

    1           4
    4           1

2/5/2013