はじめに
GIS等を扱っていると、SRID、SRS、CRS、空間参照系という言葉が時々出てくると思います。本書でもしれっと出しています。
地理空間情報を扱うのに非常に重要なもので、PostGISを扱う以上は、つきあっていかなければらなないものですので、ざーっと書いておきます。
SRIDとSRS=CRS=空間参照系
SRIDは多数あるSRS (Spatial Reference System)の一つ一つを識別するコードです。
CRS (Coordinate Reference System)とSRSは同じと考えてください。また、空間参照系はCRSの訳語です。以上より、CRSとSRSと空間参照系は同じで、SRIDはSRS=CRS=空間参照系を識別するためのコードである、と言えます。
空間参照系は測地系と投影法とパラメータからなる
地理空間データは地球上の「位置」を使用していますが、位置情報の利用目的に沿うように、何らかの座標値にする必要があります。空間参照系は、その座標値を定める方法の種別を指します。
空間参照系は「測地系」と「投影座標系」/「地理座標系」との組み合わせからなります。さらに、「投影座標系」は「投影法」と「パラメータ」との組み合わせからなります。
このため空間参照系は数が多いことになります。たとえば、PostGIS 3.0ではspatial_ref_sys
にデフォルトで8500件登録されています。
測地系
「測地系」とは、地球上のある位置を緯度・経度(3次元の場合はさらに標高)で示すための基準をいいます。測地系は複数種類あり、測地系が違うと同じ位置でも緯度・経度が変わります。
投影座標系と地理座標系
投影座標系
緯度・経度は出てもこれで終わらないことが多々あります。
緯度・経度は地球の表面上に点を取りますが、地球の表面は曲面です。しかし、通常、私たちが使う地図は、紙や画面といった平面に描かれています。このため、緯度・経度で示されている点から、平面上に点を置き線を引いた地図を作ることになります。
この、平面上に点を置く処理を「投影」と言い、投影によってつくられる座標系を「投影座標系」と言います。
投影を施すと、必ず歪みが生じます。ただ、目的によって許容できる歪みの種類や度合いが違うので、許容する歪みになるよう投影法(投影のやり方)を選択すればなんとかなります(何にでも効く魔法の投影法はありません)。このため、投影法の種類は多くなります。
中学校の社会科で学習したはずです、メルカトル図法とかモルワイデ図法とか正距方位図法とか。その他にもランベルト正角円錐図法とかミラー図法とか正距円筒図法とか横メルカトル図法とか多面体図法とか…。
投影法とパラメータ
投影座標系は、投影法ごとに全く異なる座標系になります。それどころか、同じ投影法であっても、投影法に付くパラメータが異なると、全く異なる座標系になります。
同じ横メルカトルのはずなのに
後で出てきますが、UTMと呼ばれる投影座標系があります。世界を緯度6度ごとにゾーンを設定しています(よって60ゾーンあります)。投影法は横メルカトル図法ですが、ゾーンによって原点位置が異なり、互換性はありません。また、平面直角座標系は19系ありますが、これもやはり系によって原点位置が異なります。
さらには、平面直角座標系もUTMと同じ横メルカトルを使っていますが、パラメータのひとつである、原点における縮尺係数(投影計算後に定数で全体に対して掛け算をしますがその定数)が異なります(平面直角は0.9999、UTMは0.9996)。
同じ横メルカトルなのに、原点位置も原点における縮尺係数も違うので、平面直角座標系19系とUTMゾーン51からゾーン55までの5ゾーンの合計24種類の空間参照系には、直接の互換性はありません。いちど経度緯度に戻して別の投影法を適用する二段階で変換します。
結構ややこしい話になるかと思います。ただし、この節では、投影法と座標系を必死になって覚える必要はありません。投影は直交座標系に変換したいから行うものであることと、投影座標系は種類が非常に豊富にならざるをえないこととを、ここでは知っておいて下さい。
参考: 原点における縮尺係数とは
縮尺係数は、原点を通る子午線からの東西方向の距離で変わります。平面直角では、原点で0.9999ですが、90kmほど東/西に離れると1.0000、130kmほど離れると1.0001に、それぞれなります。
原点から離れるほど、より投影後の図形がより大きくなるため、どうしても縮尺係数が大きくなっています。
もう少し言うと、投影面は原点で接するようにしていて、原点から離れるほど拡大表示されていくためです。
直感的に理解するには、メルカトル図法を思い出して頂くといいと思います。メルカトル図法だと、原点を通る卯酉線、すなわち赤道で接していて、原点から離れるのは高緯度になることと同じで、高緯度ほど地物が大きくなっています。
横メルカトル図法は、投影面の筒を縦でなく横にしているので、原点を通る子午線から離れるほど地物が大きくなっています。
地理座標系
緯度・経度が出れば良く、投影する必要が無い場合もあります。その際は、そのまま緯度・経度の座標系で保存します。この座標系を「地理座標系」と言います。
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の座標値は変換なしで使うことにします。
なにかモニュメントが建っているのが確認できるかと思います。
では、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強ズレています)。
こちらにも、記念碑が立っているであろうことが分かると思います。
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 行)
どういう局面でST_SetSRID()を使うか
ST_SetSRID()
は使う局面が非常に限られます。
まず、上述していますが、JGD2000とWGS84とでは、PostGISのST_Transform()
で座標値を変換する計算を施しても同じ座標値になります。厳密には違う値にならないといけないはずなのですが、同じ値になります。同じ値になるのだと座標値計算をやるだけ無駄ですね。なのでJGD2000とWGS84の変換では、SRIDの変更だけを行います。
また、明らかにSRIDの設定がおかしい場合に無理に付け替える場合にも使います。たとえば、JGD2000のつもりでデータを作成していて、SRIDも4612
で設定していたのに、実は1990年代の地図からデータを作っていて、それだとTokyoなのでSRIDは4301にしないといけない。でも初めからやり直すだなんて労力がかかる。そういう時にST_SetSRID()
でSRIDだけ変更したデータを他のテーブルに叩き込んであげればOKです。この場合にはSRIDだけを変更して座標値は変更したくないのでST_Transform()
は使えません。仮に使うとSRID=4612
座標値が分けの分からない値に変換されてしまいます。
おわりに
空間参照系は、地球上の位置から何らかの座標値を計算するための手法の種別であること、その種別は多数あること、わが国で使われるものに限定してもそれなりにあることを述べました。
また、SRIDが異なるジオメトリ同士を比較したり幾何演算を行おうとする場合には、SRIDを一方にあわせなければならないことを述べ、さらに、実際にあわせる方法を示しました。
ジオメトリが参照している空間参照系については、常に注意を払う必要があります。ただ、PostGISではSRIDについて制限を付けることができるので、混同しにくくなっていると思いますし、座標変換はPostGIS関数で処理してくれるので心配ありません。また、SRIDは数字なので覚えにくいかもしれませんが、覚えなくともウェブを漁ればどうにかなります。あまり深刻に考えずに、空間参照系と付き合っていきましょう。