Create Climbing Record Application of Japan Hundred Moutain by Streamlit Cloud

 ※日本百名山(二百&三百名山)や里山の登頂記録アプリの作成 by Streamlit Cloud

 熊の出没などに気をつけないといけませんが、趣味の里山などを中心とした山登りの記録をつけるためにアプリを作ってみようと思い立ち、Geminiに相談しながら挑戦です。


 I want to create like above map, orangi markers show mountains that I already climbed, other markers show ones that I never climbed.

 I try to crate a Climbing Recording App for Japan Hundred Famous Mountain(Two Hundred and Three Hundred).

 At first, I search a database of Hundreds Moubtains of  Japan. As a result,  I found their list at the Japan Alpine Club web site below.

URL:  https://jac1.or.jp/document/mountain_data_collection

 I ask Gemini to make the csv data list of Hundreds Mountauons from its URL. First, Gemini offered 記録アプリの作成 by Streamlit Cloud


 熊の出没などに気をつけないといけませんが、趣味の里山などを中心とした山登りの記録をつけるためにアプリを作ってみようと思い立ち、Geminiに相談しながら挑戦です。



 I want to create like above map, orangi markers show mountains that I already climbed, other markers show ones that I never climbed.

 I try to crate a Climbing Recording App for Japan Hundred Famous Mountain(Two Hundred and Three Hundred).


 At first, I search a database of Hundreds Moubtains of Japan. As a result, I found their list at the Japan Alpine Club web site below.

URL: https://jac1.or.jp/document/mountain_data_collection

 I ask Gemini to make the csv data list of Hundreds Mountauons from its URL. First, Gemini offered incomplete database, examply Gemini provided examples of over a dozen representatibe mountain. So I repeatedly try to ask complete each 100, 200, 300 famous mountains list in Japan, finally I get complete list with mountains' catagories, name, top elavation and location information(prefecture, coordination) like below.

import pandas as pd

