LoginSignup
0
0

More than 5 years have passed since last update.

【SpatiaLite】不正なジオメトリを正しくするMakeValid

Posted at

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) で自己交差がおきています。
このようなPOLYGONMakeValidで正常化できます。

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になりました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0