目次
intersectとcrossは,両方とも日本語では「交差」と言われます.違いを明確にするために,インタセクト(動詞)またはインタセクション(名詞),クロス(動詞/名詞)と表現しています.
インタセクト(intersect)は「共有部分を持つ」もので,次元等は関係ありません.
クロス(cross)は,「共通部分を持ち,共通部分の次元は引数ジオメトリの最大次元より低い」ものです.なお,ここで言う次元は,面,線,点の区別です.
たとえば,面/面のクロスは線または点です.共通部分が面の場合は,クロスしているとは言いません.
また,線/線のクロスは必ず点です.共通部分が線の場合は,クロスしているとは言いません.
しばしば「マサチューセッツ州」の空間参照系が出てきますが,わが国では使われません.わが国でよく使われる空間参照系および若干の説明を以下に記載します.
わが国では,次の空間参照系がよく使われます.
EPSGコード | 名称等 |
---|---|
4326 | WGS84 経度緯度 |
4612 | 世界測地系 経度緯度 |
2443-2461 | 世界測地系 平面直角座標系(I系-XIX系) |
3097-3101 | 世界測地系 UTM(ゾーン51-55) |
4301 | 日本測地系 経度緯度 |
30161-30179 | 日本測地系 平面直角座標系(I系-XIX系) |
3092-3096 | 日本測地系 UTM(ゾーン51-55) |
日本測地系は2002年3月31日まで使用されていたものです.世界測地系は現在使用されているものです.WGS84は米軍がGPS用に管理している測地系です.
世界測地系とWGS84とはあまり差がなく,メートル単位の誤差を許容する場合には,そのまま使用しても差し支えない程度です.
世界測地系と日本測地系は,投影変換を要します.
UTMは,1万分の1 から 20万分の1 の地形図に用いられます.ゾーンは地球全体を経度6度ごとにゾーンを定めています.よってゾーン番号は経度で決まります.ゾーン番号と経度範囲の関係は次の通りです.
ゾーン番号 | 経度範囲 |
---|---|
51 | 東経120度 から 東経126度 |
52 | 東経126度 から 東経132度 |
53 | 東経132度 から 東経138度 |
54 | 東経138度 から 東経144度 |
55 | 東経144度 から 東経150度 |
ゾーンをまたぐ場合は,通常は,より広くインタセクトしている方のゾーンを用います.
平面直角座標系は,1万分の1 よりも大縮尺(詳細)の地図に用いられます.国内陸域を19個の系に分けています.概ね1つの系に対して複数の都府県が対応し,都府県が複数の系に分かれることは少ないですが,離島部を持つ都県は複数の系をまたぎますし,北海道は3つの系に分かれています.
詳細については平面直角座標系(平成14年国土交通省告示第9号)(国土地理院サイト)をご覧ください.
また,地図関連情報ガジェット(Finds.jp)にて,系番号を簡易的に確認できます.
日本測地系と他の測地系を一緒に扱う必要がある場合には,日本測地系に関連する投影変換パラメータに問題があるので,注意が必要です.
日本測地系からWGS84や世界測地系等に変換するに際には,準拠回転楕円体情報のほか,中心位置のシフトや回転等のパラメータを渡す必要があります.Proj.4のパラメータファイルには,シフトや回転等については指定されていません.
PostGISを含む,Proj.4をもとにして作成されているソフトウェアは,基本的にこの問題の影響を受けます.また,PostGISのspatial_ref_sys
テーブルは,Proj.4の設定ファイルを基にしています.
ご注意: PostGISで投影変換を行う場合には,空間データベースにあるspatial_ref_sysを更新しなければなりません.
# Tokyo <4301> +proj=longlat +ellps=bessel +no_defs <>
なお,+no_defs
は,デフォルトファイルを読み込まないことを指示しています.このエントリの記述通りに動作することを保障するために必要です.
<>
(終端文字列)より前に,たとえば,+towgs84=-146.336,506.832,680.254,0,0,0,0
を挿入します.
次のようになります.
![]() | |
パラメータには,いくつかのバリエーションがあります. |
# Tokyo <4301> +proj=longlat +ellps=bessel +towgs84=-146.336,506.832,680.254,0,0,0,0 +no_defs <>
4301のほか,30161-30179, 3092-3096についても同じように改訂することで,数メートル程度の誤差に収まるようになります.ただし,なお誤差を含みますので,十分にご注意ください.
spatial_ref_sysの中身を見てみましょう.
db=# select * from spatial_ref_sys where srid=4301; srid | auth_name | auth_srid | srtext | proj4text ------+-----------+-----------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------- 4301 | EPSG | 4301 | GEOGCS["Tokyo",DATUM["Tokyo",SPHEROID["Bessel 1841",6377397.155,299.1528128,AUTHORITY["EPSG","7004"]],AUTHORITY["EPSG","6301"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4301"]] | +proj=longlat +ellps=bessel +no_defs (1 row)
このうち,問題になるのは,proj4textカラムです.+proj=longlat +ellps=bessel +no_defs
となっていて,Proj.4と同じくtowgs84パラメータを持っていません.このままで実行すると,経度緯度が変化しません.
select ST_AsEWKT(ST_Transform('SRID=4612;POINT(135 35)'::geometry,4301)); st_asewkt ------------------------- SRID=4301;POINT(135 35) (1 row)
proj4textを更新すると,変換結果が変わります.
db=# UPDATE spatial_ref_sys SET proj4text='+proj=longlat +ellps=bessel +towgs84=-146.336,506.832,680.254,0,0,0,0 +no_defs' WHERE srid=4301; UPDATE 1 db=# select ST_AsEWKT(ST_Transform('SRID=4612;POINT(135 35)'::geometry,4301)); st_asewkt ---------------------------------------------------- SRID=4301;POINT(135.002792603664 34.9968021008188) (1 row)
![]() | |
パラメータには,いくつかのバリエーションがあります. |
コンフィギュレーション時にlibiconvを使用するようにした場合には,shp2pgsqlコマンドで-Wオプションを使用できるようになります.このオプションよって,SQLデータに変換する際に,文字コード変換を併せて行うことができます(「 ローダを使う 」をご覧ください).
国内の地理空間データでは,伝統的にShift JIS系の文字セットがよく使われています.ただし,Shift JISそのものでは,地名に使用される文字で対応し切れず,適正なSQLが出力されないことがあります.
実際には,Shift JISをもとにして独自文字を持つ"cp932"が主に使われています.cp932とShift JISとは,iconvでは異なるものとされています.iconvコマンドがインストールされているなら,次のように文字コード一覧を表示させてみて下さい.
% iconv --list ... MS_KANJI SHIFT-JIS SHIFT_JIS SJIS CSSHIFTJIS CP932 ...
shp2pgsqlは,たとえば次のように使用します.
% shp2pgsql -W cp932 -D -i -I foo.shp tablename > foo.sql