mountains_data = [
    # --- 日本百名山 (1-100) ---
    {"種類": "百名山", "山名": "利尻岳", "標高": 1721, "所在地": "北海道", "lat": 45.1835, "lon": 141.2422},
    {"種類": "百名山", "山名": "羅臼岳", "標高": 1660, "所在地": "北海道", "lat": 44.0754, "lon": 145.1278},
    {"種類": "百名山", "山名": "斜里岳", "標高": 1547, "所在地": "北海道", "lat": 43.7656, "lon": 144.7175},
    {"種類": "百名山", "山名": "阿寒岳", "標高": 1499, "所在地": "北海道", "lat": 43.3855, "lon": 144.0135},
    {"種類": "百名山", "山名": "大雪山", "標高": 2291, "所在地": "北海道", "lat": 43.6691, "lon": 142.8540},
    {"種類": "百名山", "山名": "トムラウシ山", "標高": 2141, "所在地": "北海道", "lat": 43.5264, "lon": 142.8488},
    {"種類": "百名山", "山名": "十勝岳", "標高": 2077, "所在地": "北海道", "lat": 43.4163, "lon": 142.6853},
    {"種類": "百名山", "山名": "幌尻岳", "標高": 2052, "所在地": "北海道", "lat": 42.7214, "lon": 142.6828},
    {"種類": "百名山", "山名": "後方羊蹄山", "標高": 1898, "所在地": "北海道", "lat": 42.8967, "lon": 140.8117},
    {"種類": "百名山", "山名": "平ヶ岳", "標高": 2141, "所在地": "新潟・群馬", "lat": 37.0003, "lon": 139.1711},
    {"種類": "百名山", "山名": "岩木山", "標高": 1625, "所在地": "青森", "lat": 40.6558, "lon": 140.3039},
    {"種類": "百名山", "山名": "八甲田山", "標高": 1584, "所在地": "青森", "lat": 40.6586, "lon": 140.8544},
    {"種類": "百名山", "山名": "八幡平", "標高": 1613, "所在地": "岩手・秋田", "lat": 39.9583, "lon": 140.8533},
    {"種類": "百名山", "山名": "岩手山", "標高": 2038, "所在地": "岩手", "lat": 39.8533, "lon": 141.0008},
    {"種類": "百名山", "山名": "早池峰山", "標高": 1917, "所在地": "岩手", "lat": 39.5583, "lon": 141.4883},
    {"種類": "百名山", "山名": "鳥海山", "標高": 2236, "所在地": "山形・秋田", "lat": 39.0983, "lon": 140.0483},
    {"種類": "百名山", "山名": "月山", "標高": 1984, "所在地": "山形", "lat": 38.5475, "lon": 140.0278},
    {"種類": "百名山", "山名": "朝日岳", "標高": 1871, "所在地": "山形・新潟", "lat": 38.2575, "lon": 139.8517},
    {"種類": "百名山", "山名": "蔵王山", "標高": 1841, "所在地": "宮城・山形", "lat": 38.1436, "lon": 140.4414},
    {"種類": "百名山", "山名": "飯豊山", "標高": 2105, "所在地": "山形・福島・新潟", "lat": 37.8542, "lon": 139.7025},
    {"種類": "百名山", "山名": "吾妻山", "標高": 2035, "所在地": "山形・福島", "lat": 37.7364, "lon": 140.2464},
    {"種類": "百名山", "山名": "安達太良山", "標高": 1700, "所在地": "福島", "lat": 37.6189, "lon": 140.2867},
    {"種類": "百名山", "山名": "磐梯山", "標高": 1819, "所在地": "福島", "lat": 37.6000, "lon": 140.0667},
    {"種類": "百名山", "山名": "会津駒ヶ岳", "標高": 2133, "所在地": "福島", "lat": 37.0478, "lon": 139.3517},
    {"種類": "百名山", "山名": "那須岳", "標高": 1917, "所在地": "栃木", "lat": 37.1247, "lon": 139.9633},
    {"種類": "百名山", "山名": "燧ヶ岳", "標高": 2356, "所在地": "福島", "lat": 36.9536, "lon": 139.3325},
    {"種類": "百名山", "山名": "至仏山", "標高": 2228, "所在地": "群馬", "lat": 36.9042, "lon": 139.1714},
    {"種類": "百名山", "山名": "武尊山", "標高": 2158, "所在地": "群馬", "lat": 36.8042, "lon": 139.1311},
    {"種類": "百名山", "山名": "赤城山", "標高": 1828, "所在地": "群馬", "lat": 36.5550, "lon": 139.1950},
    {"種類": "百名山", "山名": "男体山", "標高": 2486, "所在地": "栃木", "lat": 36.7647, "lon": 139.4914},
    {"種類": "百名山", "山名": "日光白根山", "標高": 2578, "所在地": "栃木・群馬", "lat": 36.7972, "lon": 139.3756},
    {"種類": "百名山", "山名": "皇海山", "標高": 2144, "所在地": "栃木・群馬", "lat": 36.6586, "lon": 139.3364},
    {"種類": "百名山", "山名": "越後駒ヶ岳", "標高": 2003, "所在地": "新潟", "lat": 37.1228, "lon": 139.0767},
    {"種類": "百名山", "山名": "巻機山", "標高": 1967, "所在地": "新潟・群馬", "lat": 36.9822, "lon": 138.9753},
    {"種類": "百名山", "山名": "谷川岳", "標高": 1977, "所在地": "群馬・新潟", "lat": 36.8375, "lon": 138.9311},
    {"種類": "百名山", "山名": "雨飾山", "標高": 1963, "所在地": "新潟・長野", "lat": 36.9031, "lon": 137.9614},
    {"種類": "百名山", "山名": "苗場山", "標高": 2145, "所在地": "新潟・長野", "lat": 36.8458, "lon": 138.6522},
    {"種類": "百名山", "山名": "妙高山", "標高": 2454, "所在地": "新潟", "lat": 36.8886, "lon": 138.1181},
    {"種類": "百名山", "山名": "火打山", "標高": 2462, "所在地": "新潟", "lat": 36.9214, "lon": 138.0742},
    {"種類": "百名山", "山名": "高妻山", "標高": 2353, "所在地": "新潟・長野", "lat": 36.7975, "lon": 138.0519},
    {"種類": "百名山", "山名": "草津白根山", "標高": 2160, "所在地": "群馬", "lat": 36.6450, "lon": 138.5283},
    {"種類": "百名山", "山名": "四阿山", "標高": 2354, "所在地": "群馬・長野", "lat": 36.5414, "lon": 138.4114},
    {"種類": "百名山", "山名": "浅間山", "標高": 2568, "所在地": "群馬・長野", "lat": 36.4061, "lon": 138.5233},
    {"種類": "百名山", "山名": "筑波山", "標高": 877, "所在地": "茨城", "lat": 36.2253, "lon": 140.1067},
    {"種類": "百名山", "山名": "白馬岳", "標高": 2932, "所在地": "長野・富山", "lat": 36.7586, "lon": 137.7583},
    {"種類": "百名山", "山名": "五竜岳", "標高": 2814, "所在地": "富山・長野", "lat": 36.6264, "lon": 137.7533},
    {"種類": "百名山", "山名": "鹿島槍ヶ岳", "標高": 2889, "所在地": "富山・長野", "lat": 36.5744, "lon": 137.7478},
    {"種類": "百名山", "山名": "剱岳", "標高": 2999, "所在地": "富山", "lat": 36.6231, "lon": 137.6167},
    {"種類": "百名山", "山名": "立山", "標高": 3015, "所在地": "富山", "lat": 36.5722, "lon": 137.6189},
    {"種類": "百名山", "山名": "薬師岳", "標高": 2926, "所在地": "富山", "lat": 36.4686, "lon": 137.5444},
    {"種類": "百名山", "山名": "黒部五郎岳", "標高": 2840, "所在地": "富山・岐阜", "lat": 36.3922, "lon": 137.5414},
    {"種類": "百名山", "山名": "水晶岳", "標高": 2986, "所在地": "富山", "lat": 36.4253, "lon": 137.6014},
    {"種類": "百名山", "山名": "鷲羽岳", "標高": 2924, "所在地": "富山・長野", "lat": 36.4022, "lon": 137.6033},
    {"種類": "百名山", "山名": "槍ヶ岳", "標高": 3180, "所在地": "長野・岐阜", "lat": 36.3420, "lon": 137.6476},
    {"種類": "百名山", "山名": "穂高岳", "標高": 3190, "所在地": "長野・岐阜", "lat": 36.2892, "lon": 137.6481},
    {"種類": "百名山", "山名": "常念岳", "標高": 2857, "所在地": "長野", "lat": 36.3253, "lon": 137.7272},
    {"種類": "百名山", "山名": "笠ヶ岳", "標高": 2897, "所在地": "岐阜", "lat": 36.3150, "lon": 137.5500},
    {"種類": "百名山", "山名": "焼岳", "標高": 2455, "所在地": "長野・岐阜", "lat": 36.2264, "lon": 137.5875},
    {"種類": "百名山", "山名": "乗鞍岳", "標高": 3026, "所在地": "長野・岐阜", "lat": 36.1061, "lon": 137.5539},
    {"種類": "百名山", "山名": "御嶽山", "標高": 3067, "所在地": "長野・岐阜", "lat": 35.8931, "lon": 137.4803},
    {"種類": "百名山", "山名": "美ヶ原", "標高": 2034, "所在地": "長野", "lat": 36.2253, "lon": 138.1067},
    {"種類": "百名山", "山名": "霧ヶ峰", "標高": 1925, "所在地": "長野", "lat": 36.1042, "lon": 138.1969},
    {"種類": "百名山", "山名": "蓼科山", "標高": 2530, "所在地": "長野", "lat": 36.1033, "lon": 138.2964},
    {"種類": "百名山", "山名": "八ヶ岳", "標高": 2899, "所在地": "長野・山梨", "lat": 35.9708, "lon": 138.3683},
    {"種類": "百名山", "山名": "木曽駒ヶ岳", "標高": 2956, "所在地": "長野", "lat": 35.7892, "lon": 137.8117},
    {"種類": "百名山", "山名": "空木岳", "標高": 2864, "所在地": "長野", "lat": 35.7194, "lon": 137.8114},
    {"種類": "百名山", "山名": "恵那山", "標高": 2191, "所在地": "長野・岐阜", "lat": 35.4422, "lon": 137.5975},
    {"種類": "百名山", "山名": "甲斐駒ヶ岳", "標高": 2967, "所在地": "山梨・長野", "lat": 35.7606, "lon": 138.2367},
    {"種類": "百名山", "山名": "仙丈ヶ岳", "標高": 3033, "所在地": "山梨・長野", "lat": 35.7214, "lon": 138.1833},
    {"種類": "百名山", "山名": "鳳凰山", "標高": 2840, "所在地": "山梨", "lat": 35.7039, "lon": 138.3039},
    {"種類": "百名山", "山名": "北岳", "標高": 3193, "所在地": "山梨", "lat": 35.6744, "lon": 138.2389},
    {"種類": "百名山", "山名": "間ノ岳", "標高": 3190, "所在地": "山梨・静岡", "lat": 35.6458, "lon": 138.2281},
    {"種類": "百名山", "山名": "塩見岳", "標高": 3047, "所在地": "長野・静岡", "lat": 35.5739, "lon": 138.1831},
    {"種類": "百名山", "山名": "悪沢岳", "標高": 3141, "所在地": "静岡", "lat": 35.5008, "lon": 138.1819},
    {"種類": "百名山", "山名": "赤石岳", "標高": 3120, "所在地": "長野・静岡", "lat": 35.4611, "lon": 138.1578},
    {"種類": "百名山", "山名": "聖岳", "標高": 3013, "所在地": "長野・静岡", "lat": 35.4219, "lon": 138.1392},
    {"種類": "百名山", "山名": "光岳", "標高": 2591, "所在地": "長野・静岡", "lat": 35.3375, "lon": 138.0833},
    {"種類": "百名山", "山名": "白山", "標高": 2702, "所在地": "石川・岐阜", "lat": 36.1550, "lon": 136.7667},
    {"種類": "百名山", "山名": "荒島岳", "標高": 1523, "所在地": "福井", "lat": 35.9250, "lon": 136.6000},
    {"種類": "百名山", "山名": "富士山", "標高": 3776, "所在地": "静岡・山梨", "lat": 35.3606, "lon": 138.7274},
    {"種類": "百名山", "山名": "天城山", "標高": 1406, "所在地": "静岡", "lat": 34.8631, "lon": 138.9583},
    {"種類": "百名山", "山名": "瑞牆山", "標高": 2230, "所在地": "山梨", "lat": 35.8894, "lon": 138.5833},
    {"種類": "百名山", "山名": "金峰山", "標高": 2599, "所在地": "山梨・長野", "lat": 35.8719, "lon": 138.5861},
    {"種類": "百名山", "山名": "甲武信ヶ岳", "標高": 2475, "所在地": "山梨・埼玉・長野", "lat": 35.9103, "lon": 138.7283},
    {"種類": "百名山", "山名": "大菩薩嶺", "標高": 2057, "所在地": "山梨", "lat": 35.7486, "lon": 138.8458},
    {"種類": "百名山", "山名": "雲取山", "標高": 2017, "所在地": "東京・埼玉・山梨", "lat": 35.8550, "lon": 138.9419},
    {"種類": "百名山", "山名": "両神山", "標高": 1723, "所在地": "埼玉", "lat": 36.0239, "lon": 138.8350},
    {"種類": "百名山", "山名": "丹沢山", "標高": 1567, "所在地": "神奈川", "lat": 35.4744, "lon": 139.1619},
    {"種類": "百名山", "山名": "大台ヶ原山", "標高": 1695, "所在地": "三重・奈良", "lat": 34.1808, "lon": 136.1133},
    {"種類": "百名山", "山名": "大峰山", "標高": 1915, "所在地": "奈良", "lat": 34.1750, "lon": 135.9333},
    {"種類": "百名山", "山名": "大山", "標高": 1729, "所在地": "鳥取", "lat": 35.3719, "lon": 133.5414},
    {"種類": "百名山", "山名": "剣山", "標高": 1955, "所在地": "徳島", "lat": 33.8583, "lon": 134.1000},
    {"種類": "百名山", "山名": "石鎚山", "標高": 1982, "所在地": "愛媛", "lat": 33.7719, "lon": 133.1114},
    {"種類": "百名山", "山名": "九重山", "標高": 1791, "所在地": "大分", "lat": 33.0831, "lon": 131.2333},
    {"種類": "百名山", "山名": "祖母山", "標高": 1756, "所在地": "大分・宮崎", "lat": 32.8275, "lon": 131.3508},
    {"種類": "百名山", "山名": "阿蘇山", "標高": 1592, "所在地": "熊本", "lat": 32.8842, "lon": 131.0858},
    {"種類": "百名山", "山名": "霧島山", "標高": 1700, "所在地": "鹿児島・宮崎", "lat": 31.9317, "lon": 130.8539},
    {"種類": "百名山", "山名": "開聞岳", "標高": 924, "所在地": "鹿児島", "lat": 31.1794, "lon": 130.5283},
    {"種類": "百名山", "山名": "宮之浦岳", "標高": 1936, "所在地": "鹿児島", "lat": 30.3372, "lon": 130.5025},

    # --- 日本二百名山 (101-200) ---
    # 二百名山リスト
    {"種類": "二百名山", "山名": "天塩岳", "標高": 1558, "所在地": "北海道", "lat": 43.7656, "lon": 142.8886},
    {"種類": "二百名山", "山名": "石狩岳", "標高": 1967, "所在地": "北海道", "lat": 43.5419, "lon": 143.0189},
    {"種類": "二百名山", "山名": "音更山", "標高": 1932, "所在地": "北海道", "lat": 43.5558, "lon": 143.0333},
    {"種類": "二百名山", "山名": "ニペソツ山", "標高": 2013, "所在地": "北海道", "lat": 43.4550, "lon": 143.0367},
    {"種類": "二百名山", "山名": "芦別岳", "標高": 1726, "所在地": "北海道", "lat": 43.2356, "lon": 142.2844},
    {"種類": "二百名山", "山名": "夕張岳", "標高": 1668, "所在地": "北海道", "lat": 43.0975, "lon": 142.2514},
    {"種類": "二百名山", "山名": "カムイエクウチカウシ山", "標高": 1979, "所在地": "北海道", "lat": 42.6319, "lon": 142.7631},
    {"種類": "二百名山", "山名": "ペテガリ岳", "標高": 1736, "所在地": "北海道", "lat": 42.4981, "lon": 142.8586},
    {"種類": "二百名山", "山名": "余市岳", "標高": 1488, "所在地": "北海道", "lat": 43.0364, "lon": 141.0189},
    {"種類": "二百名山", "山名": "駒ヶ岳(渡島)", "標高": 1131, "所在地": "北海道", "lat": 42.0625, "lon": 140.6775},
    {"種類": "二百名山", "山名": "白神岳", "標高": 1235, "所在地": "青森", "lat": 40.5050, "lon": 140.0325},
    {"種類": "二百名山", "山名": "姫神山", "標高": 1124, "所在地": "岩手", "lat": 39.8436, "lon": 141.2411},
    {"種類": "二百名山", "山名": "秋田駒ヶ岳", "標高": 1637, "所在地": "秋田", "lat": 39.7567, "lon": 140.7986},
    {"種類": "二百名山", "山名": "和賀岳", "標高": 1440, "所在地": "秋田", "lat": 39.5714, "lon": 140.7533},
    {"種類": "二百名山", "山名": "焼石岳", "標高": 1548, "所在地": "岩手", "lat": 39.1633, "lon": 140.8808},
    {"種類": "二百名山", "山名": "栗駒山", "標高": 1627, "所在地": "岩手・宮城・秋田", "lat": 38.9614, "lon": 140.7878},
    {"種類": "二百名山", "山名": "神室山", "標高": 1365, "所在地": "秋田・山形", "lat": 38.8942, "lon": 140.4853},
    {"種類": "二百名山", "山名": "森吉山", "標高": 1454, "所在地": "秋田", "lat": 39.9769, "lon": 140.5450},
    {"種類": "二百名山", "山名": "以東岳", "標高": 1772, "所在地": "山形・新潟", "lat": 38.3308, "lon": 139.8517},
    {"種類": "二百名山", "山名": "船形山", "標高": 1500, "所在地": "宮城・山形", "lat": 38.4550, "lon": 140.6222},
    {"種類": "二百名山", "山名": "針ノ木岳", "標高": 2821, "所在地": "富山・長野", "lat": 36.5383, "lon": 137.6833},
    {"種類": "二百名山", "山名": "蓮華岳", "標高": 2799, "所在地": "富山・長野", "lat": 36.5256, "lon": 137.7125},
    {"種類": "二百名山", "山名": "烏帽子岳", "標高": 2628, "所在地": "富山・長野", "lat": 36.4428, "lon": 137.6253},
    {"種類": "二百名山", "山名": "野口五郎岳", "標高": 2924, "所在地": "富山・長野", "lat": 36.4314, "lon": 137.6353},
    {"種類": "二百名山", "山名": "毛勝山", "標高": 2415, "所在地": "富山", "lat": 36.7578, "lon": 137.5611},
    {"種類": "二百名山", "山名": "金剛山", "標高": 1125, "所在地": "奈良・大阪", "lat": 34.4194, "lon": 135.6744},
    {"種類": "二百名山", "山名": "三瓶山", "標高": 1126, "所在地": "島根", "lat": 35.1311, "lon": 132.6242},
    {"種類": "二百名山", "山名": "由布岳", "標高": 1583, "所在地": "大分", "lat": 33.2811, "lon": 131.3917},
    {"種類": "二百名山", "山名": "武甲山", "標高": 1304, "所在地": "埼玉", "lat": 35.9408, "lon": 139.1158},
    {"種類": "二百名山", "山名": "大山(丹沢)", "標高": 1252, "所在地": "神奈川", "lat": 35.4411, "lon": 139.2311},
    {"種類": "二百名山", "山名": "金剛堂山", "標高": 1639, "所在地": "富山", "lat": 36.3778, "lon": 137.0344},
    {"種類": "二百名山", "山名": "笈ヶ岳", "標高": 1841, "所在地": "石川・岐阜", "lat": 36.2167, "lon": 136.8167},
    {"種類": "二百名山", "山名": "大日岳", "標高": 1709, "所在地": "岐阜", "lat": 35.9861, "lon": 136.8142},
    {"種類": "二百名山", "山名": "位山", "標高": 1529, "所在地": "岐阜", "lat": 36.0150, "lon": 137.2000},
    {"種類": "二百名山", "山名": "小秀山", "標高": 1982, "所在地": "岐阜・長野", "lat": 35.8167, "lon": 137.3667},
    {"種類": "二百名山", "山名": "経ヶ岳", "標高": 2296, "所在地": "長野", "lat": 35.9125, "lon": 137.8542},
    {"種類": "二百名山", "山名": "大無間山", "標高": 2329, "所在地": "静岡", "lat": 35.1833, "lon": 138.1333},
    {"種類": "二百名山", "山名": "乾徳山", "標高": 2031, "所在地": "山梨", "lat": 35.8458, "lon": 138.7125},
    {"種類": "二百名山", "山名": "三ツ峠山", "標高": 1785, "所在地": "山梨", "lat": 35.5458, "lon": 138.8108},
    {"種類": "二百名山", "山名": "茅ヶ岳", "標高": 1704, "所在地": "山梨", "lat": 35.7958, "lon": 138.5042},
    {"種類": "二百名山", "山名": "愛鷹山", "標高": 1504, "所在地": "静岡", "lat": 35.2167, "lon": 138.8000},
    {"種類": "二百名山", "山名": "御在所岳", "標高": 1212, "所在地": "三重・滋賀", "lat": 35.0189, "lon": 136.4217},
    {"種類": "二百名山", "山名": "釈迦ヶ岳", "標高": 1800, "所在地": "奈良", "lat": 34.0833, "lon": 135.8833},
    {"種類": "二百名山", "山名": "伯耆大山", "標高": 1729, "所在地": "鳥取", "lat": 35.3719, "lon": 133.5414},
    {"種類": "二百名山", "山名": "氷ノ山", "標高": 1510, "所在地": "兵庫・鳥取", "lat": 35.3533, "lon": 134.5133},
    {"種類": "二百名山", "山名": "上蒜山", "標高": 1202, "所在地": "岡山・鳥取", "lat": 35.3167, "lon": 133.6500},
    {"種類": "二百名山", "山名": "東赤石山", "標高": 1706, "所在地": "愛媛", "lat": 33.8667, "lon": 133.3667},
    {"種類": "二百名山", "山名": "笹ヶ峰", "標高": 1859, "所在地": "愛媛・高知", "lat": 33.8333, "lon": 133.2667},
    {"種類": "二百名山", "山名": "三嶺", "標高": 1893, "所在地": "徳島・高知", "lat": 33.8406, "lon": 133.9858},
    {"種類": "二百名山", "山名": "英彦山", "標高": 1200, "所在地": "福岡・大分", "lat": 33.4764, "lon": 130.9250},
    {"種類": "二百名山", "山名": "市房山", "標高": 1721, "所在地": "熊本・宮崎", "lat": 32.3117, "lon": 131.1022},
    {"種類": "二百名山", "山名": "尾鈴山", "標高": 1405, "所在地": "宮崎", "lat": 32.2961, "lon": 131.4247},
    {"種類": "二百名山", "山名": "高千穂峰", "標高": 1574, "所在地": "宮崎・鹿児島", "lat": 31.8856, "lon": 130.8872},
    {"種類": "二百名山", "山名": "大尽山", "標高": 828, "所在地": "青森", "lat": 41.3167, "lon": 141.1333},
    {"種類": "二百名山", "山名": "森吉山", "標高": 1454, "所在地": "秋田", "lat": 39.9769, "lon": 140.5450},
    {"種類": "二百名山", "山名": "山伏", "標高": 2013, "所在地": "山梨・静岡", "lat": 35.3117, "lon": 138.3181},
    {"種類": "二百名山", "山名": "大安在岳", "標高": 1600, "所在地": "宮崎", "lat": 32.5333, "lon": 131.4333},
    {"種類": "二百名山", "山名": "雲仙岳", "標高": 1359, "所在地": "長崎", "lat": 32.7611, "lon": 130.2931},
    {"種類": "二百名山", "山名": "大毛無山", "標高": 1429, "所在地": "新潟", "lat": 36.9833, "lon": 138.1500},
    {"種類": "二百名山", "山名": "五頭山", "標高": 912, "所在地": "新潟", "lat": 37.8250, "lon": 139.3167},
    {"種類": "二百名山", "山名": "二王子岳", "標高": 1420, "所在地": "新潟", "lat": 37.9500, "lon": 139.4333},
    {"種類": "二百名山", "山名": "守門岳", "標高": 1537, "所在地": "新潟", "lat": 37.4000, "lon": 139.1500},
    {"種類": "二百名山", "山名": "浅草岳", "標高": 1585, "所在地": "新潟・福島", "lat": 37.3417, "lon": 139.2333},
    {"種類": "二百名山", "山名": "毛無山(山梨)", "標高": 1964, "所在地": "山梨・静岡", "lat": 35.4117, "lon": 138.5681},
    {"種類": "二百名山", "山名": "篠井山", "標高": 1394, "所在地": "山梨", "lat": 35.2533, "lon": 138.4533},
    {"種類": "二百名山", "山名": "七面山", "標高": 1982, "所在地": "山梨", "lat": 35.3833, "lon": 138.3583},
    {"種類": "二百名山", "山名": "笊ヶ岳", "標高": 2629, "所在地": "山梨・静岡", "lat": 35.4533, "lon": 138.2533},
    {"種類": "二百名山", "山名": "奥茶臼山", "標高": 2474, "所在地": "長野", "lat": 35.5333, "lon": 138.0333},
    {"種類": "二百名山", "山名": "安平路山", "標高": 2363, "所在地": "長野", "lat": 35.6033, "lon": 137.7667},
    {"種類": "二百名山", "山名": "南駒ヶ岳", "標高": 2841, "所在地": "長野", "lat": 35.7333, "lon": 137.8000},
    {"種類": "二百名山", "山名": "越百山", "標高": 2613, "所在地": "長野", "lat": 35.7000, "lon": 137.7833},
    {"種類": "二百名山", "山名": "池口岳", "標高": 2392, "所在地": "長野・静岡", "lat": 35.3167, "lon": 138.0167},
    {"種類": "二百名山", "山名": "黒法師岳", "標高": 2067, "所在地": "静岡", "lat": 35.1833, "lon": 138.0167},
    {"種類": "二百名山", "山名": "大札山", "標高": 1374, "所在地": "静岡", "lat": 35.1167, "lon": 138.1167},
    {"種類": "二百名山", "山名": "山伏岳", "標高": 2013, "所在地": "静岡・山梨", "lat": 35.3167, "lon": 138.3167},
    {"種類": "二百名山", "山名": "十枚山", "標高": 1720, "所在地": "静岡・山梨", "lat": 35.2667, "lon": 138.3833},
    {"種類": "二百名山", "山名": "竜ヶ岳(三重)", "標高": 1099, "所在地": "三重・滋賀", "lat": 35.1533, "lon": 136.4333},
    {"種類": "二百名山", "山名": "藤原岳", "標高": 1144, "所在地": "三重・滋賀", "lat": 35.1833, "lon": 136.4500},
    {"種類": "二百名山", "山名": "綿向山", "標高": 1110, "所在地": "滋賀", "lat": 35.0167, "lon": 136.3167},
    {"種類": "二百名山", "山名": "武奈ヶ岳", "標高": 1214, "所在地": "滋賀", "lat": 35.2631, "lon": 135.8972},
    {"種類": "二百名山", "山名": "蓬莱山", "標高": 1174, "所在地": "滋賀", "lat": 35.2133, "lon": 135.8833},
    {"種類": "二百名山", "山名": "御岳(兵庫)", "標高": 793, "所在地": "兵庫", "lat": 35.1333, "lon": 135.2500},
    {"種類": "二百名山", "山名": "扇ノ山", "標高": 1310, "所在地": "兵庫・鳥取", "lat": 35.4333, "lon": 134.4500},
    {"種類": "二百名山", "山名": "蒜山(下)", "標高": 1100, "所在地": "岡山・鳥取", "lat": 35.3133, "lon": 133.6833},
    {"種類": "二百名山", "山名": "道後山", "標高": 1268, "所在地": "広島・鳥取", "lat": 35.0667, "lon": 133.2500},
    {"種類": "二百名山", "山名": "吾妻山(広島)", "標高": 1239, "所在地": "広島・島根", "lat": 35.0667, "lon": 133.1333},
    {"種類": "二百名山", "山名": "冠山(広島)", "標高": 1339, "所在地": "広島", "lat": 34.4667, "lon": 132.0833},
    {"種類": "二百名山", "山名": "寂地山", "標高": 1337, "所在地": "山口・島根", "lat": 34.4667, "lon": 132.0500},
    {"種類": "二百名山", "山名": "東三瓶山", "標高": 1126, "所在地": "島根", "lat": 35.1333, "lon": 132.6167},
    {"種類": "二百名山", "山名": "小豆島星ヶ城", "標高": 816, "所在地": "香川", "lat": 34.5000, "lon": 134.3333},
    {"種類": "二百名山", "山名": "寒霞渓", "標高": 612, "所在地": "香川", "lat": 34.5167, "lon": 134.3000},
    {"種類": "二百名山", "山名": "伊予富士", "標高": 1756, "所在地": "愛媛・高知", "lat": 33.7833, "lon": 133.2500},
    {"種類": "二百名山", "山名": "瓶ヶ森", "標高": 1897, "所在地": "愛媛・高知", "lat": 33.7833, "lon": 133.1833},
    {"種類": "二百名山", "山名": "手箱山", "標高": 1806, "所在地": "高知", "lat": 33.7500, "lon": 133.1500},
    {"種類": "二百名山", "山名": "工石山", "標高": 1176, "所在地": "高知", "lat": 33.6667, "lon": 133.5167},
    {"種類": "二百名山", "山名": "背振山", "標高": 1055, "所在地": "福岡・佐賀", "lat": 33.4333, "lon": 130.3500},
    {"種類": "二百名山", "山名": "多良岳", "標高": 996, "所在地": "長崎・佐賀", "lat": 32.9750, "lon": 130.0833},
    {"種類": "二百名山", "山名": "涌蓋山", "標高": 1500, "所在地": "大分・熊本", "lat": 33.1500, "lon": 131.1333},
    {"種類": "二百名山", "山名": "大船山", "標高": 1786, "所在地": "大分", "lat": 33.1167, "lon": 131.2667},
    {"種類": "二百名山", "山名": "傾山", "標高": 1605, "所在地": "大分・宮崎", "lat": 32.8667, "lon": 131.4833},

    # --- 日本三百名山 (201-300) ---
    # 三百名山リスト
    {"種類": "三百名山", "山名": "オプタテシケ山", "標高": 2013, "所在地": "北海道", "lat": 43.4697, "lon": 142.7486},
    {"種類": "三百名山", "山名": "ニセイカウシュッペ山", "標高": 1883, "所在地": "北海道", "lat": 43.7917, "lon": 142.9861},
    {"種類": "三百名山", "山名": "標津岳", "標高": 1061, "所在地": "北海道", "lat": 43.7633, "lon": 144.7558},
    {"種類": "三百名山", "山名": "摩周岳", "標高": 857, "所在地": "北海道", "lat": 43.5850, "lon": 144.5511},
    {"種類": "三百名山", "山名": "崕山", "標高": 1066, "所在地": "北海道", "lat": 43.1411, "lon": 142.1864},
    {"種類": "三百名山", "山名": "アポイ岳", "標高": 810, "所在地": "北海道", "lat": 42.1064, "lon": 143.0233},
    {"種類": "三百名山", "山名": "八剣山", "標高": 466, "所在地": "北海道", "lat": 42.9644, "lon": 141.2064},
    {"種類": "三百名山", "山名": "神威岳", "標高": 1600, "所在地": "北海道", "lat": 42.4217, "lon": 142.8683},
    {"種類": "三百名山", "山名": "釜臥山", "標高": 878, "所在地": "青森", "lat": 41.2789, "lon": 141.1308},
    {"種類": "三百名山", "山名": "梵珠山", "標高": 468, "所在地": "青森", "lat": 40.7936, "lon": 140.5986},
    {"種類": "三百名山", "山名": "白森山", "標高": 1042, "所在地": "秋田", "lat": 40.4033, "lon": 140.7500},
    {"種類": "三百名山", "山名": "太平山", "標高": 1170, "所在地": "秋田", "lat": 39.7983, "lon": 140.3442},
    {"種類": "三百名山", "山名": "五葉山", "標高": 1351, "所在地": "岩手", "lat": 39.2047, "lon": 141.7317},
    {"種類": "三百名山", "山名": "経塚山", "標高": 1373, "所在地": "岩手", "lat": 39.2558, "lon": 140.9167},
    {"種類": "三百名山", "山名": "泉ヶ岳", "標高": 1172, "所在地": "宮城", "lat": 38.4117, "lon": 140.7108},
    {"種類": "三百名山", "山名": "神室山(宮城)", "標高": 1355, "所在地": "宮城", "lat": 38.8500, "lon": 140.6333},
    {"種類": "三百名山", "山名": "祝瓶山", "標高": 1417, "所在地": "山形", "lat": 38.1147, "lon": 139.9100},
    {"種類": "三百名山", "山名": "薬師岳(山形)", "標高": 1213, "所在地": "山形", "lat": 38.4617, "lon": 140.0633},
    {"種類": "三百名山", "山名": "小野岳", "標高": 1383, "所在地": "福島", "lat": 37.3364, "lon": 139.9186},
    {"種類": "三百名山", "山名": "七ヶ岳", "標高": 1636, "所在地": "福島", "lat": 37.1217, "lon": 139.6333},
    {"種類": "三百名山", "山名": "八溝山", "標高": 1022, "所在地": "茨城・栃木", "lat": 36.9358, "lon": 140.2750},
    {"種類": "三百名山", "山名": "男体山(奥久慈)", "標高": 654, "所在地": "茨城", "lat": 36.7214, "lon": 140.3900},
    {"種類": "三百名山", "山名": "高原山", "標高": 1795, "所在地": "栃木", "lat": 36.8975, "lon": 139.7783},
    {"種類": "三百名山", "山名": "鳴神山", "標高": 980, "所在地": "群馬", "lat": 36.4883, "lon": 139.3833},
    {"種類": "三百名山", "山名": "諏訪山", "標高": 1549, "所在地": "群馬", "lat": 36.0681, "lon": 138.7450},
    {"種類": "三百名山", "山名": "笠取山", "標高": 1953, "所在地": "埼玉・山梨", "lat": 35.8953, "lon": 138.8219},
    {"種類": "三百名山", "山名": "大岳山", "標高": 1266, "所在地": "東京", "lat": 35.7558, "lon": 139.1308},
    {"種類": "三百名山", "山名": "三頭山", "標高": 1531, "所在地": "東京・山梨", "lat": 35.7369, "lon": 139.0300},
    {"種類": "三百名山", "山名": "御正体山", "標高": 1681, "所在地": "山梨", "lat": 35.5183, "lon": 138.9317},
    {"種類": "三百名山", "山名": "箱根山", "標高": 1438, "所在地": "神奈川", "lat": 35.2344, "lon": 139.0194},
    {"種類": "三百名山", "山名": "坂戸山", "標高": 634, "所在地": "新潟", "lat": 37.0617, "lon": 138.8950},
    {"種類": "三百名山", "山名": "五頭山", "標高": 912, "所在地": "新潟", "lat": 37.8250, "lon": 139.3167},
    {"種類": "三百名山", "山名": "米山", "標高": 993, "所在地": "新潟", "lat": 37.2833, "lon": 138.4833},
    {"種類": "三百名山", "山名": "鉾ヶ岳", "標高": 1316, "所在地": "新潟", "lat": 37.0167, "lon": 138.0500},
    {"種類": "三百名山", "山名": "金北山", "標高": 1172, "所在地": "新潟", "lat": 38.0333, "lon": 138.3500},
    {"種類": "三百名山", "山名": "白木峰", "標高": 1596, "所在地": "富山・岐阜", "lat": 36.3750, "lon": 137.1167},
    {"種類": "三百名山", "山名": "人形山", "標高": 1726, "所在地": "富山・岐阜", "lat": 36.3167, "lon": 136.9167},
    {"種類": "三百名山", "山名": "大門山", "標高": 1572, "所在地": "石川・富山", "lat": 36.3333, "lon": 136.8333},
    {"種類": "三百名山", "山名": "大笠山", "標高": 1822, "所在地": "石川・富山", "lat": 36.2833, "lon": 136.8000},
    {"種類": "三百名山", "山名": "冠山", "標高": 1257, "所在地": "福井・岐阜", "lat": 35.7833, "lon": 136.4167},
    {"種類": "三百名山", "山名": "能郷白山", "標高": 1617, "所在地": "福井・岐阜", "lat": 35.7667, "lon": 136.5000},
    {"種類": "三百名山", "山名": "夜叉ヶ池山", "標高": 1100, "所在地": "福井・岐阜", "lat": 35.7333, "lon": 136.3167},
    {"種類": "三百名山", "山名": "経ヶ岳(越前)", "標高": 1625, "所在地": "福井", "lat": 36.0500, "lon": 136.6333},
    {"種類": "三百名山", "山名": "青葉山", "標高": 693, "所在地": "福井・京都", "lat": 35.5000, "lon": 135.4833},
    {"種類": "三百名山", "山名": "簗谷山", "標高": 1213, "所在地": "岐阜", "lat": 35.7667, "lon": 137.1833},
    {"種類": "三百名山", "山名": "奥三界岳", "標高": 1810, "所在地": "長野・岐阜", "lat": 35.6500, "lon": 137.4500},
    {"種類": "三百名山", "山名": "入笠山", "標高": 1955, "所在地": "長野", "lat": 35.8975, "lon": 138.1722},
    {"種類": "三百名山", "山名": "守屋山", "標高": 1650, "所在地": "長野", "lat": 35.9667, "lon": 138.0833},
    {"種類": "三百名山", "山名": "鉢伏山", "標高": 1929, "所在地": "長野", "lat": 36.1550, "lon": 138.0500},
    {"種類": "三百名山", "山名": "小川山", "標高": 2418, "所在地": "長野・山梨", "lat": 35.9000, "lon": 138.6000},
    {"種類": "三百名山", "山名": "天狗岳", "標高": 2646, "所在地": "長野", "lat": 36.0192, "lon": 138.3583},
    {"種類": "三百名山", "山名": "硫黄岳", "標高": 2760, "所在地": "長野", "lat": 35.9967, "lon": 138.3667},
    {"種類": "三百名山", "山名": "御座山", "標高": 2112, "所在地": "長野", "lat": 36.0333, "lon": 138.5667},
    {"種類": "三百名山", "山名": "黒川山", "標高": 1628, "所在地": "山梨", "lat": 35.8167, "lon": 138.8333},
    {"種類": "三百名山", "山名": "節刀ヶ岳", "標高": 1736, "所在地": "山梨", "lat": 35.5333, "lon": 138.7167},
    {"種類": "三百名山", "山名": "十二ヶ岳", "標高": 1683, "所在地": "山梨", "lat": 35.5167, "lon": 138.7333},
    {"種類": "三百名山", "山名": "黒岳(御坂)", "標高": 1793, "所在地": "山梨", "lat": 35.5333, "lon": 138.7833},
    {"種類": "三百名山", "山名": "釈迦ヶ岳(山梨)", "標高": 1641, "所在地": "山梨", "lat": 35.5333, "lon": 138.6500},
    {"種類": "三百名山", "山名": "満観峰", "標高": 470, "所在地": "静岡", "lat": 34.9167, "lon": 138.3167},
    {"種類": "三百名山", "山名": "高塚山", "標高": 1621, "所在地": "静岡", "lat": 35.1167, "lon": 138.0333},
    {"種類": "三百名山", "山名": "蕎麦粒山", "標高": 1627, "所在地": "静岡", "lat": 35.1500, "lon": 138.1000},
    {"種類": "三百名山", "山名": "藤原岳", "標高": 1144, "所在地": "三重", "lat": 35.1833, "lon": 136.4500},
    {"種類": "三百名山", "山名": "三峰山", "標高": 1235, "所在地": "奈良・三重", "lat": 34.4167, "lon": 136.1833},
    {"種類": "三百名山", "山名": "高見山", "標高": 1248, "所在地": "奈良・三重", "lat": 34.4167, "lon": 136.0833},
    {"種類": "三百名山", "山名": "竜門岳", "標高": 904, "所在地": "奈良", "lat": 34.4500, "lon": 135.9167},
    {"種類": "三百名山", "山名": "護摩壇山", "標高": 1372, "所在地": "和歌山・奈良", "lat": 34.0500, "lon": 135.5667},
    {"種類": "三百名山", "山名": "六甲山", "標高": 931, "所在地": "兵庫", "lat": 34.7775, "lon": 135.2639},
    {"種類": "三百名山", "山名": "楡原大山", "標高": 600, "所在地": "富山", "lat": 36.5333, "lon": 137.2167},
    {"種類": "三百名山", "山名": "那岐山", "標高": 1255, "所在地": "岡山・鳥取", "lat": 35.1667, "lon": 134.1667},
    {"種類": "三百名山", "山名": "蒜山(中)", "標高": 1123, "所在地": "岡山・鳥取", "lat": 35.3167, "lon": 133.6667},
    {"種類": "三百名山", "山名": "三瓶山", "標高": 1126, "所在地": "島根", "lat": 35.1311, "lon": 132.6242},
    {"種類": "三百名山", "山名": "大江山", "標高": 832, "所在地": "京都", "lat": 35.4500, "lon": 135.1333},
    {"種類": "三百名山", "山名": "比叡山", "標高": 848, "所在地": "京都・滋賀", "lat": 35.0667, "lon": 135.8333},
    {"種類": "三百名山", "山名": "愛宕山", "標高": 924, "所在地": "京都", "lat": 35.0667, "lon": 135.6333},
    {"種類": "三百名山", "山名": "皆ヶ作山", "標高": 1100, "所在地": "鳥取・島根", "lat": 35.2167, "lon": 133.1500},
    {"種類": "三百名山", "山名": "大将軍山", "標高": 450, "所在地": "山口", "lat": 34.1167, "lon": 131.5500},
    {"種類": "三百名山", "山名": "飯の山", "標高": 263, "所在地": "山口", "lat": 33.9500, "lon": 132.2167},
    {"種類": "三百名山", "山名": "竜王山(下関)", "標高": 614, "所在地": "山口", "lat": 34.0833, "lon": 130.9333},
    {"種類": "三百名山", "山名": "眉山", "標高": 290, "所在地": "徳島", "lat": 34.0667, "lon": 134.5333},
    {"種類": "三百名山", "山名": "高越山", "標高": 1133, "所在地": "徳島", "lat": 34.0167, "lon": 134.2167},
    {"種類": "三百名山", "山名": "雲辺寺山", "標高": 927, "所在地": "徳島・香川", "lat": 34.0333, "lon": 133.7167},
    {"種類": "三百名山", "山名": "飯野山", "標高": 422, "所在地": "香川", "lat": 34.2833, "lon": 133.8167},
    {"種類": "三百名山", "山名": "象頭山", "標高": 538, "所在地": "香川", "lat": 34.1833, "lon": 133.7833},
    {"種類": "三百名山", "山名": "東三瓶山", "標高": 1126, "所在地": "島根", "lat": 35.1333, "lon": 132.6167},
    {"種類": "三百名山", "山名": "瓶ヶ森", "標高": 1897, "所在地": "愛媛", "lat": 33.7833, "lon": 133.1833},
    {"種類": "三百名山", "山名": "篠山", "標高": 1065, "所在地": "愛媛・高知", "lat": 32.9667, "lon": 132.6500},
    {"種類": "三百名山", "山名": "工石山", "標高": 1176, "所在地": "高知", "lat": 33.6667, "lon": 133.5167},
    {"種類": "三百名山", "山名": "不入山", "標高": 1336, "所在地": "高知", "lat": 33.4833, "lon": 133.0167},
    {"種類": "三百名山", "山名": "福智山", "標高": 900, "所在地": "福岡", "lat": 33.7333, "lon": 130.7833},
    {"種類": "三百名山", "山名": "宝満山", "標高": 829, "所在地": "福岡", "lat": 33.5333, "lon": 130.5833},
    {"種類": "三百名山", "山名": "井原山", "標高": 983, "所在地": "福岡・佐賀", "lat": 33.4500, "lon": 130.2000},
    {"種類": "三百名山", "山名": "作礼山", "標高": 887, "所在地": "佐賀", "lat": 33.3333, "lon": 130.0833},
    {"種類": "三百名山", "山名": "黒髪山", "標高": 516, "所在地": "佐賀", "lat": 33.2333, "lon": 129.9167},
    {"種類": "三百名山", "山名": "経ヶ岳(多良)", "標高": 1076, "所在地": "長崎・佐賀", "lat": 32.9833, "lon": 130.0667},
    {"種類": "三百名山", "山名": "国見岳(熊本)", "標高": 1739, "所在地": "熊本・宮崎", "lat": 32.5033, "lon": 131.0258},
    {"種類": "三百名山", "山名": "鶴見岳", "標高": 1375, "所在地": "大分", "lat": 33.2892, "lon": 131.4286},
    {"種類": "三百名山", "山名": "由布岳", "標高": 1583, "所在地": "大分", "lat": 33.2811, "lon": 131.3917},
    {"種類": "三百名山", "山名": "大崩山", "標高": 1641, "所在地": "宮崎", "lat": 32.6500, "lon": 131.5000},
    {"種類": "三百名山", "山名": "白岩山", "標高": 1641, "所在地": "宮崎", "lat": 32.4667, "lon": 131.1833},
    {"種類": "三百名山", "山名": "高隈山", "標高": 1237, "所在地": "鹿児島", "lat": 31.4667, "lon": 130.8167}
]

