Aloha / app.py
Nebulae000's picture
Update app.py
f44bd4d verified
Raw History Blame Contribute Delete
4.19 kB
import os
import time
import random
import googlemaps
import pandas as pd
import plotly.express as px
import gradio as gr
# =====================================================
# 1. Google Maps API
# =====================================================
API_KEY = os.getenv("GOOGLE_MAPS_API_KEY")
if API_KEY is None:
raise RuntimeError("GOOGLE_MAPS_API_KEY not set")
gmaps = googlemaps.Client(key=API_KEY)
# =====================================================
# 2. Data Fetch
# =====================================================
def fetch_places():
query = "Hawaiian pizza in Seoul"
rows = []
res = gmaps.places(query=query, language="ko")
while True:
for r in res["results"]:
rows.append({
"name": r["name"],
"address": r.get("formatted_address", ""),
"rating": r.get("rating", 0),
"lat": r["geometry"]["location"]["lat"],
"lon": r["geometry"]["location"]["lng"],
})
if "next_page_token" not in res:
break
time.sleep(2)
res = gmaps.places(
page_token=res["next_page_token"],
language="ko",
)
return pd.DataFrame(rows)
DATA = fetch_places()
# =====================================================
# 3. Entertainment
# =====================================================
QUOTES = [
"🍍 νŒŒμΈμ• ν”Œμ€ λ…ΌμŸμ μ΄μ§€λ§Œ λ§›μžˆμŠ΅λ‹ˆλ‹€",
"πŸ• μ΄νƒˆλ¦¬μ•„μΈμ—κ²ŒλŠ” λΉ„λ°€λ‘œβ€¦",
"πŸ”₯ ν•˜μ™€μ΄μ•ˆ ν”Όμž μ°¬μ„± 1ν‘œ",
"🀝 λ‹¨μ§ μ˜ ν‰ν™”ν˜‘μ •",
"🧠 미각은 μžμœ μž…λ‹ˆλ‹€",
]
# =====================================================
# 4. Plotly Map Builder
# =====================================================
def build_map(df, zoom=11):
if df.empty:
center = dict(lat=37.5665, lon=126.9780)
else:
center = dict(lat=df.lat.mean(), lon=df.lon.mean())
fig = px.scatter_mapbox(
df,
lat="lat",
lon="lon",
hover_name="name",
hover_data={
"rating": True,
"address": True,
"lat": False,
"lon": False,
},
color="rating",
size="rating",
size_max=18,
zoom=zoom,
center=center,
height=650,
)
# OpenStreetMap β†’ Mapbox 토큰 ν•„μš” μ—†μŒ
fig.update_layout(
mapbox_style="open-street-map",
margin={"r": 0, "t": 0, "l": 0, "b": 0},
)
return fig
# =====================================================
# 5. UI Logic
# =====================================================
def update(min_rating):
df = DATA[DATA["rating"] >= min_rating]
pct = int(100 * len(df) / len(DATA)) if len(DATA) else 0
return (
build_map(df),
f"**{len(df)}개 λ§€μž₯ ν‘œμ‹œ 쀑**",
f"🍍 Pineapple Power: {pct}%",
random.choice(QUOTES),
)
def random_pick():
row = DATA.sample(1)
r = row.iloc[0]
return (
build_map(row, zoom=15),
f"""
### 🎲 였늘의 ν•˜μ™€μ΄μ•ˆ 🍍
**{r.name}**
⭐ {r.rating}
πŸ“ {r.address}
""",
)
# =====================================================
# 6. Gradio UI
# =====================================================
with gr.Blocks() as demo:
gr.Markdown(
"""
## 🍍 μ„œμšΈ ν•˜μ™€μ΄μ•ˆ ν”Όμž 지도
**Plotly 기반 Β· Gradio/HF Spaces μ•ˆμ • 버전**
"""
)
with gr.Row():
with gr.Column(scale=1):
rating = gr.Slider(0, 5, 3.5, 0.1, label="μ΅œμ†Œ 평점")
count = gr.Markdown()
power = gr.Markdown()
quote = gr.Markdown()
btn = gr.Button("🍍 였늘의 ν•˜μ™€μ΄μ•ˆ")
rec = gr.Markdown()
with gr.Column(scale=3):
plot = gr.Plot()
rating.change(
fn=update,
inputs=rating,
outputs=[plot, count, power, quote],
)
btn.click(
fn=random_pick,
inputs=None,
outputs=[plot, rec],
)
demo.load(
fn=update,
inputs=rating,
outputs=[plot, count, power, quote],
)
demo.launch(
ssr_mode=False # 지도 μ•ˆμ •μ„± ↑
)