iPhoneのGPSをPython(Pyto)で扱う

#前回の続き
前回に続きPythonをiPhoneでかけるPytoというアプリを使い、モバイル独自の機能を生かしたプログラムを作成していきます。
前回：https://qiita.com/chibibaku/items/daf6e81e58403737edb3
#コード本文
いきなりですが、コードを張ります。
この下に下準備編があるのでご注意ください。

```python:map.py
import folium
from flask import Flask ,render_template
import os
import background as bg
import location
import notifications as nc

app = Flask(__name__)
location.start_updating()

def notity(locdata):
    notification = nc.Notification()
    notification.message = "Flask get request \n" + str(locdata[1]) + " / " + str(locdata[0])
    nc.schedule_notification(notification, 1, False)

@app.route('/')
def access():
    locdata = location.get_location()
    notity(locdata)
    
    folium_map = folium.Map(location=[locdata[1], locdata[0]], zoom_start=15)
    folium.Marker(location=[locdata[1], locdata[0]], popup="point").add_to(folium_map)
    folium_map.save('templates/nowloc.html')
    return render_template('nowloc.html')

with bg.BackgroundTask() as b:
    folium_map = folium.Map(location=[0, 0], zoom_start=15)
    folium_map.save('templates/nowloc.html')
    app.run()
```
上記のコードでフーンってなった人はたぶん解説せずともドキュメントよんで全部理解していただけると思います。。。。
ただ、ライブラリ導入など微妙に異なった点があるので、ここから解説していきます。

#下準備
ライブラリの導入について解説していきます。前回の記事中盤に書いた通り、メニュー内のライブラリ追加のページから追加できます。PyPlを選択すると以下のような画面になります。
この画面の検索ボックスから、任意のライブラリをインストールできます。今回は簡易webサーバー用にFlaskを導入しますので、Flaskと検索しましょう。候補最上部のFlaskを選択し"Install Flask"タップします。ターミナルのような画面が表示されます。完了したら左上のDoneを押しましょう。ここでPytoがクラッシュする場合がありますが特に問題ないようです。
この手順で"folium"という地図表示用ライブラリも導入してください。

再度Pytoを開き、メニューからScripts、私はiClowd内のPytoフォルダにmap.pyという名前で作成しました。
次にmap.pyと同一のディレクトリにのちにHTMLを格納する用に"templates"というフォルダを作成します。

#解説
ここからはコードの解説をします。
まずはmap.pyに先ほどのコードコピペしてください。

```python
import folium
from flask import Flask ,render_template
import os
import background as bg
import location
import notifications as nc
```

インポートです。folium, flask, osは問題ないかと思います。
backgroundは名前の通りバックグラウンドで実行することができるようになるライブラリです。
locationは位置情報取得のためのPyto独自ライブラリ、notificationsは通知用の独自ライブラリです。

```python
app = Flask(__ name__)
location.start_updating()
```

app = Flask....はお決まりな気がします。
location.start_updating()は、ロケーションデータをとる最初に書かないとうまく動作しません。

```python
def notity(locdata):
    notification = nc.Notification()
    notification.message = "Flask get request \n" + str(locdata[1]) + " / " + str(locdata[0])
    nc.schedule_notification(notification, 1, False)
```
この関数は通知を作成しています。
のちに渡されるlocdata(位置情報)配列から緯度経度を抜き出し、通知するといったものです。

```python
@app.route('/')
def access():
    locdata = location.get_location()
    notity(locdata)

    folium_map = folium.Map(location=[locdata[1], locdata[0]], zoom_start=15)
    folium.Marker(location=[locdata[1], locdata[0]], popup="point").add_to(folium_map)
    folium_map.save('templates/nowloc.html')
    return render_template('nowloc.html')
```

ここはFlaskによって建てられたサイトにアクセスされたときに実行される項目が書かれています。
>locdata = location.get_location()

によって位置情報が取得され、
>notity(locdata)

によって通知関数に位置情報が送られます。
>folium_map = folium.Map(location=[locdata[1], locdata[0]], zoom_start=15)
folium.Marker(location=[locdata[1], locdata[0]], popup="point").add_to(folium_map)
folium_map.save('templates/nowloc.html')

は、まずfolium_mapに取得した位置にマップを移動させ、
folium.Markerによって、位置にピンが刺されます。
folium_map.saveはテンプレディレクトリに今の地図を保存します。
>return render_template('nowloc.html')

によってtemplatesに格納されたhtmlをレンダリングし、リクエストに応答します。
>with bg.BackgroundTask() as b:
    folium_map = folium.Map(location=[0, 0], zoom_start=15)
    folium_map.save('templates/nowloc.html')
    app.run()

最後に、一連のプログラムが起動されたときに実行されるものが書かれています。
with bg.BackgroundTask() as b:
は、バックグラウンドで実行可能するための分で、ここに含まれるものはPytoが表示されていない状態でも継続して動作します。

folium_map = folium.Map(location=[0, 0], zoom_start=15)
folium_map.save('templates/nowloc.html')
この二行は、前回使用時に使用されたtemplateのHTMLを表示させないために記載してます。
たぶんいらないかも...（´・ω・｀）

app.run()
はい()
flaskのあれです。

#実際の動作。
このプログラムを書いたら、右上の再生ボタンから実行します。flask簡易サーバーが起動したら、任意のブラウザでlocalhost:5000か127.0.0.1:5000にアクセスして、自分の位置が表示されるか確認してください。
このコードではセキュリティ等一切考えていないので、心配であれば公園かどこかで試してみてください。
誤差は最大数メートル程度だと思います。

#まとめ
今回はPytoを自分なりにかなり大雑把にまとめて書いてみたと思います。
手元でpython開発できる！つおい！
これからも使っていきたいです。(iPhoneだと画面が小さいですが、iPadなら問題ないかと思います。)
それでは次回はベンチマークをやってみようかと思います。

Qiitaはこれで2個目なので結構書き方わかりにくいかと思いますが、ゆくゆく改善していきます。
それではありがとうございました。
今回はこの辺でさようなら。