# DataFrameに変換してCSV保存
df = pd.DataFrame(mountains_data)
df.to_csv("mountains300.csv", index=False, encoding="utf-8-sig")
print("成功: 300名山CSVを生成しました。")

 This was a kind of power move.

  I'm able to prepare the hundreds moutain list and create a file with these datas.

 Skipping over the intermediate steps, the app that stores records of summits of the Japan Alpine Club's 100, 200, and 300 famous mountains has initially turned out like this.

import streamlit as st
import folium
from folium.plugins import MarkerCluster
from streamlit_folium import st_folium
from streamlit_gsheets import GSheetsConnection
import pandas as pd
import os
import datetime

# --- ページ設定 ---
st.set_page_config(layout="wide", page_title="日本三百名山・登山ログ")

st.title("🏞️ 日本三百名山・登山ログ(完全統合版)")

# --- 定数設定 ---
CSV_FILE = "mountains300.csv"

# --- 1. データ読み込み(ローカル優先ハイブリッド) ---
def load_mountain_data():
    df = None
    # A. ローカルのCSVファイルを最優先で確認
    if os.path.exists(CSV_FILE):
        try:
            df = pd.read_csv(CSV_FILE, encoding="utf-8-sig")
            st.sidebar.success("📂 ローカルのCSVを使用中")
        except Exception as e:
            st.error(f"CSVの読み込みに失敗しました: {e}")
   
    # B. CSVがない場合のみクラウド(GSheets)を確認
    if df is None:
        try:
            conn = st.connection("gsheets", type=GSheetsConnection)
            df = conn.read(ttl=0)
            st.sidebar.info("☁️ クラウドのデータを使用中")
        except Exception as e:
            st.error("❌ データが見つかりません。Secretsの設定等を確認してください。")
            st.stop()
           
    # データ型の整理と新列(登頂日)の確保
    df["lat"] = pd.to_numeric(df["lat"], errors='coerce')
    df["lon"] = pd.to_numeric(df["lon"], errors='coerce')
   
    if "登頂済み" not in df.columns:
        df["登頂済み"] = False
    else:
        df["登頂済み"] = df["登頂済み"].astype(str).str.upper().map({'TRUE': True, 'FALSE': False}).fillna(False)
   
    if "登頂日" not in df.columns:
        df["登頂日"] = ""
    else:
        df["登頂日"] = df["登頂日"].fillna("").astype(str).replace("nan", "")
   
    return df

