Ruby
GPS

RubyでGPSを使って距離・方角を扱ってみた

More than 1 year has passed since last update.

とやまシビックテックパーティー2018に参加した時にGPSの距離計算をしたので、メモ書きです。

APIリクエスト等の時間も不要なので計算時間短めです。

また、関数化しておけば意識せずに渡すことができます。

例では富山駅からハッカソンが行われた富山県民会館までの情報を調べます。


距離

2点間の距離を求められます。

結果から富山駅から富山県民会館まで720mちょっとであることがわかります。

include Math

def get_distance(pos1, pos2)
y1, x1, y2, x2 = [*pos1, *pos2].map{ |v| v * PI / 180 }
earth_r = 6378.14 # km
cos_theta = sin(y1) * sin(y2) + cos(y1) * cos(y2) * cos(x2 - x1)
earth_r * acos(cos_theta)
end

# [latitude, longitude]
toyama_station = [36.7022545,137.2120993]
toyama_kaikan = [36.7059723,137.2053941]
puts get_distance(toyama_station, toyama_kaikan)
# 0.727599296578177


方向

北向きを0度とした時計回りでpos1からpos2に向けての方位を求められます。

富山駅から見て富山県民会館は南の方向にあることがわかります。

include Math

def get_angle(pos1, pos2)
y1, x1, y2, x2 = [*pos1, *pos2].map{ |v| v * PI / 180 }
y = cos(x2) * sin(y2 - y1);
x = cos(x1) * sin(x2) - sin(x1) * cos(x2) * cos(y2 - y1);

angle = 180 * atan2(y, x) / PI;
if (angle < 0)
angle = (angle + 360)%360 #0~360 にする。
end
angle
end

toyama_station = [36.7022545,137.2120993]
toyama_kaikan = [36.7059723,137.2053941]
puts get_angle(toyama_station, toyama_kaikan)
# 202.1394161068865


番外編


距離測定ツール


参考文献

緯度・経度から二点間の距離と方向を計算する