2014/07/25
PostGIS > EPSG の測地系データをインポート(1)
PostGIS > EPSG の測地系データをインポート(1)
たまに海外の GIS データを扱う時があって測地系・投影系などを ↓ で調べていたが、その頻度が増えそう。新しい国や地域のデータを使うたびに下記サイトを手動で検索するのは面倒で、データベースを使っているのに何か違う。
■ Spatial Reference
http://spatialreference.org/
で調べた結果、主要な測地系データセットである EPSG が PostgreSQL のデータとして配布されていることが分かった。PostgreSQL のデータということは PostGIS と統合できるはず。その作業メモの一回目。実行環境は 2014/04/17 を参照。ただし PostGIS は最新の 2.1.3。
EPSG については ↓ が詳しい。この中で検索サイト(下記二つ目の URL)が紹介されているが、実は EPSG の本家サイト(三つ目の URL)で登録者向けに Access や PostgreSQL など RDB 別のデータセットがあった。登録はメールアドレスがあれば誰でも可能。
■ 株式会社インフォマティクス : 空間情報クラブ vol.1 : EPSGコード
http://www.informatix-inc.com/top/club/gis_22.html
■ EPSG Geodetic Parameter Registry
http://www.epsg-registry.org/
■ OGP : EPSG home
http://www.epsg.org/
登録するとデータセットのページ ↓ に行ける。EPSG SQL scripts というのがデータ投入用のクエリファイル。その下にあるシェイプファイルは後日試す。
↓ PostgreSQL 用の ZIP には説明用 PDF と三つの SQL ファイルがある。ファイル名から判断して、テーブル作成、外部キー設定、そしてデータ本体の投入に分かれている模様。
↓ データ投入用に新しいデータベースを作り PostGIS をインストールした。EPSG データ自体は PostGIS 依存でないので、PostGIS インストールは後でも可能。
続いて三つの SQL ファイルを psql で実行しようと思ったが、どのファイルもコマンド途中で改行されておりエラーになった。psql の側で何か設定すればいいかもしれないが、いつもの pgAdmin のクエリツールにコピペして実行するのが手っ取り早いのでそうした。↓ まずテーブル定義用の EPSG_v8_5.mdb_Tables_PostgreSQL.sql の中身を貼り付けて実行したところ。
この後、外部キー設定ファイルの中身を実行したら、次のデータ投入時にエラーが出て失敗。先にデータ投入の EPSG_v8_5.mdb_Data_PostgreSQL.sql の中身を実行する。非 ASCII 文字があるようで、最初に Shift JIS で読み込んでコピペしたら失敗。そこで ↓ UTF-8 で開き直してクエリツールに貼り付けたら成功。
中身が多いので(ファイルサイズ 9.6 MB)クエリツールに貼り付けるとしばらく固まるが ↓ いずれ実行でき、8.5 秒かかって完了した。
↓ 最後に外部キー設定用のファイルの中身を貼り付けて実行。これで EPSG のデータセットをインポートできた。
↓ テーブルが 21 個つくられる。すべて epsg で始まる名前。それぞれの行数はさほど多くない。テーブルの主キー・外部キー設定が済んでいるので、別途インデクス等を追加する必要は特にない。一番下にある spatial_ref_sys は PostGIS の測地系テーブル。両者を統合して、必要な測地系コードをデータベース上で検索・設定できれば便利になる。
↓ 早速テスト。EPSG の地域別テーブル epsg_area の列 area_name を「ビルマ」で検索し、PostGIS の測地系コード(SRID)を外部結合して最左列に出したところ。「ミャンマー」で検索するともう少し多くの測地系が見つかった。
同じことを、これまでは ↓ のようにウェブで検索していた。
↓ もう一つテストで japan での検索結果。画像の下にさらに多くの測地系がある。
地域別テーブルには、各地域の経緯度範囲もある。これを PostGIS データに変換するか、データセット中のシェープファイルを追加インポートして、任意の経緯度座標・範囲から使える測地系等を検索するようにしたい。というわけで(2)へ続く。
■ Spatial Reference
http://spatialreference.org/
で調べた結果、主要な測地系データセットである EPSG が PostgreSQL のデータとして配布されていることが分かった。PostgreSQL のデータということは PostGIS と統合できるはず。その作業メモの一回目。実行環境は 2014/04/17 を参照。ただし PostGIS は最新の 2.1.3。
EPSG については ↓ が詳しい。この中で検索サイト(下記二つ目の URL)が紹介されているが、実は EPSG の本家サイト(三つ目の URL)で登録者向けに Access や PostgreSQL など RDB 別のデータセットがあった。登録はメールアドレスがあれば誰でも可能。
■ 株式会社インフォマティクス : 空間情報クラブ vol.1 : EPSGコード
http://www.informatix-inc.com/top/club/gis_22.html
■ EPSG Geodetic Parameter Registry
http://www.epsg-registry.org/
■ OGP : EPSG home
http://www.epsg.org/
登録するとデータセットのページ ↓ に行ける。EPSG SQL scripts というのがデータ投入用のクエリファイル。その下にあるシェイプファイルは後日試す。
↓ PostgreSQL 用の ZIP には説明用 PDF と三つの SQL ファイルがある。ファイル名から判断して、テーブル作成、外部キー設定、そしてデータ本体の投入に分かれている模様。
↓ データ投入用に新しいデータベースを作り PostGIS をインストールした。EPSG データ自体は PostGIS 依存でないので、PostGIS インストールは後でも可能。
続いて三つの SQL ファイルを psql で実行しようと思ったが、どのファイルもコマンド途中で改行されておりエラーになった。psql の側で何か設定すればいいかもしれないが、いつもの pgAdmin のクエリツールにコピペして実行するのが手っ取り早いのでそうした。↓ まずテーブル定義用の EPSG_v8_5.mdb_Tables_PostgreSQL.sql の中身を貼り付けて実行したところ。
この後、外部キー設定ファイルの中身を実行したら、次のデータ投入時にエラーが出て失敗。先にデータ投入の EPSG_v8_5.mdb_Data_PostgreSQL.sql の中身を実行する。非 ASCII 文字があるようで、最初に Shift JIS で読み込んでコピペしたら失敗。そこで ↓ UTF-8 で開き直してクエリツールに貼り付けたら成功。
中身が多いので(ファイルサイズ 9.6 MB)クエリツールに貼り付けるとしばらく固まるが ↓ いずれ実行でき、8.5 秒かかって完了した。
↓ 最後に外部キー設定用のファイルの中身を貼り付けて実行。これで EPSG のデータセットをインポートできた。
↓ テーブルが 21 個つくられる。すべて epsg で始まる名前。それぞれの行数はさほど多くない。テーブルの主キー・外部キー設定が済んでいるので、別途インデクス等を追加する必要は特にない。一番下にある spatial_ref_sys は PostGIS の測地系テーブル。両者を統合して、必要な測地系コードをデータベース上で検索・設定できれば便利になる。
↓ 早速テスト。EPSG の地域別テーブル epsg_area の列 area_name を「ビルマ」で検索し、PostGIS の測地系コード(SRID)を外部結合して最左列に出したところ。「ミャンマー」で検索するともう少し多くの測地系が見つかった。
SELECT t3.srid, t2.* FROM epsg_area t1
JOIN epsg_coordinatereferencesystem t2
ON t1.area_code = t2.area_of_use_code
LEFT JOIN spatial_ref_sys t3
ON t2.coord_ref_sys_code = t3.srid
-- PostGIS の SRID と結合
WHERE t1.area_name ILIKE '%burma%'
ORDER BY 1 ;
同じことを、これまでは ↓ のようにウェブで検索していた。
↓ もう一つテストで japan での検索結果。画像の下にさらに多くの測地系がある。
SELECT t2.* FROM epsg_area t1
JOIN epsg_coordinatereferencesystem t2
ON t1.area_code = t2.area_of_use_code
LEFT JOIN spatial_ref_sys t3
ON t2.coord_ref_sys_code = t3.srid
-- PostGIS の SRID と結合
WHERE t1.area_name ILIKE '%japan%'
ORDER BY 1 ;
地域別テーブルには、各地域の経緯度範囲もある。これを PostGIS データに変換するか、データセット中のシェープファイルを追加インポートして、任意の経緯度座標・範囲から使える測地系等を検索するようにしたい。というわけで(2)へ続く。