df_300 = load_mountain_data()

# --- 2. 地方区分データの定義 ---
REGION_MAP = {
    "北海道": ["北海道"], "東北": ["青森", "岩手", "宮城", "秋田", "山形", "福島"],
    "関東": ["茨城", "栃木", "群馬", "埼玉", "千葉", "東京", "神奈川"],
    "北陸・甲信越": ["新潟", "富山", "石川", "福井", "山梨", "長野"],
    "東海": ["岐阜", "静岡", "愛知", "三重"], "近畿": ["滋賀", "京都", "大阪", "兵庫", "奈良", "和歌山"],
    "中国": ["鳥取", "島根", "岡山", "広島", "山口"], "四国": ["徳島", "香川", "愛媛", "高知"],
    "九州・沖縄": ["福岡", "佐賀", "長崎", "熊本", "大分", "宮崎", "鹿児島", "沖縄"]
}

# --- 3. サイドバー ---
with st.sidebar:
    st.header("🏔️ 山歩き記録帳")
    selected_region = st.selectbox("表示エリアを選択", ["全国"] + list(REGION_MAP.keys()))
   
    st.markdown("---")
    map_style = st.radio("地図スタイル", ["標準地図", "淡色地図", "シームレス空中写真"])
   
    st.markdown("---")
    done_count = df_300["登頂済み"].sum()
    total_mountains = len(df_300)
    st.metric("合計登頂数", f"{done_count} / {total_mountains}", f"{done_count/total_mountains:.1%}")
   
    with st.expander("📝 開発・操作メモ"):
        st.caption("地図上のピンをクリックすると、下のリストが連動してソートされます。")

