Nebulae000 commited on
Commit
f44bd4d
Β·
verified Β·
1 Parent(s): f1c0c38

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +153 -24
app.py CHANGED
@@ -1,41 +1,170 @@
 
 
 
 
 
 
 
1
  import gradio as gr
2
- import pydeck as pdk
3
 
4
- def show_map():
5
- layer = pdk.Layer(
6
- "ScatterplotLayer",
7
- data=[{"lon": 126.9780, "lat": 37.5665}], # μ„œμšΈμ‹œμ²­
8
- get_position="[lon, lat]",
9
- get_radius=500,
10
- get_fill_color="[255, 0, 0]",
11
- pickable=True,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12
  )
13
 
14
- view = pdk.ViewState(
15
- longitude=126.9780,
16
- latitude=37.5665,
17
- zoom=12,
18
  )
19
 
20
- deck = pdk.Deck(
21
- layers=[layer],
22
- initial_view_state=view,
23
- map_style=None, # ⭐ Mapbox 토큰 μ™„μ „ 제거
 
 
 
 
 
 
 
 
 
 
 
24
  )
25
 
26
- return deck
 
 
27
 
 
 
 
 
 
 
 
 
 
28
 
 
 
 
29
  with gr.Blocks() as demo:
30
- gr.Markdown("## πŸ§ͺ PyDeck λ§΅ 단독 ν…ŒμŠ€νŠΈ")
31
- map_plot = gr.Plot()
 
 
 
 
32
 
33
- demo.load(
34
- fn=show_map,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
35
  inputs=None,
36
- outputs=map_plot,
 
 
 
 
 
 
37
  )
38
 
39
  demo.launch(
40
- ssr_mode=False, # ⭐ 맀우 μ€‘μš”
41
  )
 
1
+ import os
2
+ import time
3
+ import random
4
+
5
+ import googlemaps
6
+ import pandas as pd
7
+ import plotly.express as px
8
  import gradio as gr
 
9
 
10
+ # =====================================================
11
+ # 1. Google Maps API
12
+ # =====================================================
13
+ API_KEY = os.getenv("GOOGLE_MAPS_API_KEY")
14
+ if API_KEY is None:
15
+ raise RuntimeError("GOOGLE_MAPS_API_KEY not set")
16
+
17
+ gmaps = googlemaps.Client(key=API_KEY)
18
+
19
+ # =====================================================
20
+ # 2. Data Fetch
21
+ # =====================================================
22
+ def fetch_places():
23
+ query = "Hawaiian pizza in Seoul"
24
+ rows = []
25
+
26
+ res = gmaps.places(query=query, language="ko")
27
+
28
+ while True:
29
+ for r in res["results"]:
30
+ rows.append({
31
+ "name": r["name"],
32
+ "address": r.get("formatted_address", ""),
33
+ "rating": r.get("rating", 0),
34
+ "lat": r["geometry"]["location"]["lat"],
35
+ "lon": r["geometry"]["location"]["lng"],
36
+ })
37
+
38
+ if "next_page_token" not in res:
39
+ break
40
+
41
+ time.sleep(2)
42
+ res = gmaps.places(
43
+ page_token=res["next_page_token"],
44
+ language="ko",
45
+ )
46
+
47
+ return pd.DataFrame(rows)
48
+
49
+ DATA = fetch_places()
50
+
51
+ # =====================================================
52
+ # 3. Entertainment
53
+ # =====================================================
54
+ QUOTES = [
55
+ "🍍 νŒŒμΈμ• ν”Œμ€ λ…ΌμŸμ μ΄μ§€λ§Œ λ§›μžˆμŠ΅λ‹ˆλ‹€",
56
+ "πŸ• μ΄νƒˆλ¦¬μ•„μΈμ—κ²ŒλŠ” λΉ„λ°€λ‘œβ€¦",
57
+ "πŸ”₯ ν•˜μ™€μ΄μ•ˆ ν”Όμž μ°¬μ„± 1ν‘œ",
58
+ "🀝 λ‹¨μ§ μ˜ ν‰ν™”ν˜‘μ •",
59
+ "🧠 미각은 μžμœ μž…λ‹ˆλ‹€",
60
+ ]
61
+
62
+ # =====================================================
63
+ # 4. Plotly Map Builder
64
+ # =====================================================
65
+ def build_map(df, zoom=11):
66
+ if df.empty:
67
+ center = dict(lat=37.5665, lon=126.9780)
68
+ else:
69
+ center = dict(lat=df.lat.mean(), lon=df.lon.mean())
70
+
71
+ fig = px.scatter_mapbox(
72
+ df,
73
+ lat="lat",
74
+ lon="lon",
75
+ hover_name="name",
76
+ hover_data={
77
+ "rating": True,
78
+ "address": True,
79
+ "lat": False,
80
+ "lon": False,
81
+ },
82
+ color="rating",
83
+ size="rating",
84
+ size_max=18,
85
+ zoom=zoom,
86
+ center=center,
87
+ height=650,
88
  )
