空間参照系の概要

  • 79
    いいね
  • 0
    コメント

はじめに

ここまでで、しれっとSRIDという言葉を出してきました。

地理空間情報を扱うのに非常に重要なもので、PostGISを扱う以上は、つきあっていかなければらなないものですので、もうこの際書いておきます。

SRIDと空間参照系

SRIDは空間参照系(Spatial Reference System, SRS)の識別コードを示す整数値です。

空間参照系

地理空間データは地球上の「位置」を使用していますが、位置情報の利用目的に沿うように、何らかの座標値にする必要があります。空間参照系は、その座標値を定める方法の種別を指します。

空間参照系は「測地系」と「投影座標系」/「地理座標系」との組み合わせからなります。

測地系

「測地系」とは、地球上のある位置を緯度・経度(3次元の場合はさらに標高)で示すための基準をいいます。測地系は複数種類あり、測地系が違うと同じ位置でも緯度・経度が変わります。

投影座標系と地理座標系

投影座標系

緯度・経度は出てもこれで終わらないことが多々あります。

緯度・経度は地球の表面上に点を取りますが、地球の表面は曲面で、これに定規を当てて距離を測ることができません。定規を当てて距離を測るには、平面上に点を置かなければなりません。この平面上に点を置く処理を「投影」と言い、投影によってつくられる座標系を「投影座標系」と言います。

投影を施すと、必ず歪みが生じます。ただ、目的によって許容できる歪みの種類や度合いが違うので、許容する歪みになるよう投影法(投影のやり方)を選択すればなんとかなります(何にでも効く魔法の投影法はありません)。このため、投影法の種類は多くなります。中学校の社会科で学習したはずです、メルカトル図法とかモルワイデ図法とか正距方位図法とか。その他にもランベルト正角円錐図法とかミラー図法とか正距円筒図法とか横メルカトル図法とか多面体図法とか。

投影座標系は、投影法ごとに全く異なる座標系になります。どころか、同じ投影法であっても、投影法に付くパラメータ(たとえば原点位置)が異なると、全く異なる座標系になります。

同じ横メルカトルのはずなのに

後で出てきますが、UTMと呼ばれる投影座標系があります。世界を緯度6度ごとにゾーンを設定しています(よって60ゾーンあります)。投影法は横メルカトル図法ですが、ゾーンによって原点位置が異なり、互換性はありません。また、平面直角座標系は19系ありますが、これもやはり系によって原点位置が異なります。

さらには、平面直角座標系もUTMと同じ横メルカトルを使っていますが、パラメータのひとつである縮尺係数(投影計算後に定数で掛け算をしますがその定数)が異なります(平面直角は0.9999、UTMは0.9996)。

結構ややこしい話になるかと思います。ただこれはとりあえずは覚えるひつようはありません。投影座標系は種類が非常に豊富にならざるをえないことだけ、ここでは知っておいて下さい。

地理座標系

緯度・経度が出れば良く、投影する必要が無い場合がもあります。できればやりたくないものですし。この場合は、そのまま緯度・経度のまま置いておきますが、この座標系を「地理座標系」と言います。

SRID

上述しましたが、SRIDは空間参照系識別コードです。本来は複数のオーソリティの存在を想定して、"(オーソリティ):(整数コード)"とし、オーソリティ間のコード重複を回避するのですが、EPSGがオーソリティのコード体系で十分ですので、SRID=EPSGコードで、オーソリティは略する、と考えても問題ありません。

EPSGコードは、European Petroleum Survey Group (EPSG)が管理していましたが、EPSGはInternational Association of Oil and Gas Procuders (OGP)が吸収したため、現在はOGPが管理しています。

EPSGオフィシャルの空間参照系レジストリの検索サービスは http://www.epsg-registry.org/ にあります。

わが国でよく使われる空間参照系

わが国の陸域でよく使われる空間参照系

SRID 測地系 座標系
4612 JGD2000 地理座標系
2443から2461 JGD2000 平面直角座標系1系から19系まで
3097から3101 JGD2000 UTMゾーン51から55まで
6668 JGD2011 地理座標系
6669から6687 JGD2011 平面直角座標系1系から19系まで
6688から6692 JGD2011 UTMゾーン51から55まで
4301 Tokyo 地理座標系
30161から30179 Tokyo 平面直角座標系1系から19系まで
3092から3096 Tokyo UTMゾーン51から55まで
4326 WGS84 地理座標系
3857 WGS84 球面(半径6378137m)メルカトル図法
900913 WGS84 球面(半径6378137m)メルカトル図法

900913は非公式なもので、EPSGレジストリには登録されていません。

うち、次の3種は地図を扱うアプリケーションで、特によく使用されます。