# --- 4. フィルタリングと座標設定 ---
if selected_region == "全国":
    display_df = df_300.copy()
    c_lat, c_lon, zoom = 36.2, 138.2, 5
else:
    prefs = REGION_MAP[selected_region]
    display_df = df_300[df_300["所在地"].apply(lambda x: any(p in str(x) for p in prefs))]
    if not display_df.empty:
        c_lat, c_lon = display_df["lat"].mean(), display_df["lon"].mean()
        zoom = 7 if selected_region != "北海道" else 6
    else:
        c_lat, c_lon, zoom = 36.2, 138.2, 5

# --- 5. 地図描画 ---
st.subheader(f"🗺️ {selected_region}の名山マップ")

map_tiles = {
    "標準地図": "https://cyberjapandata.gsi.go.jp/xyz/std/{z}/{x}/{y}.png",
    "淡色地図": "https://cyberjapandata.gsi.go.jp/xyz/pale/{z}/{x}/{y}.png",
    "シームレス空中写真": "https://cyberjapandata.gsi.go.jp/xyz/seamlessphoto/{z}/{x}/{y}.jpg"
}

m = folium.Map(location=[c_lat, c_lon], zoom_start=zoom, tiles=map_tiles[map_style], attr="国土地理院")

# クラスターのデザイン設定
icon_js = """
    function(cluster) {
        var count = cluster.getChildCount();
        return new L.DivIcon({
            html: '<div style="background-color: rgba(30, 30, 30, 0.85); border: 2px solid #fff; border-radius: 50%; width: 40px; height: 40px; display: flex; align-items: center; justify-content: center;"><span style="color: white; font-weight: bold;">' + count + '</span></div>',
            className: 'marker-cluster', iconSize: new L.Point(40, 40)
        });
    }
"""
marker_cluster = MarkerCluster(icon_create_function=icon_js).add_to(m)

