Tortosa

Las estaciones son algo más que un lugar desde el que subir a un tren o desembarcar del mismo. Además de prestar sus servicios a los viajeros y usuarios, muchas de ellas constituyen una referencia en las localidades donde su ubican.
Aquí se pueden conocer los horarios de llegadas y salidas de la estación, así como los servicios que se ofrecen en su recinto e instalaciones. Para ello acceda a dicha información a través del selector que ponemos a su disposición.
-
jueves 23/07/2026
-
Hora actual - 12:33 h
-
Estado de la Red
Salidas
| Hora de salida | Destino | Tren | Vía |
|---|
No se ha podido recuperar información de circulación.
Llegadas
| Hora de llegada | Origen | Tren | Vía |
|---|---|---|---|
|
14:07
14:12
|
RF - RODALIES-R1618125 |
2
|
|
|
16:07
|
RF - RODALIES-R1618127 |
2
|
|
|
17:24
|
RF - REGIONAL14302 |
6
|
|
|
17:37
|
RF - RODALIES-R1618129 |
2
|
|
|
19:03
|
RF - RODALIES-R1618131 |
2
|
|
|
19:46
|
RF - AVANT-EXPRES35968 |
4
|
|
|
20:32
|
RF - RODALIES-R1618133 |
2
|
|
|
20:55
|
RF - RODALIES-R1618096 |
6
|
|
|
22:12
|
RF - RODALIES-R1618055 |
6
|
|
|
23:15
|
RF - REGIONAL EXPRES14016 |
1
|
|
|
23:32
|
RF - RODALIES-R1618135 |
6
|
|
|
07:00
|
RF - RODALIES-R1618054 |
2
|
|
|
08:37
|
RF - RODALIES-R1618121 |
1
|
|
|
10:07
|
RF - RODALIES-R1618123 |
2
|
|
|
10:59
|
RF - REGIONAL EXPRES14020 |
6
|
|
|
12:13
|
RF - RODALIES-R1618093 |
2
|
|
|
14:07
|
RF - RODALIES-R1618125 |
2
|
|
|
16:07
|
RF - RODALIES-R1618127 |
2
|
|
|
17:24
|
RF - REGIONAL14302 |
6
|
|
|
17:37
|
RF - RODALIES-R1618129 |
2
|
|
|
19:03
|
RF - RODALIES-R1618131 |
2
|
|
|
19:46
|
RF - AVANT-EXPRES35968 |
4
|
|
|
20:32
|
RF - RODALIES-R1618133 |
2
|
|
|
20:55
|
RF - RODALIES-R1618096 |
6
|
|
|
22:12
|
RF - RODALIES-R1618055 |
6
|
No se ha podido recuperar información de circulación.
Informacion de la estación
-
Dirección
C/ Poeta Vicente I Garcia, 6 - 12 --- 43500 Tortosa --- TARRAGONA
-
Horario
Diario: 05:10 a 23:45
Intermodalidad
Se ha producido un error al procesar la plantilla.
The following has evaluated to null or missing:
==> .vars["serviciosFieldSet"].idFieldSet.idFieldSetFieldSet.descripcionServicios.getSiblings()[idx] [in template "20101#20128#ADIF-SERVICIOS-ESTACION-TEMPLATE" at line 62, column 36]
----
Tip: It's the final [] step that caused this error, not those before it.
----
Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----
----
FTL stack trace ("~" means nesting-related):
- Failed at: #assign item = {"id": idNodo.getData(... [in template "20101#20128#ADIF-SERVICIOS-ESTACION-TEMPLATE" in macro "listPaint" at line 59, column 17]
- Reached through: @listPaint servicios.id.getSiblings()... [in template "20101#20128#ADIF-SERVICIOS-ESTACION-TEMPLATE" at line 39, column 5]
----
1<script type="text/javascript">
2
3
4function cierraDetalles(){
5 var detalles = $("div[id^='detalleServicio']");
6 var iconos = $("[id^='button-detalleServicio']");
7 for (let detalle of detalles) {
8 detalle.style.display = 'none'
9 }
10 for (let icono of iconos) {
11 icono.setAttribute('aria-expanded', 'false');
12 }
13}
14
15 function toggle(id, id2) {
16
17
18 var n = document.getElementById(id);
19if (n.style.display != 'none')
20 {
21 n.style.display = 'none';
22 document.getElementById(id2).setAttribute('aria-expanded', 'false');
23 }
24 else
25 {
26 cierraDetalles();
27 n.style.display = '';
28 document.getElementById(id2).setAttribute('aria-expanded', 'true');
29 }
30 }
31
32
33 </script>
34
35<#if servicios?? && servicios.id?? && servicios.id.getSiblings()?has_content>
36 <div class="title-servicios">
37 <h3><@liferay.language key="es.adif.estacion.servicios"/></h3>
38 </div>
39 <@listPaint servicios.id.getSiblings() ""/>
40</#if>
41
42<#if serviciosAdaptados?? && serviciosAdaptados.idAdaptados?? && serviciosAdaptados.idAdaptados.getSiblings()?has_content>
43 <div class="title-servicios">
44 <h3><@liferay.language key="es.adif.estacion.servicios-adaptados"/></h3>
45 </div>
46 <@listPaint serviciosAdaptados.idAdaptados.getSiblings() "Adaptados"/>
47</#if>
48
49<#macro listPaint listaIds texto>
50 <#-- 1. Creamos una lista limpia combinando los datos por su índice -->
51 <#assign listaTipada = [] />
52
53 <#list listaIds as idNodo>
54 <#assign idx = idNodo?index />
55
56 <#if texto != "Adaptados">
57 <#-- Acceso seguro navegando la estructura exacta del XML usando las variables de Liferay -->
58 <#if .vars["serviciosFieldSet"].idFieldSet.idFieldSetFieldSet.titulo.getSiblings()[idx]??>
59 <#assign item = {
60 "id": idNodo.getData(),
61 "titulo": .vars["serviciosFieldSet"].idFieldSet.idFieldSetFieldSet.titulo.getSiblings()[idx].getData(),
62 "descripcion": .vars["serviciosFieldSet"].idFieldSet.idFieldSetFieldSet.descripcionServicios.getSiblings()[idx].getData(),
63 "icono": .vars["serviciosFieldSet"].idFieldSet.idFieldSetFieldSet.icono.getSiblings()[idx].getData(),
64 "pop": .vars["serviciosFieldSet"].idFieldSet.idFieldSetFieldSet.popServicios.getSiblings()[idx].getData()
65 } />
66 <#assign listaTipada = listaTipada + [item] />
67 </#if>
68 <#else>
69 <#-- Ruta exacta para los servicios adaptados -->
70 <#if .vars["serviciosAdaptadosFieldSet"].idAdaptadosFieldSet.idAdaptadosFieldSetFieldSet.tituloAdaptados.getSiblings()[idx]??>
71 <#assign item = {
72 "id": idNodo.getData(),
73 "titulo": .vars["serviciosAdaptadosFieldSet"].idAdaptadosFieldSet.idAdaptadosFieldSetFieldSet.tituloAdaptados.getSiblings()[idx].getData(),
74 "descripcion": .vars["serviciosAdaptadosFieldSet"].idAdaptadosFieldSet.idAdaptadosFieldSetFieldSet.descripcionAdaptados.getSiblings()[idx].getData(),
75 "icono": .vars["serviciosAdaptadosFieldSet"].idAdaptadosFieldSet.idAdaptadosFieldSetFieldSet.iconoAdaptados.getSiblings()[idx].getData(),
76 "pop": .vars["serviciosAdaptadosFieldSet"].idAdaptadosFieldSet.idAdaptadosFieldSetFieldSet.popAdaptados.getSiblings()[idx].getData()
77 } />
78 <#assign listaTipada = listaTipada + [item] />
79 </#if>
80 </#if>
81 </#list>
82
83 <#-- 2. Ordenamos nativamente por el título de los mapas creados -->
84 <#if listaTipada?has_content>
85 <#assign listaOrdenada = listaTipada?sort_by("titulo") />
86
87 <#-- 3. Pintamos en filas de 3 usando la lista ya ordenada -->
88 <#list listaOrdenada as cur_item>
89 <#if cur_item?index % 3 == 0>
90 <#assign
91 hay1 = listaOrdenada[cur_item?index + 1]??
92 hay2 = listaOrdenada[cur_item?index + 2]??
93 />
94 <div class="servicios-estacion" id="servicios-estacion">
95 <@boxPaint cur_item cur_item?index texto/>
96 <#if hay1>
97 <@boxPaint listaOrdenada[cur_item?index + 1] cur_item?index + 1 texto/>
98 <#if hay2>
99 <@boxPaint listaOrdenada[cur_item?index + 2] cur_item?index + 2 texto/>
100 </#if>
101 </#if>
102 </div>
103 <@detailPaint cur_item cur_item?index texto/>
104 <#if hay1>
105 <@detailPaint listaOrdenada[cur_item?index + 1] cur_item?index + 1 texto/>
106 <#if hay2>
107 <@detailPaint listaOrdenada[cur_item?index + 2] cur_item?index + 2 texto/>
108 </#if>
109 </#if>
110 </#if>
111 </#list>
112 </#if>
113</#macro>
114
115<#macro boxPaint elem index texto>
116 <#if elem.pop ?? && elem.pop != "">
117 <button class="linkServiciosDesp" id="button-detalleServicio${texto}-${index}" aria-expanded="false" aria-controls="detalleServicio${texto}-${index}" onclick="toggle('detalleServicio${texto}-${index}', 'button-detalleServicio${texto}-${index}')">
118 </#if>
119 <div class="servicio-estacion" id="iconoServicio${texto}-${index}">
120 <div class="servicio-estacion-icono" style="background-image:url('${elem.icono}')"></div>
121 <div class="servicio-estacion-datos">
122 <h4>${elem.titulo}</h4>
123 <p class="descripcion-servicios">${elem.descripcion}</p>
124 <#if elem.pop ?? && elem.pop != "">
125 <p class="detalle-mas-informacion">
126 <span class="texto_servicios_responsive" data-desktoptext="Más información" data-phonetext="+"></span>
127 </p>
128 </#if>
129 </div>
130 </div>
131 <#if elem.pop ?? && elem.pop != "">
132 </button>
133 </#if>
134</#macro>
135
136<#macro detailPaint elem index texto>
137 <div role="region" aria-labelledby="button-detalleServicio${texto}-${index}" class="servicios-estacion" id="detalleServicio${texto}-${index}" style="display:none">
138 <div class="servicio-estacion servicio-estacion-detalle servicio-estacion-detalle-${index%3} ">
139 <div class="servicio-estacion-icono" style="background-image:url('${elem.icono}')"></div>
140 <div class="servicio-estacion-datos">
141 <h4>${elem.titulo}</h4>
142 ${elem.pop}
143 <p>
144 <button aria-label="<@liferay.language key="navigation.cerrar" /> ${elem.titulo}" class="btn-close-adif" type="button" onclick="toggle('detalleServicio${texto}-${index}', 'button-detalleServicio${texto}-${index}')">×</button>
145 </p>
146 </div>
147 </div>
148 </div>
149</#macro>
150
151
152
153<#function esMayor string1 string2>
154 <#assign strings = [string1,string2]?sort>
155 <#return strings[0]==string2>
156</#function>
Cafetería
Número de local: Vestíbulo
Tecnotrón
Número de local: Vestíbulo

