LoginSignup
0
0

More than 5 years have passed since last update.

【SpatiaLite】Transformは閉じていないPOLYGONや自己交差のあるPOLYGONも変換できる

Posted at

SpatiaLiteでは、Transform関数で座標系を変換できます。

-- 点を変換
SELECT AsText(
    Transform(
        GeomFromText(
            'POINT(141.350 43.068)',    -- 札幌駅らへんの座標
            4326    -- WGS84
        ),
        32654       -- WGS84 / UTM zone 54N
    )
) AS utm_text
;
-- POINT(528496.455725 4768425.560759)

この関数では、以下のように閉じていない(不正な)POLYGONも座標変換できます。閉じられていないPOLYGONが座標系だけ変換されて返されます。

-- 閉じられていないPOLYGONを変換
SELECT
    IsValidReason(g.geom) AS valid_reason,
    AsText(
        Transform(
            g.geom, 
            32654   -- WGS84 / UTM zone 54N
        )
    ) AS utm_text
FROM
(
    SELECT
        GeomFromText(
            'POLYGON((141.350 43.068, 141.351 43.068, 141.351 43.069, 141.350 43.069))',    -- 閉じていないPOLYGON
            4326        -- WGS84
        ) AS geom
) AS g
;

-- valid_reason: Invalid: Unclosed Rings were detected
-- utm_text: POLYGON((528496.455725 4768425.560759, 528577.87424 4768425.900877, 528577.409675 4768536.950655, 528495.992483 4768536.610536))

自己交差のあるPOLYGONも同様です。変換後のジオメトリも自己交差しています。

-- 自己交差のあるPOLYGON
SELECT
    IsValidReason(g.geom) AS valid_reason,
    AsText(
        Transform(
            g.geom,
            32654 -- WGS84 / UTM zone 54N
        )
    ) AS utm_text
FROM
(
    SELECT
        GeomFromText(
            'POLYGON((141.350 43.068, 141.350 43.069, 141.352 43.069, 141.352 43.070, 141.351 43.070, 141.351 43.068, 141.350 43.068))',    -- 自己交差のあるPOLYGON
            4326        -- WGS84
        ) AS geom
) AS g
;

-- valid_reason: Self-intersection[141.351 43.069]
-- utm_text: POLYGON((528496.455725 4768425.560759, 528495.992483 4768536.610536, 528658.826867 4768537.291744, 528658.360969 4768648.341542, 528576.9451 4768648.000452, 528577.87424 4768425.900877, 528496.455725 4768425.560759))

このことから、Transform関数は、ジオメトリ全体としての正しさはチェックせず、ジオメトリを構成する頂点座標を機械的に変換していると推察されます。

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