SRID 測地系 座標系 目的
4326 WGS84 地理座標系 GPSで得られる位置
3857/900913 WGS84 球面(半径6378137m)メルカトル図法 Google Maps等各種ウェブ地図アプリケーション

海域では

海域では、測地系をWGS84とします。EPSG:3395のメルカトルは、EPSG:3857の球面メルカトルと違い、回転楕円体メルカトルです。

SRID 測地系 座標系
3395 WGS84 メルカトル
32651から32655 WGS84 UTM座標系ゾーン51から55まで

よく使われる測地系

繰り返しになりますが、測地系は、地球上のある位置を緯度・経度で示すための基準をいいます。

「わが国の陸域でよく使われる空間参照系」では、JGD2000, JGD2011, Tokyo, WGS84 が出てきました。

わが国の陸域においては、Tokyo (Tokyo Datum)が1918年から2002年まで、JGD2000が2002年から2011年まで使われていました。現在はJGD2011が使われています。
Tokyoは、まだ測地系が世界共通である必要がなかった時代の測地系です。最近になってGPSの普及等により世界共通の基準に基づく測地系が求められるようになり、JGD2000への切り替えが行われました。JGD2011は、2011年東北地方太平洋沖地震に伴う地殻変動が非常に大きかったため、切り替えられました。

WGS84は、米軍が策定した測地系です。GPSはWGS84をもとにしています。また、海域ではWGS84が標準的に使われています。世界共通の基準をもとにしていますが、計算コストを減らすために精度を落としています。

TokyoとJGD2000は、概ね400mのズレがあるので、変換が必要です。
JGD2000とJGD2011は、座標系としては数センチ程度のズレがある程度ですので、よほどの精度が求められない限りは、投影変換を行わなくても問題ありません。同じく、JGD2000/JGD2011とWGS84とのずれはセンチ以下ですので、やはり変換を行わなくても問題ありません。

まとめると、Tokyoだけ特殊、ということです。

JGD2011とJGD2000のズレ

JGD2011とJGD2000とに差はほとんど無いと述べましたが、実際はJGD2000に基づく地図とJGD2011に基づく地図とでは、東日本では、メートル単位のズレが生じます。これは、測地系変更によるズレではありません。2011年東北地方太平洋沖地震により、東北地方太平洋側を中心に、地面にある建物や道路や様々なものが動いたためです。大地震後の地理空間データに変換するには、国土地理院測地部による座標・標高補正パラメータを用います。

余談: 1918年より前について

陸地測量標条例制定時の1890年から1918年までの間の測地系(Tokyo 1890)の地理座標系は、EPSGレジストリに登録されています(EPSG:5132)が、WKTが実態(経度についてのみTokyo1890+10.405秒=Tokyo1918が成り立つズレが生じます)と異なっているので使えません。

よく使われる投影座標系

「日本でよく使われる空間参照系」では、地理座標系(緯度経度)と、投影座標系にあっては、平面直角座標系、UTM、メルカトルが出てきました。

「平面直角座標系」は、日本全体(離島含む)を19系に分割して、適用範囲をかなり狭くすることで、非常に精度高い投影ができるようにしています。投影法にガウス・クリューゲル図法(横メルカトル)を使っています。1:2500地形図等で使われます。それぞれの系は原点が違うため、系間の座標値について互換性はありません。http://www.gsi.go.jp/LAW/heimencho.html に根拠となる国交省告示が示されています。また、https://vldb.gsi.go.jp/sokuchi/patchjgd/download/Help/jpc/jpc.htm には、適用範囲を塗り分けた地図が用意されています。

「UTM」は、経度6度ごとに南北に長いゾーンを設定して、平面直角まではいかないけれども、適用範囲を限定することで、精度の高い投影ができるようにしています。投影法には、平面直角座標系と同じくガウス・クリューゲル図法を使っています。1:25000地形図等で使われます。それぞれのゾーンは原点が違うため、ゾーン間の座標値について互換性はありません。

「メルカトル図法」は、もともとは海図で使うために開発された投影法ですが、世界全図を長方形の紙にぴったり収まるようにできます(北極/南極付近は描けません)ので、世界地図に利用されています。

「球面メルカトル」は、地球を球と仮定してメルカトル法による投影を行うものを指しています。本来なら地球を回転楕円体面ととらえて位置を測ることにしています(測地系のパラメータのひとつとなっています)が、回転楕円体は非常に計算がやっかいなので、計算を簡略化するため、地球を球と仮定してメルカトルによる投影変換を行うことがあります。

SRIDをそろえる

SRIDが異なるジオメトリ同士で比較とか幾何演算とかを行おうとするには、SRIDを統一しなければなりません。そうしないと、エラーとされます。

エラーとされる例

次の例は、JGD2000地理座標系とWGS84球面メルカトルとを比較してエラーを出している例です。

