プロが教えるわが家の防犯対策術!

python初心者です.

なかなか調べても出てこないものにあたってしまい質問させていただきました.
python ver = 2.7.6

スマホのGPSから取得した
csvファイルがこのようになっていて
"Latitude","Longitude"(緯度,経度)
34745884, 135782873
34746035, 135782770
34745872, 135782753
     .
.

のような位置データがずらっと書かれています.

このデータを読み込み,640*480の画面の対応する場所に画像を表示したいのですがどのようなプログラムを書けばいいかで詰まっています.
例.ある(経度,緯度)→640*480の実行画面の座標(240,180)のような感じで反映させたいのですが.

調べると実行画面の中心の座標を予め自分で定めた(経度,緯度)に設定しそこを元に読み込んだ座標を反映させるような方法もあるようですがやり方がわからず.

どのようなことをしたいか画像を添付しておきます.

よろしければご享受願います.
例でも参考にさせていただけるプログラムがあれば幸いです.

「pythonで緯度と経度情報をもちいてブ」の質問画像

A 回答 (1件)

うまく説明できるかどうか自信がないのですが…。


そして、これでebisen000さんのやりたいことができるかも自信がないのですが…。
思いついた限りで書かせていただきます。


まず、640*480の実行画面(上の地図)で表示する緯度経度の対応範囲を決めてやる必要があるかと思います。
つまり、実行画面上の x=0, y=0 (たぶん左上の座標) が緯度いくつで経度いくつなのかと、
実行画面上の x=640, y=480 (たぶん右下の座標)が緯度いくつで経度いくつなのかを決めます。

#ここからは仮定の話になりますので、実際には想定している値に置き換えてください。

実行画面上の地図で何kmくらいの範囲を表示したいかによって変わってきますが、
仮に実行画面上の地図の表示範囲は、x軸(横)に640メートル、y軸(縦)に480メートルとします。
(実行画面上の1ピクセルが1メートルに対応するということにしました。)
また、実行画面のx軸が経度、y軸が緯度に対応するものとします。

サンプルとして載せてもらっている緯度経度の最初の一つ Lat=34.745884, Lng=135.782873 を
仮に実行画面の x=0, y=0 に対応させるものとして、x軸に640メートル、y軸に480メートル加算した緯度経度は、Lat=34.750211, Lng=135.789863 になります。(だいたいですが…)
つまり実行画面上の x, y と 緯度経度 Lat, Lnt の対応は、

x=0 : Lng=135.782873
x=640 : Lng=135.789863
y=0 : Lat=34.745884
y=480 : Lat=34.750211

となります。
あとはこの値の範囲を使って、とある緯度経度が実行画面上の座標(x, y)ではいくつなのかを計算すればいいと思うのです。

Pythonで以下のような関数を作ってみました。(注意:スペースを全角にしてあります。)
数値(引数x)をある範囲(引数in_min~in_max)から別の範囲(out_min~out_max)に変換します。


def ValueMapping(x, in_min, in_max, out_min, out_max):
  return float(x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min


例えば、
Lat=34.746884, Lng=135.783873
が実行画面のどの座標に対応するかを計算したい場合なら、

x = ValueMapping(135.783873, 135.782873, 135.789863, 0, 640)
y = ValueMapping(34.746884, 34.745884, 34.750211, 0, 480)

のように関数に値を渡します。

上記の結果は、
x=91.5593705297
y=110.931361221
となります。小数点以下を四捨五入するとして、つまり実行画面上での座標は、
x=92
y=111
となります。(たぶん…)


で、ここまできてなんですが、この方法は緯度経度を単純に画面上のx,yに置き換えています。
しかし緯度経度は本来、地球の楕円球面上の座標なので単純に二次元に変換できないと思います。
短い距離の範囲で変換しているぶんには誤差の範囲と思うのですが、
大きな範囲の地図上で表示しようとすると誤差が無視できないレベルになるかもしれません。
その場合は、もっと厳密な変換の計算が必要と思われます。

もしくは、そもそももっとクールなやりかたがあるかもしれません(^^;)
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!