Spaces:
Sleeping
Sleeping
yolo
Browse files- .DS_Store +0 -0
- app/app.py +33 -15
- app/dashboard.ipynb +62 -17
- app/data/processed_wineyards.csv +14 -0
- app/data/wineyards.csv +19 -0
.DS_Store
CHANGED
Binary files a/.DS_Store and b/.DS_Store differ
|
|
app/app.py
CHANGED
@@ -28,10 +28,6 @@ wine_list = wine_similarity_df['NAME'].unique()
|
|
28 |
|
29 |
|
30 |
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
## Layout ##
|
36 |
|
37 |
dashboard_layout = html.Div([
|
@@ -40,7 +36,7 @@ dashboard_layout = html.Div([
|
|
40 |
dcc.Graph(id='graph-content'),
|
41 |
|
42 |
|
43 |
-
|
44 |
|
45 |
html.H1(children='Wine Recommender', style={'textAlign':'center'}),
|
46 |
dcc.Dropdown(wine_list, wine_list[0], id='dropdown-selection'),
|
@@ -49,6 +45,9 @@ dashboard_layout = html.Div([
|
|
49 |
|
50 |
|
51 |
|
|
|
|
|
|
|
52 |
wiki_layout = html.Div([
|
53 |
dcc.Link('Dashboard', href='/'),
|
54 |
|
@@ -59,11 +58,9 @@ wiki_layout = html.Div([
|
|
59 |
|
60 |
html.H3('What is this project about?'),
|
61 |
|
62 |
-
html.P('
|
63 |
-
|
64 |
-
html.H3('How does it work?'),
|
65 |
|
66 |
-
#Insert image of the system
|
67 |
|
68 |
html.H3('\'Bout us'),
|
69 |
html.Img(src='/assets/tourdevino_logo.webp', style={'width': '40%', 'height': 'auto', 'display': 'block', 'margin-left': 'auto', 'margin-right': 'auto'}),
|
@@ -73,11 +70,6 @@ wiki_layout = html.Div([
|
|
73 |
html.H4('André Catarino'),
|
74 |
html.H4('Dinis Costa'),
|
75 |
html.H4('Paulo Fidalgo'),
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
html.H3('References'),
|
80 |
-
html.P('The boiler model was based on the following paper:'),
|
81 |
|
82 |
|
83 |
], className='six columns'),], className='row'),
|
@@ -101,15 +93,41 @@ def display_page(pathname):
|
|
101 |
@app.callback(
|
102 |
Output('graph-content', 'figure'),
|
103 |
Output('wine-recommendation', 'children'),
|
|
|
104 |
Input('dropdown-selection', 'value')
|
105 |
)
|
106 |
def update_graph(value):
|
|
|
107 |
recommended_wines = None
|
108 |
if value:
|
109 |
recommended_wines = core.get_top_5_similar_wines(value, wine_similarity_df)[1:]
|
110 |
recommended_wines = "; ".join(recommended_wines)
|
111 |
|
112 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
113 |
|
114 |
|
115 |
if __name__ == "__main__":
|
|
|
28 |
|
29 |
|
30 |
|
|
|
|
|
|
|
|
|
31 |
## Layout ##
|
32 |
|
33 |
dashboard_layout = html.Div([
|
|
|
36 |
dcc.Graph(id='graph-content'),
|
37 |
|
38 |
|
39 |
+
dcc.Graph(id='world-map-fig'),
|
40 |
|
41 |
html.H1(children='Wine Recommender', style={'textAlign':'center'}),
|
42 |
dcc.Dropdown(wine_list, wine_list[0], id='dropdown-selection'),
|
|
|
45 |
|
46 |
|
47 |
|
48 |
+
|
49 |
+
|
50 |
+
|
51 |
wiki_layout = html.Div([
|
52 |
dcc.Link('Dashboard', href='/'),
|
53 |
|
|
|
58 |
|
59 |
html.H3('What is this project about?'),
|
60 |
|
61 |
+
html.P('We are a group of 4 Computer Science Engineering Students with a solid Artificial Intelligence background.'),
|
62 |
+
html.P('This project aims to showcase AI applications for improving Wine Tourism for SOGRAPE.'),
|
|
|
63 |
|
|
|
64 |
|
65 |
html.H3('\'Bout us'),
|
66 |
html.Img(src='/assets/tourdevino_logo.webp', style={'width': '40%', 'height': 'auto', 'display': 'block', 'margin-left': 'auto', 'margin-right': 'auto'}),
|
|
|
70 |
html.H4('André Catarino'),
|
71 |
html.H4('Dinis Costa'),
|
72 |
html.H4('Paulo Fidalgo'),
|
|
|
|
|
|
|
|
|
|
|
73 |
|
74 |
|
75 |
], className='six columns'),], className='row'),
|
|
|
93 |
@app.callback(
|
94 |
Output('graph-content', 'figure'),
|
95 |
Output('wine-recommendation', 'children'),
|
96 |
+
Output('world-map-fig', 'figure'),
|
97 |
Input('dropdown-selection', 'value')
|
98 |
)
|
99 |
def update_graph(value):
|
100 |
+
### Wine Recommendation ###
|
101 |
recommended_wines = None
|
102 |
if value:
|
103 |
recommended_wines = core.get_top_5_similar_wines(value, wine_similarity_df)[1:]
|
104 |
recommended_wines = "; ".join(recommended_wines)
|
105 |
|
106 |
+
|
107 |
+
### World Map of wineyards ###
|
108 |
+
|
109 |
+
geo_df = pd.read_csv('data/processed_wineyards.csv')
|
110 |
+
|
111 |
+
|
112 |
+
world_map_fig = px.scatter_map(geo_df,
|
113 |
+
lat=geo_df['coord_x'],
|
114 |
+
lon=geo_df['coord_y'],
|
115 |
+
hover_name=geo_df['name'],
|
116 |
+
zoom=4,
|
117 |
+
hover_data={
|
118 |
+
'IsTouristic': True,
|
119 |
+
'Wine Type': True,
|
120 |
+
'Country': True,
|
121 |
+
'Region': True,
|
122 |
+
'Address': True,
|
123 |
+
|
124 |
+
},
|
125 |
+
title='Wineyards around the world',
|
126 |
+
)
|
127 |
+
|
128 |
+
|
129 |
+
|
130 |
+
return px.line(df, x='year', y='pop'), recommended_wines, world_map_fig
|
131 |
|
132 |
|
133 |
if __name__ == "__main__":
|
app/dashboard.ipynb
CHANGED
@@ -2,7 +2,7 @@
|
|
2 |
"cells": [
|
3 |
{
|
4 |
"cell_type": "code",
|
5 |
-
"execution_count":
|
6 |
"metadata": {},
|
7 |
"outputs": [
|
8 |
{
|
@@ -20,11 +20,38 @@
|
|
20 |
" "
|
21 |
],
|
22 |
"text/plain": [
|
23 |
-
"<IPython.lib.display.IFrame at
|
24 |
]
|
25 |
},
|
26 |
"metadata": {},
|
27 |
"output_type": "display_data"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
28 |
}
|
29 |
],
|
30 |
"source": [
|
@@ -58,10 +85,6 @@
|
|
58 |
"\n",
|
59 |
"\n",
|
60 |
"\n",
|
61 |
-
"\n",
|
62 |
-
"\n",
|
63 |
-
"\n",
|
64 |
-
"\n",
|
65 |
"## Layout ##\n",
|
66 |
"\n",
|
67 |
"dashboard_layout = html.Div([\n",
|
@@ -70,7 +93,7 @@
|
|
70 |
" dcc.Graph(id='graph-content'),\n",
|
71 |
"\n",
|
72 |
"\n",
|
73 |
-
"
|
74 |
"\n",
|
75 |
" html.H1(children='Wine Recommender', style={'textAlign':'center'}),\n",
|
76 |
" dcc.Dropdown(wine_list, wine_list[0], id='dropdown-selection'),\n",
|
@@ -79,6 +102,9 @@
|
|
79 |
"\n",
|
80 |
"\n",
|
81 |
"\n",
|
|
|
|
|
|
|
82 |
"wiki_layout = html.Div([\n",
|
83 |
" dcc.Link('Dashboard', href='/'),\n",
|
84 |
"\n",
|
@@ -89,11 +115,9 @@
|
|
89 |
"\n",
|
90 |
" html.H3('What is this project about?'),\n",
|
91 |
"\n",
|
92 |
-
" html.P('
|
93 |
-
"
|
94 |
-
" html.H3('How does it work?'),\n",
|
95 |
"\n",
|
96 |
-
" #Insert image of the system\n",
|
97 |
"\n",
|
98 |
" html.H3('\\'Bout us'),\n",
|
99 |
" html.Img(src='/assets/tourdevino_logo.webp', style={'width': '40%', 'height': 'auto', 'display': 'block', 'margin-left': 'auto', 'margin-right': 'auto'}),\n",
|
@@ -103,11 +127,6 @@
|
|
103 |
" html.H4('André Catarino'),\n",
|
104 |
" html.H4('Dinis Costa'),\n",
|
105 |
" html.H4('Paulo Fidalgo'),\n",
|
106 |
-
" \n",
|
107 |
-
"\n",
|
108 |
-
"\n",
|
109 |
-
" html.H3('References'),\n",
|
110 |
-
" html.P('The boiler model was based on the following paper:'),\n",
|
111 |
"\n",
|
112 |
"\n",
|
113 |
" ], className='six columns'),], className='row'),\n",
|
@@ -131,15 +150,41 @@
|
|
131 |
"@app.callback(\n",
|
132 |
" Output('graph-content', 'figure'),\n",
|
133 |
" Output('wine-recommendation', 'children'),\n",
|
|
|
134 |
" Input('dropdown-selection', 'value')\n",
|
135 |
")\n",
|
136 |
"def update_graph(value):\n",
|
|
|
137 |
" recommended_wines = None\n",
|
138 |
" if value:\n",
|
139 |
" recommended_wines = core.get_top_5_similar_wines(value, wine_similarity_df)[1:]\n",
|
140 |
" recommended_wines = \"; \".join(recommended_wines)\n",
|
141 |
"\n",
|
142 |
-
"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
143 |
"\n",
|
144 |
"\n",
|
145 |
"if __name__ == \"__main__\":\n",
|
|
|
2 |
"cells": [
|
3 |
{
|
4 |
"cell_type": "code",
|
5 |
+
"execution_count": 6,
|
6 |
"metadata": {},
|
7 |
"outputs": [
|
8 |
{
|
|
|
20 |
" "
|
21 |
],
|
22 |
"text/plain": [
|
23 |
+
"<IPython.lib.display.IFrame at 0x28f564370>"
|
24 |
]
|
25 |
},
|
26 |
"metadata": {},
|
27 |
"output_type": "display_data"
|
28 |
+
},
|
29 |
+
{
|
30 |
+
"name": "stderr",
|
31 |
+
"output_type": "stream",
|
32 |
+
"text": [
|
33 |
+
"[2024-09-17 12:44:28,042] ERROR in app: Exception on /_dash-update-component [POST]\n",
|
34 |
+
"Traceback (most recent call last):\n",
|
35 |
+
" File \"/Users/ruimelo/anaconda3/envs/gan-nlp/lib/python3.10/site-packages/flask/app.py\", line 1473, in wsgi_app\n",
|
36 |
+
" response = self.full_dispatch_request()\n",
|
37 |
+
" File \"/Users/ruimelo/anaconda3/envs/gan-nlp/lib/python3.10/site-packages/flask/app.py\", line 882, in full_dispatch_request\n",
|
38 |
+
" rv = self.handle_user_exception(e)\n",
|
39 |
+
" File \"/Users/ruimelo/anaconda3/envs/gan-nlp/lib/python3.10/site-packages/flask/app.py\", line 880, in full_dispatch_request\n",
|
40 |
+
" rv = self.dispatch_request()\n",
|
41 |
+
" File \"/Users/ruimelo/anaconda3/envs/gan-nlp/lib/python3.10/site-packages/flask/app.py\", line 865, in dispatch_request\n",
|
42 |
+
" return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return]\n",
|
43 |
+
" File \"/Users/ruimelo/anaconda3/envs/gan-nlp/lib/python3.10/site-packages/dash/dash.py\", line 1376, in dispatch\n",
|
44 |
+
" ctx.run(\n",
|
45 |
+
" File \"/Users/ruimelo/anaconda3/envs/gan-nlp/lib/python3.10/site-packages/dash/_callback.py\", line 514, in add_context\n",
|
46 |
+
" raise err\n",
|
47 |
+
" File \"/Users/ruimelo/anaconda3/envs/gan-nlp/lib/python3.10/site-packages/dash/_callback.py\", line 503, in add_context\n",
|
48 |
+
" output_value = _invoke_callback(func, *func_args, **func_kwargs)\n",
|
49 |
+
" File \"/Users/ruimelo/anaconda3/envs/gan-nlp/lib/python3.10/site-packages/dash/_callback.py\", line 43, in _invoke_callback\n",
|
50 |
+
" return func(*args, **kwargs) # %% callback invoked %%\n",
|
51 |
+
" File \"/var/folders/b4/lwfgccm95kqd2skcwvrt2fr00000gn/T/ipykernel_62984/1808289814.py\", line 112, in update_graph\n",
|
52 |
+
" world_map_fig = px.scatter_map(geo_df,\n",
|
53 |
+
"TypeError: scatter_map() got an unexpected keyword argument 'projection_type'\n"
|
54 |
+
]
|
55 |
}
|
56 |
],
|
57 |
"source": [
|
|
|
85 |
"\n",
|
86 |
"\n",
|
87 |
"\n",
|
|
|
|
|
|
|
|
|
88 |
"## Layout ##\n",
|
89 |
"\n",
|
90 |
"dashboard_layout = html.Div([\n",
|
|
|
93 |
" dcc.Graph(id='graph-content'),\n",
|
94 |
"\n",
|
95 |
"\n",
|
96 |
+
" dcc.Graph(id='world-map-fig'),\n",
|
97 |
"\n",
|
98 |
" html.H1(children='Wine Recommender', style={'textAlign':'center'}),\n",
|
99 |
" dcc.Dropdown(wine_list, wine_list[0], id='dropdown-selection'),\n",
|
|
|
102 |
"\n",
|
103 |
"\n",
|
104 |
"\n",
|
105 |
+
"\n",
|
106 |
+
"\n",
|
107 |
+
"\n",
|
108 |
"wiki_layout = html.Div([\n",
|
109 |
" dcc.Link('Dashboard', href='/'),\n",
|
110 |
"\n",
|
|
|
115 |
"\n",
|
116 |
" html.H3('What is this project about?'),\n",
|
117 |
"\n",
|
118 |
+
" html.P('We are a group of 4 Computer Science Engineering Students with a solid Artificial Intelligence background.'),\n",
|
119 |
+
" html.P('This project aims to showcase AI applications for improving Wine Tourism for SOGRAPE.'),\n",
|
|
|
120 |
"\n",
|
|
|
121 |
"\n",
|
122 |
" html.H3('\\'Bout us'),\n",
|
123 |
" html.Img(src='/assets/tourdevino_logo.webp', style={'width': '40%', 'height': 'auto', 'display': 'block', 'margin-left': 'auto', 'margin-right': 'auto'}),\n",
|
|
|
127 |
" html.H4('André Catarino'),\n",
|
128 |
" html.H4('Dinis Costa'),\n",
|
129 |
" html.H4('Paulo Fidalgo'),\n",
|
|
|
|
|
|
|
|
|
|
|
130 |
"\n",
|
131 |
"\n",
|
132 |
" ], className='six columns'),], className='row'),\n",
|
|
|
150 |
"@app.callback(\n",
|
151 |
" Output('graph-content', 'figure'),\n",
|
152 |
" Output('wine-recommendation', 'children'),\n",
|
153 |
+
" Output('world-map-fig', 'figure'),\n",
|
154 |
" Input('dropdown-selection', 'value')\n",
|
155 |
")\n",
|
156 |
"def update_graph(value):\n",
|
157 |
+
" ### Wine Recommendation ###\n",
|
158 |
" recommended_wines = None\n",
|
159 |
" if value:\n",
|
160 |
" recommended_wines = core.get_top_5_similar_wines(value, wine_similarity_df)[1:]\n",
|
161 |
" recommended_wines = \"; \".join(recommended_wines)\n",
|
162 |
"\n",
|
163 |
+
"\n",
|
164 |
+
" ### World Map of wineyards ###\n",
|
165 |
+
"\n",
|
166 |
+
" geo_df = pd.read_csv('data/processed_wineyards.csv')\n",
|
167 |
+
"\n",
|
168 |
+
"\n",
|
169 |
+
" world_map_fig = px.scatter_map(geo_df,\n",
|
170 |
+
" lat=geo_df['coord_x'],\n",
|
171 |
+
" lon=geo_df['coord_y'],\n",
|
172 |
+
" hover_name=geo_df['name'],\n",
|
173 |
+
" zoom=4,\n",
|
174 |
+
" hover_data={\n",
|
175 |
+
" 'IsTouristic': True,\n",
|
176 |
+
" 'Wine Type': True,\n",
|
177 |
+
" 'Country': True,\n",
|
178 |
+
" 'Region': True,\n",
|
179 |
+
" 'Address': True,\n",
|
180 |
+
"\n",
|
181 |
+
" },\n",
|
182 |
+
" title='Wineyards around the world',\n",
|
183 |
+
" )\n",
|
184 |
+
" \n",
|
185 |
+
"\n",
|
186 |
+
"\n",
|
187 |
+
" return px.line(df, x='year', y='pop'), recommended_wines, world_map_fig\n",
|
188 |
"\n",
|
189 |
"\n",
|
190 |
"if __name__ == \"__main__\":\n",
|
app/data/processed_wineyards.csv
ADDED
@@ -0,0 +1,14 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
,name,IsTouristic,LOCAL TYPE,Wine Type,SIZE,Country,Region,Address,coord,coord_x,coord_y
|
2 |
+
0,Quinta de Azevedo,No,Quinta,Verde,41.0,Portugal,Douro,"R. Conde de Azevedo 237, 4750-511 Roriz","41.57330853032964, -8.533706262471226",41.57330853032964,-8.533706262471226
|
3 |
+
1,Quinta do Porto,No,Quinta,Douro,27.0,Portugal,Douro,"N226, 5100","41.1285485073888, -7.816127554438324",41.1285485073888,-7.816127554438324
|
4 |
+
2,Quinta do Seixo,Quinta do Seixo,Quinta,,100.0,Portugal,Douro,"Largo de Eiras 37, 5150-084 Almendra","41.02111060351561, -7.011243914386894",41.02111060351561,-7.011243914386894
|
5 |
+
3,Quinta do Caêdo,No,Quinta,,22.0,Portugal,Douro,5130-126 Ervedosa do Douro,"41.191193966639496, -7.464240963577649",41.191193966639496,-7.464240963577649
|
6 |
+
4,Quinta do Vau,No,Quinta,,73.0,Portugal,Douro,"Quinta do Vau, 7750-301 Mértola","37.63310013834872, -7.664460830879209",37.63310013834872,-7.664460830879209
|
7 |
+
5,Quinta do Sairrão,No,Quinta,,170.0,Portugal,Douro,"Quinta do Sairrão Valença do Douro, 5130-909 São João da Pesqueira","41.12585233297436, -7.4043047394921855",41.12585233297436,-7.4043047394921855
|
8 |
+
6,Quinta da Leda,No,Quinta,,158.0,Portugal,Douro,"Largo de Eiras 37, 5150-084 Almendra","41.0211631569069, -7.011313646768633",41.0211631569069,-7.011313646768633
|
9 |
+
7,Quinta dos Carvalhais,No,Quinta,,106.0,Portugal,Dão,6370-140 Fornos de Algodres,"40.68806430590881, -7.380353578401911",40.68806430590881,-7.380353578401911
|
10 |
+
8,Quinta do Romeira,No,Quinta,,73.0,Portugal,Bucelas,"Quinta da Romeira de Cima, 2670-678 Bucelas","38.90339927862606, -9.08272372295126",38.90339927862606,-9.08272372295126
|
11 |
+
9,Herdade do Peso,No,Quinta,,162.0,Portugal,Alentejo,"W8W4+9X, Fajarda","38.94607643846798, -8.692547592716494",38.94607643846798,-8.692547592716494
|
12 |
+
10,Santiago Ruiz,No,Quinta,Branco,38.0,Espanha,Rías Baixas,"Rua do Vinicultor, Santiago Ruiz, s/n, 36760 San Miguel de Tabagón, Pontevedra, Espanha","41.941794564806685, -8.802269831979137",41.941794564806685,-8.802269831979137
|
13 |
+
11,Viña Lanciano,LAN,Quinta,,72.0,Espanha,Rioja,"Paraje de Buicio s/n, 26360 Fuenmayor, Espanha","42.46620857388223, -2.6026644530093135",42.46620857388223,-2.6026644530093135
|
14 |
+
12,Finca los Llanos,No,Quinta,,25.0,Espanha,Rueda,"Calle Sierra Nevada, 18413 Capileira, Granada, Espanha","36.97246300856455, -3.358175904877671",36.97246300856455,-3.358175904877671
|
app/data/wineyards.csv
ADDED
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
NAME,IsTouristic,LOCAL TYPE,WINE TYPE,SIZE,COUNTRY,REGION,ADDRESS,COORD
|
2 |
+
Quinta de Azevedo,No,Quinta,Verde,41,Portugal,Douro,"R. Conde de Azevedo 237, 4750-511 Roriz","41.57330853032964, -8.533706262471226"
|
3 |
+
Quinta do Porto,No,Quinta,Douro,27,Portugal,Douro,"N226, 5100","41.1285485073888, -7.816127554438324"
|
4 |
+
Quinta do Seixo,Quinta do Seixo,Quinta,,100,Portugal,Douro,"Largo de Eiras 37, 5150-084 Almendra","41.02111060351561, -7.011243914386894"
|
5 |
+
Quinta do Caêdo,No,Quinta,,22,Portugal,Douro,5130-126 Ervedosa do Douro,"41.191193966639496, -7.464240963577649"
|
6 |
+
Quinta do Vau,No,Quinta,,73,Portugal,Douro,"Quinta do Vau, 7750-301 Mértola","37.63310013834872, -7.664460830879209"
|
7 |
+
Quinta do Sairrão,No,Quinta,,170,Portugal,Douro,"Quinta do Sairrão Valença do Douro, 5130-909 São João da Pesqueira","41.12585233297436, -7.4043047394921855"
|
8 |
+
Quinta da Leda,No,Quinta,,158,Portugal,Douro,"Largo de Eiras 37, 5150-084 Almendra","41.0211631569069, -7.011313646768633"
|
9 |
+
Quinta dos Carvalhais,No,Quinta,,106,Portugal,Dão,6370-140 Fornos de Algodres,"40.68806430590881, -7.380353578401911"
|
10 |
+
Quinta do Romeira,No,Quinta,,73,Portugal,Bucelas,"Quinta da Romeira de Cima, 2670-678 Bucelas","38.90339927862606, -9.08272372295126"
|
11 |
+
Herdade do Peso,No,Quinta,,162,Portugal,Alentejo,"W8W4+9X, Fajarda","38.94607643846798, -8.692547592716494"
|
12 |
+
Santiago Ruiz,No,Quinta,Branco,38,Espanha,Rías Baixas,"Rua do Vinicultor, Santiago Ruiz, s/n, 36760 San Miguel de Tabagón, Pontevedra, Espanha","41.941794564806685, -8.802269831979137"
|
13 |
+
Viña Lanciano,LAN,Quinta,,72,Espanha,Rioja,"Paraje de Buicio s/n, 26360 Fuenmayor, Espanha","42.46620857388223, -2.6026644530093135"
|
14 |
+
Finca los Llanos,No,Quinta,,25,Espanha,Rueda,"Calle Sierra Nevada, 18413 Capileira, Granada, Espanha","36.97246300856455, -3.358175904877671"
|
15 |
+
Ribera del Duero,No,Region,Tinto,,Espanha,Ribera del Duero,,
|
16 |
+
Jerez de la Frontera,No,Region,,,Espanha,Jerez de la Frontera,Jerez de la Frontera,
|
17 |
+
Caves Ferreira,Caves Ferreira,Cave,Porto Wine,,Portugal,,,
|
18 |
+
Caves Sandeman,Caves Sandeman,Cave,,,Portugal,,,
|
19 |
+
Loja da Estação do Pinhão,Loja da Estação do Pinhão,Loja,,,Portugal,,,
|