Python

[GPS]pyprojを使用してGPSの緯度経度から距離、方位角、仰角を算出する

More than 3 years have passed since last update.


概要

ロケットやラジコンヘリにGPSをつけて飛ばした時、飛行物体のGPSの情報からデータを作成する時などに使える。

GPSの緯度経度、高度の情報から距離、方位角、仰角を算出する方法。

pythonのpyprojライブラリを使用すると便利なので、その利用法。


事前準備

pyprojのインストール

pip install pyproj

または

1.pyprojのページからソースをダウンロード


2.python setup.py build を実行


3.python setup.py install を実行


目的

基準点をp1、飛んでいる対象をobjとする。

pyprojパッケージのGeodクラスのinv()メソッドでp1, objの緯度経度から距離と方位角を求める。

距離は地図上の距離と基準点から物体までの直線距離を求める。

さらにobjの高度も含めてmath.atan2()を使って仰角(見上げた時の角度)を求める。

2d.jpg

3d.jpg


ソース


geod_sample.py

#!/usr/bin/env python

#-*- coding: utf-8 -*-
import math
from pyproj import Geod

# 基準点(p1)となる緯度(p1_latitude)、経度(p1_longitude)
# 単位はDegree
p1_latitude = 35.3524
p1_longitude = 135.0302

# 飛行物体は緯度(obj_latitude)、経度(obj_longitude)、高度(obj_altitude)のところにある
obj_latitude = 35.3532
obj_longitude = 135.0305
obj_altitude = 1000 # 単位は(m)

# ellpsは赤道半径。GPSはWGS84を使っている。距離は6,378,137m
g = Geod(ellps='WGS84')

# inv() method
# 引数は inv(p1の経度, p1の緯度, 対象の経度, 対象の緯度, radians=False)
# radiansで出力が変わる。無し、またはFalseでDegree、Trueを入れればRadianで出力される
# 戻り値は方位角(azimuth)、反方位角(back_azimuth)、距離(distance_2d)の順番
azimuth, back_azimuth, distance_2d = g.inv(p1_longitude, p1_latitude, obj_longitude, obj_latitude)

# 必要なものだけ欲しいなら以下でも可
result = g.inv(p1_longitude, p1_latitude, obj_longitude, obj_latitude)
azimuth = result[0]
back_azimuth = result[1]
distance_2d = result[2]

# inv()で求めた距離が分かれば、GPSの高度と合わせて仰角(elevation)が分かる
# math.degrees()はmath.atan2()の戻り値がRadianなので、Degree(°)に変換している。
elevation = math.degrees(math.atan2(obj_altitude, distance_2d)

# 飛行物体までの直線距離(distance_3d)はmathを使ってピタゴラスの定理
# math.pypotで求められる。
distance_3d = math.hypot(distance_2d, obj_altitude)

print '基準となる位置から飛行物体までの地図上距離は' + str(distance_2d) + "m"
print '基準となる位置から飛行物体までの直線距離は' + str(distance_3d) + "m"
print '基準となる位置から飛行物体までの方位角は' + str(azimuth) + "°"
print '基準となる位置から飛行物体までの反方位角は' + str(back_azimuth) +"°"
print '基準となる位置から飛行物体までの仰角は' + str(elevation) + "°"