0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?