定義
ST_Transform タスクは、2 次元 ST_Geometry データを入力として、指定した空間参照 ID (SRID) で指定された空間参照に変換した値を返します。
地理座標系が異なる場合、ST_Transform は地理座標系変換を実行します。地理座標系変換は、2 つの地理座標系間で変換します。地理座標系変換は、NAD 1927 から NAD 1983 というように、特定の方向に定義されますが、ST_Transform 関数は変換元と変換先の座標系に関係なく、変換を正しく適用します。
地理座標系変換には、数式をベースとした方式と、ファイルベースの方式の 2 つのタイプがあります。数式をベースとした方式は、自己包含型で外部からの情報を必要としません。ファイルベースの方式は、オフセット値の計算にディスク上のファイルを使用します。通常、ファイルベースの方式の方が、数式をベースとした方式より正確です。ファイルベースの方式は、オーストラリア、カナダ、ドイツ、ニュージーランド、スペイン、米国で一般的に使用されています。ファイルは (カナダのものを除く)、ArcGIS Desktop をインストールした場所にあります。また、さまざまな政府機関の地図作成部門からも直接入手できます。
ファイルベースの変換をサポートする場合、ファイルはデータベース サーバー上に、ArcGIS Desktop または ArcGIS Pro のインストール ディレクトリの pedata フォルダーと同じ相対フォルダー構造で配置する必要があります。
たとえば、pedata というフォルダーは、ArcMap のインストール ディレクトリと、ArcGIS Pro のインストール ディレクトリの Resources フォルダーにあります。pedata フォルダーにはいくつかのサブフォルダーがありますが、サポートされているファイルベースの方式を含む 3 つのフォルダーは、harn、nadcon、ntv2 です。pedata フォルダーとその内容を ArcGIS のインストール ディレクトリからデータベース サーバーへコピーするか、データベース サーバーに、サポートされているファイルベースの変換方式のサブディレクトリとファイルを含むディレクトリを作成します。ファイルがデータベース サーバーに配置されたら、同じサーバー上で PEDATAHOME という名前のオペレーティング システム環境変数を設定します。PEDATAHOME 変数を、サブディレクトリとファイルが含まれているディレクトリの場所に設定します。たとえば、pedata フォルダーを Microsoft Windows サーバーの C:\pedata にコピーした場合、PEDATAHOME 環境変数は C:\pedata に設定します。
環境変数の設定方法については、お使いのオペレーティング システムのマニュアルをご参照ください。
PEDATAHOME を設定したら、ST_Transform 関数を使用する前に、新しい SQL セッションを開始する必要があります。ただし、サーバーを再起動する必要はありません。
PostgreSQL での ST_Transform の使用
PostgreSQL では、同じ地理座標系または異なる地理座標系の空間参照間で変換できます。
データが (ジオデータベースではなく) データベースに格納されている場合、地理座標系が同じときは次の手順で ST_Geometry データの空間参照を変更します。
- テーブルのバックアップ コピーを作成します。
- テーブル上に 2 つ目の (変換先の) ST_Geometry 列を作成します。
- 新しい SRID を指定して、変換先の ST_Geometry 列を登録します。
これによって、sde_geometry_columns システム テーブルにレコードを配置し、列の空間参照を指定します。
- ST_Transform を実行します。変換後のデータが変換先の ST_Geometry 列に出力されるように指定します。
- 最初の (変換元の) ST_Geometry 列の登録を解除します。
データがジオデータベースに格納されている場合は、ArcGIS ツールを使用してデータを新しいフィーチャクラスに再投影します。ジオデータベース フィーチャクラスで ST_Transform を実行すると、新しい SRID でジオデータベース システム テーブルを更新する機能が無視されます。
Oracle での ST_Transform の使用
Oracle では、同じ地理座標系または異なる地理座標系の空間参照間で変換できます。
データが (ジオデータベースではなく) データベースに格納されていて、空間列に空間インデックスが定義されていない場合は、2 つ目の ST_Geometry 列を追加し、変換後のデータをそれに出力することができます。元の (ソース) ST_Geometry 列と変換先の ST_Geometry 列を両方ともテーブル内に保持することはできますが、ArcGIS で、ビューを使用するか、テーブルのクエリ レイヤー定義を変更して一度に表示できるのは 1 つの列のみです。
データが (ジオデータベースではなく) データベースに格納されていて、空間列に空間インデックスが定義されている場合は、元の ST_Geometry 列を保持することはできません。空間インデックスが ST_Geometry 列に定義されたら、SRID が st_geometry_columns メタデータ テーブルに書き込まれます。ST_Transform はそのテーブルを更新しません。
- テーブルのバックアップ コピーを作成します。
- テーブル上に 2 つ目の (変換先の) ST_Geometry 列を作成します。
- ST_Transform を実行します。変換後のデータが変換先の ST_Geometry 列に出力されるように指定します。
- 変換元の ST_Geometry 列から空間インデックスを削除します。
- 変換元の ST_Geometry 列を削除します。
- 変換先の ST_Geometry 列に空間インデックスを作成します。
データがジオデータベースに格納されている場合は、ArcGIS ツールを使用してデータを新しいフィーチャクラスに再投影します。ジオデータベース フィーチャクラスで ST_Transform を実行すると、新しい SRID でジオデータベース システム テーブルを更新する機能が無視されます。
SQLite での ST_Transform の使用
SQLite では、同じ地理座標系または異なる地理座標系の空間参照間で変換できます。
構文
変換元と変換先の空間参照が同じ地理座標系である場合
Oracle と PostgreSQL
sde.st_transform (geometry1 sde.st_geometry, srid integer)
SQLite
st_transform (geometry1 geometryblob, srid in32)
変換元と変換先の空間参照が同じ地理座標系ではない場合
Oracle
sde.st_transform (g1 sde.st_geometry, srid integer, geogtrans_id integer)
PostgreSQL
オプション 1: sde.st_transform (g1 sde.st_geometry, srid int)
オプション 2: sde.st_transform (g1 sde.st_geometry, srid int, [geogtrans_id int])
オプション 3: sde.st_transform (g1 sde.st_geometry, srid int, [extent double] [prime meridian double] [unit conversion factor double])
オプション 3 では、必要に応じて、カンマ区切りリストとして次の順序で座標の範囲を指定できます。左下の X 座標、左下の Y 座標、右上の X 座標、右上の Y 座標。範囲を指定しない場合、ST_Transform は、より大きく一般的な範囲を使用します。
範囲を指定する場合、本初子午線と単位変換係数パラメーターはオプションです。この情報は、指定する範囲値がグリニッジを通る本初子午線または度 (10 進) を使用しない場合のみ指定する必要があります。
SQLite
st_transform (geometry1 geometryblob, srid int32, geogtrans_id int32)
戻り値のタイプ
Oracle と PostgreSQL
ST_Geometry
SQLite
Geometryblob
例
変換元と変換先の空間参照が同じ地理座標系である場合のデータの変換
次の例では、ln1 と ln2 という 2 つのラインストリング列を持つ transform_test テーブルを作成します。SRID 4326 のラインを ln1 を挿入します。次に UPDATE ステートメントで ST_Transform 関数を使用して、ln1 のラインストリングを入力として、SRID 4326 に割り当てられた座標参照系から SRID 3857 に割り当てられた座標参照系に変換し、結果を ln2 列に配置します。
Oracle
CREATE TABLE transform_test (
ln1 sde.st_geometry,
ln2 sde.st_geometry);
INSERT INTO transform_test (ln1) VALUES (
sde.st_geometry ('linestring (10.01 40.03, 92.32 29.39)', 4326)
);
UPDATE transform_test
SET ln2 = sde.st_transform (ln1, 3857);
PostgreSQL
CREATE TABLE transform_test (
ln1 sde.st_geometry,
ln2 sde.st_geometry);
INSERT INTO transform_test (ln1) VALUES (
sde.st_geometry ('linestring (10.01 40.03, 92.32 29.39)', 4326)
);
UPDATE transform_test
SET ln2 = sde.st_transform (ln1, 3857);
SQLite
CREATE TABLE transform_test (id integer);
SELECT AddGeometryColumn(
NULL,
'transform_test',
'ln1',
4326,
'linestring',
'xy',
'null'
);
INSERT INTO transform_test (ln1) VALUES (
st_geometry ('linestring (10.01 40.03, 92.32 29.39)', 4326)
);
UPDATE transform_test
SET ln1 = st_transform (ln1, 3857);
変換元と変換先の空間参照の地理座標系が同じでない場合のデータの変換
次の例では、id 列と geometry 列を持つ n27 テーブルを作成します。SRID が 4267 のポイントを n27 テーブルに挿入します。4267 SRID は NAD 1927 地理座標系を使用します。
次に、n83 テーブルを作成し、ST_Transform 関数を使用して n27 テーブルから n83 テーブルにジオメトリを挿入しますが、SRID は 4269、地理座標変換 ID は 1241 です。SRID 4269 は NAD 1983 地理座標系を使用します。1241 は、NAD_1927_To_NAD_1983_NADCON 変換の有名な ID です。この変換はファイルベースで、米国 (アラスカ/ハワイを除く 48 州) で使用できます。
Oracle
--Create table.
CREATE TABLE n27 (
id integer,
geometry sde.st_geometry
);
--Insert point with SRID 4267.
INSERT INTO N27 (id, geometry) VALUES (
1,
sde.st_geometry ('point (-123.0 49.0)', 4267)
);
--Create the n83 table as the destination table of the transformation.
CREATE TABLE n83 (
id integer,
geometry sde.st_geometry
);
--Run the transformation.
INSERT INTO N83 (id, geometry)(
select c.id, sde.st_transform (c.geometry, 4269, 1241)
from N27 c
);
PEDATAHOME が正しく定義されていれば、SELECT ステートメントが n83 テーブルに対して実行され、以下が返されます。
SELECT id, sde.st_astext (geometry) description
FROM N83;
ID DESCRIPTION
1 | POINT((-123.00130569 48.999828199))
PostgreSQL
--Option 1
--Gets geographic transformation from ST_Geometry libraries.
--Does not require you to provide a GTid.
--Performs an equation-based transformation between two geographic coordinate systems
--with different datums. (SRID 4267/DATUM NAD27 to SRID 4269/DATUM NAD 83)
--Provide point to transform.
SELECT sde.ST_AsText(sde.ST_Transform(
sde.ST_Geometry('point (-155.7029 63.6096)',4267), 4269));
--Returns output in SRID 4269.
"POINT ( -155.70290000 63.60960000)"
--Option 2
--Example uses input point in SRID 3857(DATUM: WGS 1984)
--and geographic transformation ID (GTid) 1251.
--Transforms point to SRID 102008 (DATUM: NAD 83)
--Provide point to transform.
SELECT sde.ST_AsText(sde.ST_Transform(
sde.ST_Geometry('point (-13244252.9404 4224702.5198)', 3857), 102008, 1251));
--Returns output in SRID 102008.
"POINT (-1957193.14740000 -297059.19680000)"
SQLite
--Create source table.
CREATE TABLE n27 (id integer);
SELECT AddGeometryColumn(
NULL,
'n27',
'geometry',
4267,
'point',
'xy',
'null'
);
--Insert point with SRID 4267.
INSERT INTO n27 (id, geometry) VALUES (
1,
st_geometry ('point (-123.0 49.0)', 4267)
);
--Create the n83 table as the destination table of the transformation.
CREATE TABLE n83 (id integer);
SELECT AddGeometryColumn(
NULL,
'n83',
'geometry',
4269,
'point',
'xy',
'null'
);
--Run the transformation.
INSERT INTO n83 (id, geometry) VALUES (
1,
st_transform ((select geometry from n27 where id=1), 4269, 1241)
);