🕌

地理座標系での計測時に「値がなんか思ったのと違うな」と思ったときに見る資料

2022/03/03に公開

経度緯度による2点間の距離やポリゴンの面積を求めるアルゴリズムでは、経度方向の距離が180度を越える場合、たいていのケースで逆側(短い方)で計算される[1]

以下の例示では計算にこの記事で説明しているアルゴリズムを使う。
ポリゴンの描画にはgeojson.ioを使う。

距離

a
[
       [-150, 0],
       [150, 0],
]

距離:6679169.447596412

b
[
       [-150, 0],
       [0, 0],
       [150, 0],
]

距離:33395847.23798207
aと同じ描画となるため省略

c
[
       [150, 0],
       [210, 0],
]

距離:6679169.447596414

aは本来ならbと同じ結果となるべきだが、cと同じになっている。
[-150, 0]と[150, 0]の間の経度方向の距離(300)が180度を超えているため、結果的に距離が60の逆方向の計算結果と同じになる。

bの場合は、間に点[0,0]が挿入されているため、本来求めたい形の距離が求められている。

面積

a
[
       [-150, 0],
       [150, 0],
       [0, 60],
       [-150, 0],
]

面積:70687135655987.08

b
[
       [-150, 0],
       [0, 0],
       [150, 0],
       [0, 60],
       [-150, 0],
]

面積:184345669367534.12
aと同じ描画となるため省略

c
[
       [-150, 0],
       [-210, 0],
       [0, 60],
       [-150, 0],
]

面積:70687135655987.16

こちらも距離と同じで、aは本来ならbと同じ結果となるべきだが、cと同じになっている。
[-150, 0]と[150, 0]の間の経度方向の距離(300)が180度を超えているため、結果的に距離が60の逆方向の計算結果と同じになる。

bの場合は、間に点[0,0]が挿入されているため、本来求めたい形の面積が求められている。

d
[
       [-30, 0],
       [0, 0],
       [30, 0],
       [20, -30],
       [0, 30],
       [-20, -30],
       [-30, 0],
]

面積:3790669202153.0723

e
[
       [-30, 0],
       [-10, 0],
       [-20, -30],
       [-30, 0],
]

面積:3790669202153.0815

dはeの3倍の面積になってほしいのだが、同じ面積になってしまう。
自己交差する場合は正しく面積が計算できない。

脚注
  1. そうでないアルゴリズムもあるだろうが、ネットに転がっているライブラリが採用しているアルゴリズムは、99%そうだと思ってよい。 ↩︎

Discussion