89
 
90
+ # OpenStreetMap β†’ Mapbox 토큰 ν•„μš” μ—†μŒ
91
+ fig.update_layout(
92
+ mapbox_style="open-street-map",
93
+ margin={"r": 0, "t": 0, "l": 0, "b": 0},
94
  )
95
 
96
+ return fig
97
+
98
+ # =====================================================
99
+ # 5. UI Logic
100
+ # =====================================================
101
+ def update(min_rating):
102
+ df = DATA[DATA["rating"] >= min_rating]
103
+
104
+ pct = int(100 * len(df) / len(DATA)) if len(DATA) else 0
105
+
106
+ return (
107
+ build_map(df),
108
+ f"**{len(df)}개 λ§€μž₯ ν‘œμ‹œ 쀑**",
109
+ f"🍍 Pineapple Power: {pct}%",
110
+ random.choice(QUOTES),
111
  )
112
 
113
+ def random_pick():
114
+ row = DATA.sample(1)
115
+ r = row.iloc[0]
116
 
117
+ return (
118
+ build_map(row, zoom=15),
119
+ f"""
120
+ ### 🎲 였늘의 ν•˜μ™€μ΄μ•ˆ 🍍
121
+ **{r.name}**
122
+ ⭐ {r.rating}
123
+ πŸ“ {r.address}
124
+ """,
125
+ )
126
 
127
+ # =====================================================
128
+ # 6. Gradio UI
129
+ # =====================================================
130
  with gr.Blocks() as demo:
131
+ gr.Markdown(
132
+ """
133
+ ## 🍍 μ„œμšΈ ν•˜μ™€μ΄μ•ˆ ν”Όμž 지도
134
+ **Plotly 기반 Β· Gradio/HF Spaces μ•ˆμ • 버전**
135
+ """
136
+ )
137
 
138
+ with gr.Row():
139
+ with gr.Column(scale=1):
140
+ rating = gr.Slider(0, 5, 3.5, 0.1, label="μ΅œμ†Œ 평점")
141
+ count = gr.Markdown()
142
+ power = gr.Markdown()
143
+ quote = gr.Markdown()
144
+ btn = gr.Button("🍍 였늘의 ν•˜μ™€μ΄μ•ˆ")
145
+ rec = gr.Markdown()
146
+
147
+ with gr.Column(scale=3):
148
+ plot = gr.Plot()
149
+
150
+ rating.change(
151
+ fn=update,
152
+ inputs=rating,
153
+ outputs=[plot, count, power, quote],
154
+ )
155
+
156
+ btn.click(
157
+ fn=random_pick,
158
  inputs=None,
159
+ outputs=[plot, rec],
160
+ )
161
+
162
+ demo.load(
163
+ fn=update,
164
+ inputs=rating,
165
+ outputs=[plot, count, power, quote],
166
  )
167
 
168
  demo.launch(
169
+ ssr_mode=False # 지도 μ•ˆμ •μ„± ↑
170
  )