for idx, row in display_df.iterrows():
    is_done = row["登頂済み"]
    color = "orange" if is_done else ("red" if row["種類"]=="百名山" else "blue" if row["種類"]=="二百名山" else "green")
    icon_img = "trophy" if is_done else "mountain"
   
    date_info = f"<br>登頂日: {row['登頂日']}" if row['登頂日'] else ""
    popup_html = f"""
    <div style="width: 180px; font-family: sans-serif; line-height: 1.5;">
        <p style="margin: 0; font-size: 11px; color: {color}; font-weight: bold;">【{row['種類']}{' ✨登頂済み' if is_done else ''}</p>
        <p style="margin: 0; font-size: 16px; font-weight: bold; color: #333;">{row['山名']}</p>
        <div style="margin: 5px 0; border-top: 1px solid #eee;"></div>
        <p style="margin: 0; font-size: 12px; color: #666;">標高: <span style="font-size: 14px; font-weight: bold; color: #000;">{row['標高']} m</span></p>
        <p style="margin: 0; font-size: 11px; color: #999;">所在地: {row['所在地']}{date_info}</p>
    </div>
    """
   
    folium.Marker(
        [row["lat"], row["lon"]],
        popup=folium.Popup(popup_html, max_width=250),
        icon=folium.Icon(color=color, icon=icon_img, prefix="fa")
    ).add_to(marker_cluster)

