ST_Transform

定義

ST_Transform は、2 次元 ST_Geometry データを空間参照 ID(SRID)で指定された空間参照に変換します。

注意注意:

st_register_spatial_column 関数を使用して空間列を PostgreSQL データベースに登録した場合、登録時の SRID が sde_geometry_columns テーブルに書き込まれます。Oracle データベースの空間列に空間インデックスを作成した場合、空間インデックスの作成時の SRID が st_geometry_columns テーブルに書き込まれます。ST_Transform を使用して ST_Geometry データの SRID を変更しても、sde_geometry_columns または st_geometry_columns テーブルの SRID は更新されません。

PostgreSQL での ST_Transform の使用

PostgreSQL では、変換のために指定する変換先の空間参照が、ST_Geometry 列の変換元の空間参照と同じ地理座標系を持つ必要があります。

データが(ジオデータベースではなく)データベースに格納されている場合は、次の手順で ST_Geometry データの空間参照を変更します。

  1. テーブルのバックアップ コピーを作成します。
  2. テーブル上に 2 つ目の(変換先の)ST_Geometry 列を作成します。
  3. 新しい SRID を指定して、変換先の ST_Geometry 列を登録します。

    これによって、sde_geometry_columns システム テーブルにレコードを配置し、列の空間参照を指定します。

  4. ST_Transform を実行します。変換後のデータが変換先の ST_Geometry 列に出力されるように指定します。
  5. 最初の(変換元の)ST_Geometry 列の登録を解除します。

データがジオデータベースに格納されている場合は、ArcGIS ツールを使用してデータを新しいフィーチャクラスに再投影します。ジオデータベース フィーチャクラスで ST_Transform を実行すると、新しい SRID でジオデータベース システム テーブルを更新する機能が無視されます。

Oracle での ST_Transform の使用

Oracle では、同じ地理座標系または異なる地理座標系の空間参照間で変換できます。地理座標系が異なる場合、地理座標系変換が行われます。地理座標系変換は、2 つの地理座標系間で変換します。地理座標系変換は、NAD 1927 から NAD 1983 というように、特定の方向に定義されますが、ST_Transform 関数は変換元と変換先の座標系に関係なく、変換を正しく適用します。

地理座標系変換には、数式をベースとした方式と、ファイルベースの方式の 2 つのタイプがあります。数式をベースとした方式は、自己包含型で外部からの情報を必要としません。ファイルベースの方式は、オフセット値の計算にディスク上のファイルを使用します。通常、ファイルベースの方式の方が、数式をベースとした方式より正確です。ファイルベースの方式は、オーストラリア、カナダ、ドイツ、ニュージーランド、スペイン、米国で一般的に使用されています。ファイルは(カナダのものを除く)、ArcGIS for Desktop をインストールした場所にあります。また、さまざまな政府機関の地図作成部門からも直接入手できます。

Oracle でファイルベースの変換をサポートする場合、ファイルは Oracle サーバ上に、ArcGIS for Desktop のインストール ディレクトリの pedata フォルダと同じ相対フォルダ構造で配置する必要があります。

たとえば、ArcGIS for Desktop のインストール ディレクトリには、pedata という名前のフォルダがあります。このフォルダにはいくつかのサブフォルダがありますが、サポートされているファイルベースの方式を含む 3 つのフォルダは、harnnadconntv2 です。pedata フォルダとその内容を ArcGIS for Desktop のインストール ディレクトリから Oracle サーバへコピーするか、Oracle サーバに、サポートされているファイルベースの変換方式のサブディレクトリとファイルを含むディレクトリを作成します。ファイルが Oracle サーバに設定されたら、サーバ上で PEDATAHOME という名前のオペレーティング システム環境変数を設定します。PEDATAHOME 変数を、サブディレクトリとファイルが含まれているディレクトリの場所に設定します。たとえば、pedata フォルダを Microsoft Windows サーバの C:\pedata にコピーした場合、PEDATAHOME 環境変数は C:\pedata に設定します。

環境変数の設定方法については、お使いのオペレーティング システムのマニュアルをご参照ください。

PEDATAHOME を設定したら、ST_Transform 関数を使用する前に、新しい SQL セッションを開始する必要があります。ただし、サーバを再起動する必要はありません。

データが(ジオデータベースではなく)データベースに格納されていて、空間列に空間インデックスが定義されていない場合は、2 つ目の ST_Geometry 列を追加し、変換後のデータをそれに出力することができます。元の(ソース)ST_Geometry 列と変換先の ST_Geometry 列を両方ともテーブル内に保持することはできますが、ArcGIS で、ビューを使用するか、テーブルのクエリ レイヤ定義を変更して一度に表示できるのは 1 つの列のみです。

データが(ジオデータベースではなく)データベースに格納されていて、空間列に空間インデックスが定義されている場合は、元の ST_Geometry 列を保持することはできません。空間インデックスが ST_Geometry 列に定義されたら、SRID が st_geometry_columns メタデータ テーブルに書き込まれます。ST_Transform はそのテーブルを更新しません。

  1. テーブルのバックアップ コピーを作成します。
  2. テーブル上に 2 つ目の(変換先の)ST_Geometry 列を作成します。
  3. ST_Transform を実行します。変換後のデータが変換先の ST_Geometry 列に出力されるように指定します。
  4. 変換元の ST_Geometry 列から空間インデックスを削除します。
  5. 変換元の ST_Geometry 列を削除します。
  6. 変換先の ST_Geometry 列に空間インデックスを作成します。

データがジオデータベースに格納されている場合は、ArcGIS ツールを使用してデータを新しいフィーチャクラスに再投影します。ジオデータベース フィーチャクラスで ST_Transform を実行すると、新しい SRID でジオデータベース システム テーブルを更新する機能が無視されます。

SQLite での ST_Transform の使用

SQLite では、同じ地理座標系または異なる地理座標系の空間参照間で変換できます。地理座標系が異なる場合、地理座標系変換が行われます。地理座標系変換は、2 つの地理座標系間で変換します。地理座標系変換は、NAD 1927 から NAD 1983 というように、特定の方向に定義されますが、ST_Transform 関数は変換元と変換先の座標系に関係なく、変換を正しく適用します。

地理座標系変換には、数式をベースとした方式と、ファイルベースの方式の 2 つのタイプがあります。数式をベースとした方式は、自己包含型で外部からの情報を必要としません。ファイルベースの方式は、オフセット値の計算にディスク上のファイルを使用します。通常、ファイルベースの方式の方が、数式をベースとした方式より正確です。ファイルベースの方式は、オーストラリア、カナダ、ドイツ、ニュージーランド、スペイン、米国で一般的に使用されています。ファイルは(カナダのものを除く)、ArcGIS for Desktop をインストールした場所にあります。また、さまざまな政府機関の地図作成部門からも直接入手できます。

構文

変換元と変換先の空間参照が同じ地理座標系である場合

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)

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 列に配置します。

注意注意:

SRID 4326 と SRID 3857 は両方とも同じ測地基準系です。

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);

変換元と変換先の空間参照が同じ地理座標系でない場合のデータの変換(Oracle および SQLite のみ)

次の例では、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 州)で使用できます。

ヒントヒント:

サポートされている地理座標系変換のリストについては、次の技術資料とその関連リストをご参照ください。http://support.esri.com/en/knowledgebase/techarticles/detail/21327.

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))

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)
);

関連トピック

5/25/2014