2019年5月26日日曜日

自転車で湖南三山、長寿寺

いつもは中山道をなぞるのだが、 県道117をからめながら湖南方面へ。

路面状況も悪くなく、車も少なく、 穏かなツーリングができる。 甲賀や日野へゆく時は、良いルートかもしれない。

で、 長寿寺 、 新緑豊かで、心地良いく、落ち着く。

檜皮葺の本堂が国宝のようだが、 それより、全体の雰囲気がよい。 入山料 500円 は高くはない。

手水にしても、こんな雰囲気。

参道には、 木漏れ日の中で休息できる場所が 数カ所用意されている。

しかも、 参拝後に、受付でお茶とアメを出して頂けた。

ボトルを持って入山しなかったのが残念。 紅葉や桜の季節は人が多くて大変そうだが、 また、立ち寄りたい場所になった。

2019年5月15日水曜日

緯度経度による距離計算に、pythonのnumpyを使ってみた

gpxのログから、 とある緯度経度に最も近い点を求めるのに、 pythonのnumpyを使ってみた。

今迄は、手持ちのPOIしか扱うことがなかったので、 点数が少なく、listの計算で不満は無かった。 しかし、地理院からゲットできる公共施設の住所と座標を扱おうとすると、 5000点(全国で、データによっては5万)を越えるので、 とても遅くなる。 これを解消したかった。

やったことは、 ログの緯度経度を、radianなnp.arrayにして、 対象座標との距離を計算して、結果をarrayに収める。 あとは、argmin()で、最小値のindexを求める。

def calc_dist_array(lad_ar, lod_ar, ck_rlad, ck_rlod):
    """Calc distance."""
    #

    d_x_ar = lad_ar - ck_rlad
    d_y_ar = lod_ar - ck_rlod
    dx_ave = (ck_rlad + lad_ar) / 2.0

    w_2_ar = 1.0 - 0.0066943800230118 * np.sin(dx_ave)**2
    m_m_ar = 6335439.32708317 / np.sqrt(w_2_ar) / w_2_ar
    n_n_ar = 6378137.0 / np.sqrt(w_2_ar)
    t_2_ar = n_n_ar * np.cos(dx_ave) * d_y_ar

    return np.sqrt(m_m_ar**2 * d_x_ar**2 + t_2_ar**2)


np_dist = calc_dist_array(
    np.radians(np.array(gpx_log_latigude)),
    np.radians(np.array(gpx_log_longitude)),
    math.radian(target_rat), math.radian(target_lon))

nearest_index = np_dist.argmin()

これを使って、gpsのログが通過する住所リストを作成してみた。

大阪府高槻市田能スハノ下11
京都府亀岡市安町野々神8
京都府南丹市八木町八木東久保29-1
京都府南丹市園部町小桜町47
兵庫県篠山市福住344-1
兵庫県篠山市日置385-1
兵庫県篠山市北新町41
兵庫県篠山市網掛429
兵庫県篠山市宮田240
兵庫県丹波市柏原町柏原1
兵庫県丹波市氷上町成松甲賀1
兵庫県丹波市柏原町柏原1

リストで処理するよりかなり早くなったが、 5万点になるとさすがに使えそうにない。
もっと良い方法があるかもしれない。

例えば、最小を判定できればよいので、 1degree=94km で処理するとか、 フィルタをかけて、5万点から桁落ちさせるとか、 色々工夫の余地はありそう。
あと、番地以下が不要とか、 公共施設の近所を通過しないログだと役立たずとか。

う、不満だらけだ。

まあ目安程度なら使えるかも。
まあ、よしとしておこう。

2019年5月10日金曜日

「譲り合い」について

車や自転車を運転していて「譲り合い」が発生する際に、 いくつかの状態があるのだと、今更ながら考えてしまった。

  1. 譲りたい、譲ります。

    こうありたい。

  2. 譲って欲しい、譲られたい。

    今は良いけど、さらに年齢を重ねると、ヤバいかも。

  3. 譲れ、譲られるのが当然だ。

    戒めたい。

  4. 譲らないのなら、考えがある。

    絶対、ダメだろう。

自分はどんな状態で車や自転車に乗ってるだろうか。 ケースバイケースというのも、マズそうだ。

更に年齢を重ねても、 素直にブレーキ操作が出来るようにするには、1を心掛けたいと思う。 でないと、意識の外でアクセル側の操作をしてしまうかもしれない。

先日の大津の事故報道を聴いていて、特殊な気分になったのかもしれない。

とある1日、

  • 自転車で2車線道路の左端を走行中、右からライトバンが出てきて併走状態 になった。その車は、左折のためにノーズを自転車前方に被せてきて、左折 させろと迫ってきた。某有名製薬会社の社名が見えた。
  • 横断歩道を青で渡っていたら、右折車が目の前を、ゆっくり、横切ってゆく。 ドライバーは、白髪の老婦人で、右手を上げて、満面の笑顔だった。
  • 全方向一時停止の信号の無い十字路で、自分が自転車歩行者もあり。そこに 阪○○○シーが一時停車もせず、歩行者の前を右折していった。

こんなことは、自転車に乘ってればよくあることで、 感情的になれば、1 でいられなくなる。

が、企業名しょってるのに、と思ってしまう自分が情けない。

