# [postgis-users] How to tell if 2 geometries are spatially equal

Martin Davis mbdavis at refractions.net
Fri May 30 16:54:27 PDT 2008

```Will ST_equals do what you want?  It reports whether two geometries are
topologically equal.

(So for example, ST_equals('LINESTRING(0 0, 10 10)','LINESTRING(0 0, 5
5, 10 10)') is true)

Obe, Regina wrote:
> I recall this having come up before.  I always thought that ~= would
> tell me if 2 geometries are spatially equal but it doesn't seem to.
>
> The only way I can figure to determine spatial equality is if
>
> ST_Within(A,B)  And  ST_Within(B,A)  (or ST_Difference(A,B) AND
> ST_Difference(B,A) both return an empty geometry collection)
>
> --So case in point
>
> SELECT geom1 ~= geom2 as what, ST_Within(geom1, geom2) AND
> ST_Within(geom2, geom1) As spatial_equal,
> 	ST_AsText(ST_Difference(geom1, geom2)) as diffgeom12,
> ST_AsText(ST_Difference(geom2, geom1)) as diffgeom21
> FROM (SELECT 'LINESTRING(1 1, 1 2, 1 3)'::geometry As geom1,
> 	'LINESTRING(1 1, 1 3)'::geometry As geom2) As foo
>
> Results:
>
>  what | spatial_equal |        diffgeom12        |        diffgeom21
> ------+---------------+--------------------------+----------------------
> ----
>  f    | t             | GEOMETRYCOLLECTION EMPTY | GEOMETRYCOLLECTION
> EMPTY
>
>
> Is there a function / operator that does that (also what does geom1 =
> geom2 compare - is it just bounding boxes or is that the spatially equal
> operator I am looking for?)
>
> Thanks,
> Regina
>
> -----------------------------------------
> The substance of this message, including any attachments, may be
> confidential, legally privileged and/or exempt from disclosure
> pursuant to Massachusetts law. It is intended
> contact the sender and delete the material from any computer.
>
> _______________________________________________
> postgis-users mailing list
> postgis-users at postgis.refractions.net
> http://postgis.refractions.net/mailman/listinfo/postgis-users
>
>

--
Martin Davis
Senior Technical Architect
Refractions Research, Inc.
(250) 383-3022

```