WKTでPOLYGON
を作ったときに、うっかり始点と終点を一致させず、経路を閉じ忘れることがあります。
SELECT
IsValid(g) AS IsValid,
IsValidReason(g) As IsValidReason
FROM (
SELECT
GeomFromText(
'POLYGON((0 0, 0 1, 1 1, 1 0))',
4326
) AS g
)
;
-- 0, Invalid: Unclosed Rings were detected
MakeValid
はこういった不正なジオメトリを、形を崩さずに正しいジオメトリに直そうとしてくれます。
SELECT
AsText(g2) AS geom_text,
IsValid(g2) AS IsValid
FROM (
SELECT
MakeValid(g) AS g2
FROM
(
SELECT
GeomFromText(
'POLYGON((0 0, 0 1, 1 1, 1 0))',
4326
) AS g
)
)
;
-- POLYGON((0 0, 0 1, 1 1, 1 0, 0 0)), 1
また、POLYGON
で与えた頂点が描く軌跡は、交わってはいけません。交わってしまう状態を自己交差 (self-intersection) といいます。
SELECT
IsValid(g) AS IsValid,
IsValidReason(g) AS IsValidReason
FROM (
SELECT
GeomFromText(
'POLYGON((0 0, 0 1, 2 1, 2 2, 1 2, 1 0, 0 0))',
4326
) AS g
)
;
-- 0, Self-intersection[1 1]
この場合、座標 (1, 1) で自己交差がおきています。
このようなPOLYGON
もMakeValid
で正常化できます。
SELECT
AsText(g2) AS geom_text,
IsValid(g2) AS IsValid
FROM (
SELECT
MakeValid(g) AS g2
FROM (
SELECT
GeomFromText(
'POLYGON((0 0, 0 1, 2 1, 2 2, 1 2, 1 0, 0 0))',
4326
) AS g
)
)
;
-- MULTIPOLYGON(((0 0, 0 1, 1 1, 1 0, 0 0)), ((1 1, 1 2, 2 2, 2 1, 1 1))), 1
自己交差が起こっていた座標 (1, 1) で2つのPOLYGON
に分けられ、MULTIPOLYGON
になりました。