いつだったか、日○警○の車が、 信号のない横断歩道で、 前方信号が赤なのに、 待っている小学生をずっと凝視しながら、 徐行で通過していった。 まあ、これはテロリスト対策で、 停止しないように社内で定められているにちがいない。

ああ我、浅ましきかな。
省みれたので、良しとするか。

2019年5月6日月曜日

pythonでicalendarを試してみた(parseだけ)

khal のコマンド作成の スクリプトを作ってはみたが、登録が重複するのはまずいので、 登録済かどうか確認するのに、 icalendar を使ってみた。

khal は ローカルにファイルを保管していてサーバとのやり取りは無いので、 やってみる気になった。しかも、parseだけ出来ればよいので。

#!~/.pyenv/shims/python
"""Read and Check ical data file."""

from __future__ import unicode_literals

import sys
import logging
from pathlib import Path

import logzero
from icalendar import Calendar


def parse_icalfile(f_path, ride_log):
    """Parse icalendar file."""
    cal_fobj = open(f_path, 'rb')
    k_calen = Calendar.from_ical(cal_fobj.read())
    cal_fobj.close()
    for cal_ev in k_calen.walk():
        if cal_ev.name == 'VEVENT':
            start_year = cal_ev.get('dtstart').dt.strftime("%Y")
            ride_log[start_year].append(k_calen)

    return ride_log


def sel_event_list(ride_log, t_day):
    """Select events by target date character."""
    event_list = []
    for ical_obj in ride_log[t_day[0:4]]:
        for cal_ev in ical_obj.walk():
            if cal_ev.name == 'VEVENT':
                summary = cal_ev.get('summary', default='None')
                descrip = cal_ev.get('description', default='None')
                start_dt = cal_ev.get('dtstart').dt
                end_dt = cal_ev.get('dtend').dt
                event_item = "{0:s}{1:s}:{2:s}({3:s})".format(
                    start_dt.strftime("%Y%m%d%H%M"),
                    end_dt.strftime("%m%d%H%M"), summary, descrip[0:20]
                )
                event_list.append(event_item)

    logzero.logger.info("- All entry {0:s}".format(t_day[0:4]))
    for s_str in sorted(event_list):
        logzero.logger.info(s_str)

    c_event = [e for e in sorted(event_list) if e[0:len(t_day)] == t_day]

    return sorted(c_event)


def main():
    """Do main prcess."""
    #
    khal_dir = Path.home() / "Documents/ownCloud/caldav/bikes/"

    ride_log = {
        "2016": [], "2017": [], "2018": [], "2019": [], "2020": []
    }

    for f_path in khal_dir.glob('*'):
        ride_log = parse_icalfile(f_path, ride_log)

    t_date = '20190412'

    target_ev_list = sel_event_list(ride_log, t_date)

    if target_ev_list == []:
        logzero.logger.info("- No entry on {0:s}".format(t_date))
    else:
        logzero.logger.info("- target {0:s}".format(t_date))
        for mes_str in target_ev_list:
            logzero.logger.info("  {0:s}".format(mes_str))


if __name__ == "__main__":

    LOG_FORMAT = "%(color)s[%(module)s:%(lineno)d]%(end_color)s %(message)s"
    FORMATTER = logzero.LogFormatter(fmt=LOG_FORMAT)
    logzero.setup_default_logger(formatter=FORMATTER)
    logzero.loglevel(logging.INFO)
    logzero.logfile("./_logs/log.log", maxBytes=3e5, backupCount=3)

    main()
    sys.exit()
#

まずまずなのだが、 登録済確認をスクリプト内で出来れば良いのだが、 私には無理なので、目視確認とした。

gpxのログを読み込んで、その概要を掃き出すスクリプトを改造して、 khalコマンドとicalendarの作成と併せて、確認させてみた結果の例が以下。

# Check 015: 2019-04-26 09.10.03 Day.gpx
- time (2019-04-26 09:10:03 JST) - (2019-04-26 16:30:22 JST)
- trip 101.0km(382 + (stop 58)min) ave. 15.9km/hr u/d(495.9/551.6)
- farthest 32.9km SE

    $ khal new -a bikes 20190426 09:10 440m ride 101.0k SE32k :: 奈良県天理市

- Bike event 20190426
  20190426091004261630:ride 101.0k SE32k(奈良県天理市 by gpl2cal.py)

# Check 016: 2019-05-03 17.48.26 Day.gpx
- time (2019-05-03 07:53:35 JST) - (2019-05-03 17:47:44 JST)
- trip 147.6km(493 + (stop 64)min) ave. 18.0km/hr u/d(739.2/693.1)
- farthest 53.5km EE

    $ khal new -a bikes 20190503 07:53 557m ride 147.6k EE53k :: 滋賀県東近江市

- Bike event 20190503
  None

コンソール上のコピペで作業ができるので良しとする。

麻のボディタオル

2018年の秋(まだ、自転車を封印してない)、 近江上布伝統産業会館 で、興味からボディタオルを購入した。 お、よかった。: 自然派パン工房 ふるさとの道 ほぼ毎日風呂で使ってきて、ついに寿命がきたようだ。 お店の方に、「糸が痩せて破れてくる」まで使える、と...