db=# SELECT ST_Equals(
  ST_GeomFromText('POINT(135 35)', 4612),
  ST_GeomFromText('POINT(135 35)', 3857)
);
ERROR:  Operation on mixed SRID geometries
CONTEXT:  SQL function "st_equals" statement 1

上に示したふたつのポイントの位置は、まるきり異なります。
ST_GeomFromText('POINT(135 35)', 4612)は、兵庫県西脇市内です(「日本へそ公園」内)。ST_GeomFromText('POINT(135 35)', 3857)は、東経0度北緯0度の位置より東に135m、北に35m移動した位置で、ギニア湾上です。
このように、座標値が同じでも全く違う位置を示すことになります。

また、JGD2000とWGS84は相互にそのまま使用してもいいと述べましたが、PostGISではエラーになります。

db=# SELECT ST_Equals(
  ST_GeomFromText('POINT(135 35)', 4612),
  ST_GeomFromText('POINT(135 35)', 4326)
);
ERROR:  Operation on mixed SRID geometries
CONTEXT:  SQL function "st_equals" statement 1

座標変換関数

座標変換を行うには、ST_Transfor(<ジオメトリ>,<変換先SRID>)を使います。ジオメトリにはSRIDが付いていることが前提です。

db=# SELECT ST_AsText(
  ST_Transform(
    ST_GeomFromText('POINT(135 35)', 3857),
    4326
  )
);
                    st_astext                    
-------------------------------------------------
 POINT(0.00121272563356135 0.000314410349434784)
(1 行)

SRID=3857での135 35は、SRID=4326(WGS84地理座標系)では、ほぼ東経0度北緯0度の位置であることが分かります。

日本のへそ公園内のふたつの「へそ」

先ほどJGD2000 東経135度北緯35度が「日本へそ公園内」と言いました。「日本へそ公園」は東経135度北緯35度の位置にちなんだものと推察できますが、これはTokyoなのかJGDなのか迷うところです。

確かめてみましょう。

Google Mapsは(たぶん)WGS84だろうから、JGDの座標値は変換なしで使うことにします。

http://maps.google.co.jp/maps?q=35,135&hl=ja&t=h&ll=35,135&z=19

なにかモニュメントが建っているのが確認できるかと思います。

では、Tokyo地理座標系からJGD2000地理座標系に変換してみましょう。ST_Transfor(<ジオメトリ>,<変換先SRID>)となります。

db=# SELECT ST_AsText(
  ST_Transform(ST_GeomFromText('POINT(135 35)', 4301), 4612)
);
                st_astext                 
------------------------------------------
 POINT(134.997219145261 35.0032257879514)
(1 行)

これは先ほどの座標値とは異なるのが分かると思います(北西に400m強ズレています)。

http://maps.google.co.jp/maps?q=35.0032257879514,134.997219145261&hl=ja&t=h&ll=35.0032257879514,134.997219145261&z=19

こちらにも、記念碑が立っているであろうことが分かると思います。

SRIDを設定するだけの例

JGD2000とWGS84との変換では、SRIDの変更だけを行います。ST_SetSRID(<ジオメトリ>,<変換先SRID>)となりますが、SRIDの変更だけを行い、座標値は変更させません。

db=# SELECT ST_Equals(
  ST_GeomFromText('POINT(135 35)', 4612),
  ST_SetSRID(ST_GeomFromText('POINT(135 35)', 4326), 4612)
);
 st_equals 
-----------
 t
(1 行)

JGD2000地理座標系からTokyo地理座標系への変換等ではSetSRIDを使いません。使ってよいのは、JGD2000地理座標系のデータだと思い込んでいたら実はTokyo地理座標系だったでござる、といった場合に限られます。

ただ、ST_SetSRIDが使えることが確実なら、ST_Transformを使わないようにするべきです。投影変換は三角関数を多用するので、SRIDを変更するだけの方がずっと計算コストが少なくなります。

おわりに

空間参照系は、地球上の位置から何らかの座標値を計算するための手法の種別であること、その種別は多数あること、わが国で使われるものに限定してもそれなりにあることを述べました。

また、SRIDが異なるジオメトリ同士を比較したり幾何演算を行おうとする場合には、SRIDを一方にあわせなければならないことを述べ、さらに、実際にあわせる方法を示しました。

ジオメトリが参照している空間参照系については、常に注意を払う必要があります。ただ、PostGISではSRIDについて制限を付けることができるので、混同しにくくなっていると思いますし、座標変換はPostGIS関数で処理してくれるので心配ありません。また、SRIDは数字なので覚えにくいかもしれませんが、覚えなくともウェブを漁ればどうにかなります。あまり深刻に考えずに、空間参照系と付き合っていきましょう。