グラフで座標を取得する方法がわかったので、
#####座標から経度・緯度を求める
方法を探しました。
実行例
./map1.py 東京
(全ての都市で使えるわけではなさそうです。ではなくて時間が掛かって失敗しているのか?何回かやれば表示されました。ローマ字だとすぐに表示されるようです。)
地図上をクリックすると、緯度・経度が表示されます。
間違っていたので修正しました。
#!/usr/bin/python3
# coding: UTF-8
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import numpy as np
from pygeocoder import Geocoder
import sys
font = {'family':'IPAGothic'} #日本語Fontを指定
args = sys.argv
argc = len(args) # 引数の個数
if (argc != 2): # 引数がない場合
print ('./map1.py 目的地の名称')
quit()
area_name = args[1]
try:
result = Geocoder.geocode(area_name)
lon1 = float(result.longitude)
lat1 = float(result.latitude)
except:
quit()
map = Basemap(llcrnrlon=lon1-2,llcrnrlat=lat1-2,urcrnrlon=lon1+2,urcrnrlat=lat1+2,resolution='h',projection='cyl')
map.shadedrelief() #標高図
map.drawcoastlines()
map.drawmeridians(np.arange(0, 360, 10))
map.drawparallels(np.arange(-90, 90, 10))
try:
while True:
a=plt.ginput(n=1)[0] #クリックして座標を取得
b=map(a[0], a[1], inverse=True) #座標を緯度・経度に変換
plt.title("東経{}° 北緯{}°".format(b[0],b[1]), **font)
except:
pass
plt.show()
今、気が付きましたが、これを指定するとグラフの右下に表示される座標が、緯度・経度に代わっています。
#####2点間距離を求める
地図上を2箇所クリックする。
変更点
from mpl_toolkits.basemap import pyproj
try:
while True:
aa=plt.ginput(n=1)[0] #クリックして座標を取得
bb=map(aa[0], aa[1], inverse=True) #座標を緯度・経度に変換
cc=plt.ginput(n=1)[0]
dd=map(cc[0], cc[1], inverse=True)
map.drawgreatcircle(bb[0],bb[1],dd[0],dd[1],linewidth=2,color='b') #大圏コース
gc = pyproj.Geod(a=map.rmajor,b=map.rminor) # ポイント間の距離計算
az1, az2, dist12 = gc.inv(bb[0],bb[1],dd[0],dd[1])
plt.title("2点間の距離= {} km".format(dist12/1000), **font)
except:
pass
#####ウインドウの中で地球を動かすことができるか?
私が調べた範囲ではできないような気がする。
plt.show()を終了させることが、できなかった。
無限ループでウインドウの右上のXボタンで終了させて、次の表示まで10秒程度表示なしで繰り返すことくらいしか出来なかったので、アニメgifにしました。
白黒の地球で数分程度?、なんか寂しいので標高図(山の高さにより色が違う)にすると、ファイルサイズは3〜5倍程度だが、無限ループで360枚pngファイルを作成しようと思ったら、メモリ不足?作成時間はだんだん長くなるわ、エラーで止まるわ4時間程度かかった。
最後20枚程度は1枚1枚作成したら、それほど時間がかからなかった。メモリを開放しなければいけなかったのか?。
色の付いたアニメgifは出来ましたが、サイズオーバーでアップできませんでした。