%%writefile app.py
import streamlit as st
import geopandas as gpd
import pandas as pd
# --- サンプルデータの作成 (実際のgdfに置き換えてください) ---
# 都道府県名、ダム型式、ダムの目的のサンプル値
prefectures = ['東京都', '神奈川県', '大阪府', '京都府', '兵庫県', '愛知県']
dam_types = ['重力式コンクリートダム', 'ロックフィルダム', 'アーチ式コンクリートダム']
dam_purposes = ['治水', '利水', '発電', '治水・利水']
data = {
'都道府県名': [prefectures[i % len(prefectures)] for i in range(20)],
'ダム名': [f'ダム{i+1}' for i in range(20)],
'ダム型式': [dam_types[i % len(dam_types)] for i in range(20)],
'ダムの目的': [dam_purposes[i % len(dam_purposes)] for i in range(20)],
'geometry': gpd.points_from_xy([135 + i * 0.1 for i in range(20)], [35 + i * 0.05 for i in range(20)])
}
gdf = gpd.GeoDataFrame(data, crs="EPSG:4326")
# --- サンプルデータの作成ここまで ---
st.set_page_config(layout="wide") # 画面全体を使う設定
st.title("ダム情報ビューア")
# メイン画面
st.header("ダム一覧")
# geometry列をWKT形式の文字列に変換して表示用のDataFrameを作成
# Create a display DataFrame by converting the geometry column to WKT string format
gdf_display = gdf.copy()
gdf_display['geometry'] = gdf_display['geometry'].apply(lambda x: x.wkt)
st.dataframe(gdf_display) # geodataframe 'gdf' の一覧を表示
# サブ画面 (サイドバー)
st.sidebar.header("選択オプション")
# 都道府県名で選択
st.sidebar.subheader("都道府県名で選択")
selected_prefecture = st.sidebar.selectbox(
"都道府県を選択してください",
['全て'] + sorted(gdf['都道府県名'].unique().tolist())
)
if selected_prefecture != '全て':
gdf_filtered_prefecture = gdf[gdf['都道府県名'] == selected_prefecture]
# Filtered DataFrameもgeometry列をWKTに変換して表示
# Convert geometry column to WKT for the filtered DataFrame display as well
gdf_filtered_prefecture_display = gdf_filtered_prefecture.copy()
gdf_filtered_prefecture_display['geometry'] = gdf_filtered_prefecture_display['geometry'].apply(lambda x: x.wkt)
st.header(f"{selected_prefecture}のダム一覧")
st.dataframe(gdf_filtered_prefecture_display)
else:
st.header("全てのダム一覧")
st.dataframe(gdf_display) # 全てのダムを表示する場合は、既に変換済みのgdf_displayを使用
# ダム型式で選択
st.sidebar.subheader("ダム型式で選択")
selected_dam_type = st.sidebar.selectbox(
"ダム型式を選択してください",
['全て'] + sorted(gdf['ダム型式'].unique().tolist())
)
if selected_dam_type != '全て':
gdf_filtered_type = gdf[gdf['ダム型式'] == selected_dam_type]
# Filtered DataFrameもgeometry列をWKTに変換して表示
# Convert geometry column to WKT for the filtered DataFrame display as well
gdf_filtered_type_display = gdf_filtered_type.copy()
gdf_filtered_type_display['geometry'] = gdf_filtered_type_display['geometry'].apply(lambda x: x.wkt)
st.header(f"{selected_dam_type}のダム一覧")
st.dataframe(gdf_filtered_type_display)
# ダムの目的で選択
st.sidebar.subheader("ダムの目的で選択")
selected_dam_purpose = st.sidebar.selectbox(
"ダムの目的を選択してください",
['全て'] + sorted(gdf['ダムの目的'].unique().tolist())
)
if selected_dam_purpose != '全て':
gdf_filtered_purpose = gdf[gdf['ダムの目的'] == selected_dam_purpose]
# Filtered DataFrameもgeometry列をWKTに変換して表示
# Convert geometry column to WKT for the filtered DataFrame display as well
gdf_filtered_purpose_display = gdf_filtered_purpose.copy()
gdf_filtered_purpose_display['geometry'] = gdf_filtered_purpose_display['geometry'].apply(lambda x: x.wkt)
st.header(f"{selected_dam_purpose}のダム一覧")
st.dataframe(gdf_filtered_purpose_display)
# アプリを終了ボタン
st.sidebar.subheader("アプリの操作")
if st.sidebar.button("アプリを終了"):
st.stop() # Streamlitアプリを停止 (開発環境ではブラウザタブを閉じることで終了)
# フィルタリングされたデータフレームの表示 (重複を避けるため、各選択肢のブロック内で表示)
# 注意: 上記のコードでは、最後に選択されたフィルタが適用されます。
# 複数のフィルタを同時に適用したい場合は、ロジックを調整する必要があります。
コメント
コメントを投稿