38
39

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-01-08

概要

ロケットやラジコンヘリに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) + "°"
38
39
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
38
39

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?