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
関数は、ジオメトリ全体としての正しさはチェックせず、ジオメトリを構成する頂点座標を機械的に変換していると推察されます。