# 地図表示・クリックオブジェクト取得
map_data = st_folium(m, width=None, height=550, use_container_width=True, key="mt_hybrid_map")

# --- 6. クリック連動ロジック(復活機能) ---
clicked_mt_name = None
if map_data and map_data.get("last_object_clicked"):
    clat, clon = map_data["last_object_clicked"]["lat"], map_data["last_object_clicked"]["lng"]
    # 距離が最も近い山を特定して選択
    display_df["tmp_dist"] = (display_df["lat"] - clat)**2 + (display_df["lon"] - clon)**2
    nearest = display_df.sort_values("tmp_dist").iloc[0]
    if nearest["tmp_dist"] < 0.001:
        clicked_mt_name = nearest["山名"]
        st.info(f"📍 **{clicked_mt_name}** を選択中(下のリストの先頭に表示しています)")

# --- 7. リスト表示と保存(連動ソート対応) ---
st.markdown("---")
st.subheader("📋 登頂記録の編集")

# 種類順の重み付け
rank_order = {"百名山": 1, "二百名山": 2, "三百名山": 3}
display_sorted = display_df.copy()
display_sorted["rank_weight"] = display_sorted["種類"].map(rank_order).fillna(4)

# クリックされた山を最優先(0)にする
if clicked_mt_name:
    display_sorted.loc[display_sorted["山名"] == clicked_mt_name, "rank_weight"] = 0

