MySQLのSpatialでのPOLYGONの同一性

boiledorange73さんのこの記事を見て、むくむくと疑問が湧き上がったわけですよ。本題とは全然関係ないところで、単に「右回り左回り」というキーワードだけに反応して、妄想全開モードになっただけなのですが。
qiita.com

MySQLは 記述方法の違うポリゴンを同一と見なしてくれるのか

 点A、点B、点C、点D からなるポリゴンって、A-B-C-D-A とも、B-C-D-A-B とも、B-A-D-C-B ともあらわすことができますよね。感覚的にはこれらはすべて同じと見なして欲しいな、と思うのですが、実際にはどうなのだろう。というのが今回の疑問です。
 以降、だらだらと例示が続くので結論を先に書いちゃうと、ちゃんと同じと見なしてくれます。

同一性の確認方法

 MySQLには、ST_Equals() という同一性判定の関数があります。
POINT を例に見ると、以下のように、同一の点であれば「1」が、異なる点であれば「0」が返ってきます。

mysql> SELECT ST_Equals( ST_GeomFromText('POINT(1 1)'), 
    ->                   ST_GeomFromText('POINT(1 1)') ) res;
+------+
| res  |
+------+
|    1 |
+------+

mysql> SELECT ST_Equals( ST_GeomFromText('POINT(1 1)'), 
    ->                   ST_GeomFromText('POINT(1 2)') ) res;
+------+
| res  |
+------+
|    0 |
+------+

LINESTRINGの場合は

 同様に、LINESTRING の場合を見てみます。点Aから点BへのLINESTRINGは、A-B とも B-A とも表せますが、これらを同じ物と見なしてほしな、という実験です。

mysql> SELECT ST_Equals( ST_GeomFromText('LINESTRING(1 1, 1 2)'), 
    ->                   ST_GeomFromText('LINESTRING(1 1, 1 2)') ) res;
+------+
| res  |
+------+
|    1 |
+------+

mysql> SELECT ST_Equals( ST_GeomFromText('LINESTRING(1 1, 1 2)'), 
    ->                   ST_GeomFromText('LINESTRING(1 2, 1 1)') ) res;
+------+
| res  |
+------+
|    1 |
+------+

 はい。「1」が返ってきたので、MySQLはこれら2つの線を同じ物と認めてくれたことがわかりました。
なんかユルユルに、なんでも「1」を返してるんじゃないの?という疑問を消し去るために、明らかに違う2つの線で試してみます。

mysql> SELECT ST_Equals( ST_GeomFromText('LINESTRING(1 1, 1 2)'), 
    ->                   ST_GeomFromText('LINESTRING(1 1, 2 1)') ) res;
+------+
| res  |
+------+
|    0 |
+------+

 ええ、ちゃんと「違う線である」と判断してくれました。

いよいよ本丸のポリゴン

 ちょっとわかりにくいのですが、A(1,1)、B(1,2)、C(2,2)、D(2,1) としたときに、
最初のは、A-B-C-D-A どうしを比べたもの。
2番目のは、A-B-C-D-A と、B-C-D-A-B を比べたもの(記述上の起点が異なる)。
3番目のは、A-B-C-D-A と、D-C-B-A-D を比べたもの(記述上の起点が異なり更に逆回転)。
いずれも「1」(同一)と判定されました。

mysql> SELECT ST_Equals( ST_GeomFromText('POLYGON((1 1, 1 2, 2 2, 2 1, 1 1))'), 
    ->                   ST_GeomFromText('POLYGON((1 1, 1 2, 2 2, 2 1, 1 1))') ) res;
+------+
| res  |
+------+
|    1 |
+------+

mysql> SELECT ST_Equals( ST_GeomFromText('POLYGON((1 1, 1 2, 2 2, 2 1, 1 1))'), 
    ->                   ST_GeomFromText('POLYGON((1 2, 2 2, 2 1, 1 1, 1 2))') ) res;
+------+
| res  |
+------+
|    1 |
+------+

mysql> SELECT ST_Equals( ST_GeomFromText('POLYGON((1 1, 1 2, 2 2, 2 1, 1 1))'), 
    ->                   ST_GeomFromText('POLYGON((2 1, 2 2, 1 2, 1 1, 2 1))') ) res;
+------+
| res  |
+------+
|    1 |
+------+

まとめ

 非常にシンプルなサンプルですが、線の順序やポリゴンの回転方向などの記述方法の如何に依らず、MySQL の ST_Equals() は正しくその形の同一性を見て判断してくれることがわかりました。めでたしめでたし。