コンテンツにスキップ

座標系

Mapray JS に関連する主な座標系には、次の4種類があります。

  • 地理座標系(経度・緯度)
  • GOCS: Geocentric Orthogonal Coordinate System (地心直交座標系)
  • MLOCS: Mapray Local Orthogonal Coordinate System (任意地点を原点とする直交座標系)
  • 視点座標系

表記について

このドキュメントでは、\((x, y, z)\) が (赤, 緑, 青) に対応するように記述します。

GOCS: Geocentric Orthogonal Coordinate System (地心直交座標系)

GOCS は下記のように定義されます。

  • 原点を地球中心とする
  • \(z\) 軸を北極の方向とする
  • \(x\) 軸をグリニッジ子午線と赤道との交点方向とする
  • \(y\) 軸は東経90度方向とする
  • 座標値の単位はメートルとする

GOCS 座標系

MLOCS: Mapray Local Orthogonal Coordinate System

MLOCS は任意の点を原点とする直交座標系で、下記のように定義されます。

  • 地球上の任意の点 \(p_o\) を原点とする
  • \(z\) 軸を上方向(地球中心と反対方向)
  • \(y\) 軸を北方向(\(z\) 軸に垂直)
  • 右手系で残りの軸を \(x\) 軸とする
  • 座標値の単位はメートルとする

Mapray ローカル座標系での座標軸の図

MLOCS 原点の経度、緯度を \(\lambda, \phi\) としたとき(単位はラジアン)、GOCS 座標系への変換行列は下記のように計算されます。

\[ \begin{equation} \begin{aligned} T_\mathrm{MLOCS} &= \mathrm{Rot_z}(\lambda) \times \mathrm{Rot_y}(-\phi) \times \mathrm{Trans_x}(r) \times \mathrm{Rot_y}(90^\circ) \times \mathrm{Rot_z}(90^\circ) \\ &= \begin{pmatrix} -\sin \lambda & -\cos \lambda \sin \phi & \cos \lambda \cos \phi & r \cos \lambda \cos \phi \\ \cos \lambda & -\sin \lambda \sin \phi & \sin \lambda \cos \phi & r \sin \lambda \cos \phi \\ 0 & \cos \phi & \sin \phi & r \sin \phi \\ 0 & 0 & 0 & 1 \end{pmatrix} \end{aligned} \end{equation} \]

\(r (= 6378137)\) は地球半径 [\(m\)] 。

この変換行列は、 mapray.GeoPoint.getMlocsToGocsMatrix() によって計算することができます。

const pos = new mapray.GeoPoint( 139.7773163, 35.6318177 );
const mat = pos.getMlocsToGocsMatrix( mapray.GeoMath.createMatrix() );

地理座標系(経度・緯度)

地理座標系は、一般的に使用される経度・緯度により表現される座標系です。 Mapray で扱う地理座標は WGS84 で表現されていることを前提として扱います。

地理座標系からGOCSへの変換

地理座標系 \((\lambda, \phi, h)\) から GOCS (地心直交座標系) \(\vec{p}=(x, y, z)\) への変換は次のようになります。

\[ \begin{equation} \vec{p} = \begin{pmatrix} (r + h) \cos \phi \cos \lambda \\ (r + h) \cos \phi \sin \lambda \\ (r + h) \sin \phi \end{pmatrix} \end{equation} \]

\(r (= 6378137)\) は地球半径 [\(m\)] 。

Mapray JS では地球の形状が楕円体ではなく球として描画されます。 ※厳密には WGS84 で表された経度・緯度の座標値を上記計算式に従って計算した3次元位置に描画されます。

mapray.GeoPoint.getAsGocs() を使用して、下記のように計算することができます。

const point = new mapray.GeoPoint( 139.7, 35.6, 10 );
const gocsPoint = point.getAsGocs( mapray.GeoMath.createVector3() );

GOCSから地理座標系への変換

GOCS (地心直交座標系) \((x, y, z)\) から地理座標系 \((\lambda, \phi, h)\) への変換は次のようになります。

\[ \begin{align} \lambda &= \arctan(x, y) \\ \phi &= \arctan\left( \frac{z}{\sqrt{x^2 + y^2}} \right) \\ h &= \sqrt{x^2 + y^2 + z^2} - r \end{align} \]

\(r (= 6378137)\) は地球半径 [\(m\)] 。

GOCS から地理座標系へは mapray.GeoPoint.setFromGocs() によって計算することができます。

const point = new mapray.GeoPoint();
point.setFromGocs( [ -3901767.687704394, 3435006.5102036544, 3697593.3241490265 ] );

Info

mapray.GeoPoint の引数は、 経度, 緯度, 高度 の順になります

視点座標系

視点座標系はカメラ位置を原点とした3次元直交座標系で、GOCS 上で下記のように定義されます。

  • カメラの位置(投影中心)を原点とする
  • \(x\) 軸をカメラの右方向
  • \(y\) 軸をカメラの上方向
  • \(z\) 軸をカメラの後ろ方向
  • 座標値の単位はメートルとする

View座標系

視点座標系からGOCS座標系への変換行列は Camera.view_to_gocs から設定および取得を行うことができます。

変換行列について

Mapray JS において \(4 \times 4\) 変換行列 \(M\) による、3次元位置 \((p_x, p_y, p_z)\) の変換は下記のように行います。

\[ \begin{pmatrix} q_x \\ q_y \\ q_z \\ q_w \end{pmatrix} = M \begin{pmatrix} p_x \\ p_y \\ p_z \\ 1 \end{pmatrix} \]

変換後の3次元座標は \(\left(\frac{q_x}{q_w}, \frac{q_y}{q_w}, \frac{q_z}{q_w}\right)\) となります。

視点座標系は Camera.view_to_gocs プロパティに設定する変換行列 \(A\) は、次のように第4行が \((0, 0, 0, 1)\) でなければなりません。

\[ A = \begin{pmatrix} m_{00} & m_{01} & m_{02} & m_{03} \\ m_{10} & m_{11} & m_{12} & m_{13} \\ m_{20} & m_{21} & m_{22} & m_{23} \\ 0 & 0 & 0 & 1 \end{pmatrix} \]

座標系の相互変換

図のように相互変換を行うことができます。

Mapray で使用される座標系と相互変換メソッドの図

モデルの表示に関連する座標系

3D モデルの配置に関連する座標系については、 Entities - ModelEntity - Coordinate system を参照してください。