display_sorted = display_sorted.sort_values(by=["rank_weight", "山名"])

edited_df = st.data_editor(
    display_sorted[["登頂済み", "登頂日", "種類", "山名", "標高", "所在地"]],
    use_container_width=True, height=500, hide_index=True,
    disabled=["種類", "山名", "標高", "所在地"], key="mt_editor"
)

if st.button("✅ 変更を確定して保存する", type="primary"):
    # 全体データ(df_300)の該当行を更新
    for _, r in edited_df.iterrows():
        df_300.loc[df_300["山名"] == r["山名"], ["登頂済み", "登頂日"]] = [r["登頂済み"], r["登頂日"]]
   
    # 保存処理(ローカルかクラウドか自動判断)
    if os.path.exists(CSV_FILE):
        try:
            df_300.to_csv(CSV_FILE, index=False, encoding="utf-8-sig")
            st.success("💾 ローカルCSVに保存が完了しました!")
            st.rerun()
        except Exception as e:
            st.error(f"CSV保存エラー: {e}")
    else:
        try:
            conn = st.connection("gsheets", type=GSheetsConnection)
            conn.update(data=df_300)
            st.success("☁️ クラウド(GSheets)に保存が完了しました!")
            st.balloons()
            st.rerun()
        except Exception as e:
            st.error(f"クラウド保存エラー: {e}")

# --- 8. 免責事項・ライセンス・出典 ---
st.markdown("---")
with st.expander("ℹ️ アプリ情報・出典・ライセンス"):
    st.markdown("""
    ### **【出典情報】**
    - **日本三百名山リスト**: 公益社団法人日本山岳会選定 / [日本山岳会編 新版 日本三百名山 登山ガイド(2014)](https://jac1.or.jp/wp-content/uploads/2016/10/300meizanlist%E3%80%80.pdf)
    - **地図データ**: [国土地理院タイル](https://maps.gsi.go.jp/development/ichiran.html)
   
    ### **【ライセンス】**
    - **MIT License** / © 2026 Shikuu Kitashirakawa
   
    ### **【免責事項】**
    - 本アプリの情報の正確性は保証されません。実際の登山には必ず専用の装備と地図を携行してください。
    - アプリ利用による事故や損害について、開発者は一切の責任を負いません。
    """)

 The starting view is like below.


When we zoom up around Kyushu region, the view like below


 Kaimondake, Miyanouradake is shown at Kagoshima Pref. as the red markers and some moutains in north and middle area of Kyusyu region is shown by cloud marker. Maybe they include Mt. Aso, Mt. Kujuu, Mt. Yufu and the others.

 This App has a table of famous mountains name etc. like below under above map.


 And I arrange the select box to specify the region on light side ber. When I select Kinki region, the map become like below.


 As you see, the mountains in the Kinki Region are shown on the map like above.

 Next, I try to save the multipul users' climbing record  and to show on the map. 

 Before that, I want to creat a Git branch for these works. I ask Gemini how I can do it, again. I check the current condition of my local Git. Gemin tell me how I confirm it on my VS-code and create branch.

今のブランチを確かめる方法はいくつかありますが、一番簡単なのは VS Codeの画面の左下 を見ることです。


1. VS Codeの画面端を見る(最も簡単)

VS Codeの左下隅(青色や紫色のバー)を見てください。 そこに mainmulti-user-support など、ブランチ名がアイコン(分岐した道のようなマーク)と一緒に表示されています。


2. VS Codeのメニューから確認する

  1. VS Codeの左側にある 「ソース管理」アイコン(枝分かれした3つの点のマーク)をクリックします。

  2. そのパネルの一番上にあるプロジェクト名の横に、現在のブランチ名がカッコ書きで表示されています。


3. コマンドで確認する

VS Codeの下にある「ターミナル」に以下のコマンドを打つと、ブランチの一覧が表示されます。

Bash
git branch
  • 出てきたリストの中で、先頭に *(アスタリスク)がついていて、文字が緑色になっているものが「いまいるブランチ」です。

  • (END) と出て止まってしまったら、キーボードの q を押すと元の画面に戻れます。


💡 もし「いまどこにいるか」分からなくなったら

とりあえず main に戻りたい!という場合は、左下のブランチ名をクリックして、出てきたリストから main を選ぶだけで戻ることができます。

いま、左下には何と表示されていますか? もし新しい名前(マルチユーザー用)に切り替わっていれば、安心して「実験的なコード」を書き始めることができますよ。

ブランチが確認できたら、次は**Googleスプレッドシートの準備(logという名前のタブ作成)**についてお手伝いしましょうか?


VS Codeの左下隅にはfeature/improveとありますね。これはmainBranchにMergeした方がよさそうです。Mergeの方法を教えてください。そのあと、新しいBranchを作りたいです。

VS Codeの左下にある feature/improve は、あなたが以前「改善用」として作成したブランチですね。これを main に合流(マージ)させて、最新の状態を本番用として固めてしまいましょう。

以下の手順で、安全にマージを行い、新しいブランチを作成できます。


ステップ1:main ブランチに切り替える

マージをする際は、「取り込みたい側(main)」に移動する必要があります。

  1. VS Code左下の feature/improve をクリックします。

  2. 画面上部に出るリストから main を選択します。

  3. これで、左下が main に変わります。


ステップ2:feature/improve をマージする

  1. VS Codeの左側にある 「ソース管理アイコン」(枝分かれしたマーク)をクリックします。

  2. 上部の 「…」(三点リーダー)をクリックし、「ブランチ」 > 「マージ...」 を選択します。

  3. リストの中から、取り込みたいブランチ名 feature/improve を選びます。

  4. これで feature/improve で行った変更が main に合流しました。


ステップ3:GitHubへ同期(プッシュ)する

このままだとあなたのPC内だけでマージされた状態なので、GitHub側にも反映させます。

  1. 左下の 「同期(雲のようなマーク、または矢印の回転マーク)」 をクリックします。

    ※これで main ブランチが最新の状態でGitHubに保存されました。


ステップ4:新しいブランチを作る

いよいよ「マルチユーザー版(Google Sheets連携)」のための新しいブランチを作ります。

  1. 再び左下の main をクリックします。

  2. 「新しいブランチの作成...」 をクリックします。

  3. 名前として feature/multi-user(または好きな名前)を入力してEnter。


💡 整理:今の状況

これで、あなたのプロジェクトは以下のようになりました。

  • main ブランチ: 以前の改善が含まれた、現在「一番いい状態」のバックアップ。

  • feature/multi-user ブランチ: これからGoogle Sheets連携などをガシガシ試すための「作業場」。

ここからは、安心して feature/multi-user ブランチでコードを書き換えていけます!

次のステップとして、Googleスプレッドシート側に「log」という名前の新しいシート(タブ)を作成する準備はできていますか? それができたら、複数のユーザーが別々に保存できる魔法のコードを組み込んでいきましょう。

 I can understand that it is easy to operate Git on Vs-Code

To be continue...



コメント

このブログの人気の投稿

Gourmet from June 2025 to September 2025

DINNER, LUNCH AND DRINK from Sept. 2024

Food and Drink from April 2024