Santiago de Compostela - Daniel Castelao

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.
-
lunes 17/08/2026
-
Hora actual - 05:06 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 |
|---|---|---|---|
|
05:44
|
RF - AVLO04154 |
1
|
|
| Compartido: Avant 34154 A Coruña - Ourense | |||
|
06:08
|
RF - MD12411 |
1
|
|
|
06:29
|
RF - AVANT09061 |
4
|
|
|
06:31
|
RF - REGIONAL12512 |
2
|
|
|
06:46
|
RF - AVE04464 |
1
|
|
|
07:08
|
RF - AVANT09470 |
4
|
|
|
07:29
|
RF - MD09073 |
1
|
|
|
07:38
|
RF - LANZADERA-MIXTA09072 |
2
|
|
|
07:40
|
RF - AVE04364 |
1
|
|
|
08:14
|
RF - LANZADERA-MIXTA09071 |
1
|
|
|
08:23
|
RF - AVANT09480 |
4
|
|
|
08:23
|
RF - MD12480 |
3A
|
|
|
08:28
|
RF - ALVIA00620 |
5
|
|
|
08:29
|
RF - MD09083 |
1
|
|
|
08:54
|
RF - MD09082 |
||
|
09:29
|
RF - MD09093 |
||
|
09:56
|
RF - AVLO04295 |
||
| Compartido: Avant 34295 A Coruña - Ourense | |||
|
10:16
|
RF - MD12421 |
||
|
10:29
|
RF - AVANT09101 |
||
|
10:33
|
RF - AVANT09090 |
||
|
10:44
|
RF - AVLO04494 |
||
|
10:53
|
RF - MD12526 |
||
|
11:19
|
RF - MD09113 |
||
|
11:32
|
RF - AVE04475 |
||
|
11:34
|
RF - MD09112 |
||
No se ha podido recuperar información de circulación.
Informacion de la estación
-
Dirección
C/ Hórreo, 75 A --- 15702 Santiago de Compostela --- A CORUÑA
-
Horario
Diario: 05:00 a 00:00
Intermodalidad
Línea 6A: Esta línea conecta la estación de tren con el Aeropuerto de Santiago de Compostela (Rosalía de Castro).
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>
Tecnotrón
Número de local: 15
Cajero automático
Número de local: Vestíbulo
Hertz
Número de local: Vestíbulo
Sixt
Número de local: Vestíbulo

