camino frances

This commit is contained in:
Tatiana Villa Ema 2026-05-02 10:20:22 +02:00
parent 7c048d7a9d
commit 064c75866c
13 changed files with 2439 additions and 653 deletions

View File

@ -10,6 +10,22 @@ import java.util.List;
public class CaminoData {
private static List<GPXParser.PuntoGPS> fullTrackCache = null;
public static List<GPXParser.PuntoGPS> getFullTrack(Context context) {
if (fullTrackCache == null) {
try {
InputStream is = context.getResources().openRawResource(R.raw.camino_frances);
fullTrackCache = GPXParser.parse(is);
is.close();
} catch (Exception e) {
e.printStackTrace();
fullTrackCache = new ArrayList<>();
}
}
return fullTrackCache;
}
private static String loadJSONFromRaw(Context context, int resourceId) {
try {
InputStream is = context.getResources().openRawResource(resourceId);
@ -139,4 +155,141 @@ public class CaminoData {
}
return lista;
}
public static List<Etapa> getEtapasPlanificadas(Context context, double maxDist) {
List<Etapa> etapas = new ArrayList<>();
String json = loadJSONFromRaw(context, R.raw.caminofrances);
List<GPXParser.PuntoGPS> track = getFullTrack(context);
if (json == null || track.isEmpty()) return etapas;
try {
JSONArray pueblos = new JSONArray(json);
int etapaNum = 1;
int currentPuebloIndex = 0;
while (currentPuebloIndex < pueblos.length() - 1) {
JSONObject inicioPueblo = pueblos.getJSONObject(currentPuebloIndex);
double distAcumulada = 0;
int desnivelPos = 0;
int desnivelNeg = 0;
List<Integer> perfil = new ArrayList<>();
int lastAlbergueIndex = -1;
double distAtLastAlbergue = 0;
int posAtLastAlbergue = 0;
int negAtLastAlbergue = 0;
List<Integer> perfilAtLastAlbergue = new ArrayList<>();
int searchPuebloIndex = currentPuebloIndex + 1;
while (searchPuebloIndex < pueblos.length()) {
JSONObject pPrev = pueblos.getJSONObject(searchPuebloIndex - 1);
JSONObject pCurr = pueblos.getJSONObject(searchPuebloIndex);
// Calculamos la distancia y desnivel entre estos dos pueblos usando el GPX
SegmentInfo segment = getSegmentInfo(track,
pPrev.getDouble("lat"), pPrev.getDouble("lng"),
pCurr.getDouble("lat"), pCurr.getDouble("lng"));
distAcumulada += segment.distancia;
desnivelPos += segment.desnivelPos;
desnivelNeg += segment.desnivelNeg;
perfil.addAll(segment.altitudes);
if (pCurr.optBoolean("tiene_albergue", true)) {
lastAlbergueIndex = searchPuebloIndex;
distAtLastAlbergue = distAcumulada;
posAtLastAlbergue = desnivelPos;
negAtLastAlbergue = desnivelNeg;
perfilAtLastAlbergue = new ArrayList<>(perfil);
}
if (distAcumulada > maxDist && lastAlbergueIndex != -1) {
break;
}
searchPuebloIndex++;
}
int endPuebloIndex = (lastAlbergueIndex != -1) ? lastAlbergueIndex : (pueblos.length() - 1);
JSONObject finPueblo = pueblos.getJSONObject(endPuebloIndex);
double dTotal = lastAlbergueIndex != -1 ? distAtLastAlbergue : distAcumulada;
int pTotal = lastAlbergueIndex != -1 ? posAtLastAlbergue : desnivelPos;
int dificultad = 1;
if (dTotal > 25 || pTotal > 600) dificultad = 3;
else if (dTotal > 18 || pTotal > 300) dificultad = 2;
Etapa e = new Etapa(
"Etapa " + etapaNum++,
inicioPueblo.getString("nombre"),
finPueblo.getString("nombre"),
inicioPueblo.getString("nombre") + " - " + finPueblo.getString("nombre"),
"Francés",
Math.round(dTotal * 10.0) / 10.0,
dificultad, "Camino planificado con GPX.", "Ruta de alta precisión",
finPueblo.getDouble("lat"),
finPueblo.getDouble("lng")
);
e.setDesnivelPositivo(pTotal);
e.setDesnivelNegativo(lastAlbergueIndex != -1 ? negAtLastAlbergue : desnivelNeg);
e.setPerfilElevacion(lastAlbergueIndex != -1 ? perfilAtLastAlbergue : perfil);
etapas.add(e);
currentPuebloIndex = endPuebloIndex;
if (currentPuebloIndex >= pueblos.length() - 1) break;
}
} catch (Exception e) {
e.printStackTrace();
}
return etapas;
}
private static class SegmentInfo {
double distancia = 0;
int desnivelPos = 0;
int desnivelNeg = 0;
List<Integer> altitudes = new ArrayList<>();
}
private static SegmentInfo getSegmentInfo(List<GPXParser.PuntoGPS> track, double lat1, double lon1, double lat2, double lon2) {
SegmentInfo info = new SegmentInfo();
int startIdx = findNearestIndex(track, lat1, lon1);
int endIdx = findNearestIndex(track, lat2, lon2);
if (startIdx > endIdx) { int temp = startIdx; startIdx = endIdx; endIdx = temp; }
for (int i = startIdx; i < endIdx; i++) {
GPXParser.PuntoGPS p1 = track.get(i);
GPXParser.PuntoGPS p2 = track.get(i + 1);
info.distancia += calcularDistancia(p1.lat, p1.lng, p2.lat, p2.lng);
int diff = (int)(p2.alt - p1.alt);
if (diff > 0) info.desnivelPos += diff;
else info.desnivelNeg += Math.abs(diff);
if (i % 10 == 0) info.altitudes.add((int)p1.alt); // Muestreo para no saturar el gráfico
}
return info;
}
private static int findNearestIndex(List<GPXParser.PuntoGPS> track, double lat, double lon) {
int nearest = 0;
double minDist = Double.MAX_VALUE;
for (int i = 0; i < track.size(); i++) {
double d = calcularDistancia(lat, lon, track.get(i).lat, track.get(i).lng);
if (d < minDist) {
minDist = d;
nearest = i;
}
}
return nearest;
}
private static double calcularDistancia(double lat1, double lon1, double lat2, double lon2) {
float[] results = new float[1];
android.location.Location.distanceBetween(lat1, lon1, lat2, lon2, results);
return results[0] / 1000.0;
}
}

View File

@ -35,10 +35,14 @@ public class Etapa implements Serializable {
this.latitud = latitud;
this.longitud = longitud;
this.imagenUrl = "https://picsum.photos/seed/" + nombre.replace(" ", "") + "/800/400";
// Valores por defecto para el ejemplo
this.desnivelPositivo = (int) (distancia * 15);
this.desnivelNegativo = (int) (distancia * 12);
this.perfilElevacion = generarPerfilMock(distancia);
// Valores por defecto
this.desnivelPositivo = 0;
this.desnivelNegativo = 0;
this.perfilElevacion = new ArrayList<>();
}
public void setPerfilElevacion(List<Integer> perfil) {
this.perfilElevacion = perfil;
}
private List<Integer> generarPerfilMock(double dist) {

View File

@ -34,6 +34,19 @@ public class EtapaAdapter extends RecyclerView.Adapter<EtapaAdapter.EtapaViewHol
holder.tvNombre.setText(titulo);
holder.tvDistancia.setText(etapa.getDistancia() + " km");
// Configuración del tag de dificultad
int dificultad = etapa.getDificultad();
if (dificultad == 3) {
holder.tvDificultad.setText("DIFÍCIL");
holder.tvDificultad.setBackgroundColor(android.graphics.Color.parseColor("#D32F2F")); // Rojo
} else if (dificultad == 2) {
holder.tvDificultad.setText("MODERADA");
holder.tvDificultad.setBackgroundColor(android.graphics.Color.parseColor("#FBC02D")); // Amarillo/Naranja
} else {
holder.tvDificultad.setText("FÁCIL");
holder.tvDificultad.setBackgroundColor(android.graphics.Color.parseColor("#388E3C")); // Verde
}
Glide.with(holder.itemView.getContext())
.load(etapa.getImagenUrl())
.placeholder(android.R.drawable.ic_menu_gallery)
@ -53,13 +66,14 @@ public class EtapaAdapter extends RecyclerView.Adapter<EtapaAdapter.EtapaViewHol
// El ViewHolder es el "molde" para los elementos de la vista
public static class EtapaViewHolder extends RecyclerView.ViewHolder {
TextView tvNombre, tvDistancia;
TextView tvNombre, tvDistancia, tvDificultad;
ImageView ivMiniatura;
public EtapaViewHolder(@NonNull View itemView) {
super(itemView);
tvNombre = itemView.findViewById(R.id.tvNombreEtapa);
tvDistancia = itemView.findViewById(R.id.tvDistancia);
tvDificultad = itemView.findViewById(R.id.tvDificultadTag);
ivMiniatura = itemView.findViewById(R.id.ivEtapaMiniatura);
}
}

View File

@ -44,16 +44,16 @@ public class EtapasActivity extends AppCompatActivity {
String[] opcionesCaminos = {"Norte", "Francés"};
ArrayAdapter<String> adapterCaminos = new ArrayAdapter<>(this,
android.R.layout.simple_spinner_item, opcionesCaminos);
adapterCaminos.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
R.layout.spinner_item, opcionesCaminos);
adapterCaminos.setDropDownViewResource(R.layout.spinner_item);
spinnerCaminos.setAdapter(adapterCaminos);
// 5. Configuración del Spinner para distancia máxima
Spinner spinnerDistancia = findViewById(R.id.spinnerDistancia);
String[] opcionesDistancia = {"Sin límite", "15 km", "20 km", "25 km"};
ArrayAdapter<String> adapterDistancia = new ArrayAdapter<>(this,
android.R.layout.simple_spinner_item, opcionesDistancia);
adapterDistancia.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
R.layout.spinner_item, opcionesDistancia);
adapterDistancia.setDropDownViewResource(R.layout.spinner_item);
spinnerDistancia.setAdapter(adapterDistancia);
AdapterView.OnItemSelectedListener listener = new AdapterView.OnItemSelectedListener() {
@ -80,13 +80,22 @@ public class EtapasActivity extends AppCompatActivity {
}
private void actualizarListaEtapas(String camino, double maxDistancia, RecyclerView recyclerView) {
List<Etapa> filtradas;
if (camino.equalsIgnoreCase("Francés") && maxDistancia < 1000) {
// Si es el Camino Francés y hay un límite de distancia, usamos el planificador dinámico
filtradas = CaminoData.getEtapasPlanificadas(this, maxDistancia);
} else {
// Para otros casos o sin límite, usamos las etapas predefinidas
List<Etapa> todas = CaminoData.getEtapasPorCamino(this, camino);
List<Etapa> filtradas = new ArrayList<>();
filtradas = new ArrayList<>();
for (Etapa e : todas) {
if (e.getDistancia() <= maxDistancia) {
filtradas.add(e);
}
}
}
EtapaAdapter adapter = new EtapaAdapter(filtradas);
recyclerView.setAdapter(adapter);
}

View File

@ -0,0 +1,45 @@
package es.tatvil.elfarodelperegrino;
import android.util.Xml;
import org.xmlpull.v1.XmlPullParser;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
public class GPXParser {
public static class PuntoGPS {
public double lat, lng, alt;
public PuntoGPS(double lat, double lng, double alt) {
this.lat = lat;
this.lng = lng;
this.alt = alt;
}
}
public static List<PuntoGPS> parse(InputStream in) throws Exception {
List<PuntoGPS> puntos = new ArrayList<>();
XmlPullParser parser = Xml.newPullParser();
parser.setInput(in, null);
int eventType = parser.getEventType();
PuntoGPS puntoActual = null;
while (eventType != XmlPullParser.END_DOCUMENT) {
String tag = parser.getName();
if (eventType == XmlPullParser.START_TAG) {
if ("trkpt".equalsIgnoreCase(tag)) {
double lat = Double.parseDouble(parser.getAttributeValue(null, "lat"));
double lon = Double.parseDouble(parser.getAttributeValue(null, "lon"));
puntoActual = new PuntoGPS(lat, lon, 0);
} else if ("ele".equalsIgnoreCase(tag) && puntoActual != null) {
puntoActual.alt = Double.parseDouble(parser.nextText());
}
} else if (eventType == XmlPullParser.END_TAG && "trkpt".equalsIgnoreCase(tag)) {
if (puntoActual != null) puntos.add(puntoActual);
}
eventType = parser.next();
}
return puntos;
}
}

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/spiritual_surface" />
<corners android:radius="12dp" />
<stroke
android:width="1dp"
android:color="@color/maritime_blue_mary" />
</shape>

View File

@ -12,38 +12,44 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="8dp"
android:padding="12dp"
android:background="@color/spiritual_black"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Selecciona el Camino:"
android:textColor="@color/text_primary"
android:textSize="14sp"
android:layout_marginStart="8dp"/>
android:textColor="@color/spiritual_text_dim"
android:textSize="12sp"
android:textStyle="bold"
android:layout_marginStart="8dp"
android:layout_marginBottom="4dp"/>
<Spinner
android:id="@+id/spinnerCaminos"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:background="@android:drawable/btn_dropdown" />
android:layout_height="48dp"
android:layout_marginBottom="12dp"
android:background="@drawable/spinner_background"
android:popupBackground="@color/spiritual_surface" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Distancia máxima por etapa:"
android:textColor="@color/text_primary"
android:textSize="14sp"
android:layout_marginStart="8dp"/>
android:textColor="@color/spiritual_text_dim"
android:textSize="12sp"
android:textStyle="bold"
android:layout_marginStart="8dp"
android:layout_marginBottom="4dp"/>
<Spinner
android:id="@+id/spinnerDistancia"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:background="@android:drawable/btn_dropdown" />
android:layout_height="48dp"
android:background="@drawable/spinner_background"
android:popupBackground="@color/spiritual_surface" />
</LinearLayout>
<androidx.recyclerview.widget.RecyclerView

View File

@ -42,6 +42,19 @@
android:layout_height="wrap_content"
android:text="0.0 km"
android:textColor="#757575"/>
<TextView
android:id="@+id/tvDificultadTag"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingHorizontal="8dp"
android:paddingVertical="2dp"
android:textSize="10sp"
android:textStyle="bold"
android:textColor="#FFFFFF"
android:background="@android:color/holo_green_dark"
android:layout_marginTop="4dp"
android:text="FÁCIL"/>
</LinearLayout>
</LinearLayout>

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="12dp"
android:textColor="@color/spiritual_gold"
android:textSize="16sp"
android:background="@color/spiritual_surface" />

View File

@ -1,29 +0,0 @@
​Roncesvalle
​Burguete
​Zubiri
​Pamplona
​Puente la Reina
​Estella
​Viana
​Logroño
​Navarrete
​Nájera
​Santo Domingo de la Calzada
​Burgos
​Castrojeriz
​Frómista
​Carrión de los Condes
​Sahagún
​León
​Hospital de Órbigo
​Astorga
​Ponferrada
​Villafranca del Bierzo
​O Cebreiro
​Triacastela
​Sarria
​Portomarín
​Palas de Rei
​Melide
​Arzúa
​Santiago de Compostela

View File

@ -1,597 +0,0 @@
[
{
"nombre": "Saint-Jean-Pied-de-Port",
"lat": 43.1636,
"lng": -1.2394
},
{
"nombre": "Huntto",
"lat": 43.1345,
"lng": -1.2461
},
{
"nombre": "Orisson",
"lat": 43.1234,
"lng": -1.2642
},
{
"nombre": "Roncesvalles",
"lat": 43.0092,
"lng": -1.3194
},
{
"nombre": "Burguete",
"lat": 42.9891,
"lng": -1.3341
},
{
"nombre": "Espinal",
"lat": 42.9774,
"lng": -1.3735
},
{
"nombre": "Viscarret",
"lat": 42.9492,
"lng": -1.4111
},
{
"nombre": "Lintzoáin",
"lat": 42.9413,
"lng": -1.4285
},
{
"nombre": "Zubiri",
"lat": 42.9298,
"lng": -1.5042
},
{
"nombre": "Larrasoaña",
"lat": 42.9094,
"lng": -1.5235
},
{
"nombre": "Akerreta",
"lat": 42.8986,
"lng": -1.5264
},
{
"nombre": "Zuriáin",
"lat": 42.8794,
"lng": -1.5542
},
{
"nombre": "Irotz",
"lat": 42.8712,
"lng": -1.5678
},
{
"nombre": "Zabaldika",
"lat": 42.8634,
"lng": -1.5794
},
{
"nombre": "Trinidad de Arre",
"lat": 42.8425,
"lng": -1.6136
},
{
"nombre": "Pamplona",
"lat": 42.8125,
"lng": -1.6458
},
{
"nombre": "Cizur Menor",
"lat": 42.7936,
"lng": -1.6741
},
{
"nombre": "Zariquiegui",
"lat": 42.7478,
"lng": -1.7164
},
{
"nombre": "Uterga",
"lat": 42.7142,
"lng": -1.7584
},
{
"nombre": "Muruzábal",
"lat": 42.6931,
"lng": -1.7652
},
{
"nombre": "Obanos",
"lat": 42.6806,
"lng": -1.7856
},
{
"nombre": "Puente la Reina",
"lat": 42.6719,
"lng": -1.8156
},
{
"nombre": "Mañeru",
"lat": 42.6661,
"lng": -1.8672
},
{
"nombre": "Cirauqui",
"lat": 42.6736,
"lng": -1.8986
},
{
"nombre": "Lorca",
"lat": 42.6725,
"lng": -1.9794
},
{
"nombre": "Villatuerta",
"lat": 42.6592,
"lng": -2.0306
},
{
"nombre": "Estella",
"lat": 42.6717,
"lng": -2.0306
},
{
"nombre": "Ayegui",
"lat": 42.6558,
"lng": -2.0461
},
{
"nombre": "Azqueta",
"lat": 42.6394,
"lng": -2.1125
},
{
"nombre": "Villamayor de Monjardín",
"lat": 42.6286,
"lng": -2.1386
},
{
"nombre": "Los Arcos",
"lat": 42.5694,
"lng": -2.1917
},
{
"nombre": "Sansol",
"lat": 42.5564,
"lng": -2.2614
},
{
"nombre": "Torres del Río",
"lat": 42.5519,
"lng": -2.2725
},
{
"nombre": "Viana",
"lat": 42.5153,
"lng": -2.3719
},
{
"nombre": "Logroño",
"lat": 42.4627,
"lng": -2.4447
},
{
"nombre": "Navarrete",
"lat": 42.4286,
"lng": -2.5622
},
{
"nombre": "Nájera",
"lat": 42.4161,
"lng": -2.7319
},
{
"nombre": "Azofra",
"lat": 42.4239,
"lng": -2.7917
},
{
"nombre": "Cirueña",
"lat": 42.4114,
"lng": -2.8942
},
{
"nombre": "Santo Domingo de la Calzada",
"lat": 42.4406,
"lng": -2.9531
},
{
"nombre": "Grañón",
"lat": 42.4503,
"lng": -3.0286
},
{
"nombre": "Redecilla del Camino",
"lat": 42.4386,
"lng": -3.0642
},
{
"nombre": "Viloria de Rioja",
"lat": 42.4244,
"lng": -3.1022
},
{
"nombre": "Belorado",
"lat": 42.4203,
"lng": -3.1903
},
{
"nombre": "Tosantos",
"lat": 42.4136,
"lng": -3.2458
},
{
"nombre": "Villafranca Montes de Oca",
"lat": 42.3875,
"lng": -3.3106
},
{
"nombre": "San Juan de Ortega",
"lat": 42.3789,
"lng": -3.4358
},
{
"nombre": "Agés",
"lat": 42.3742,
"lng": -3.4794
},
{
"nombre": "Atapuerca",
"lat": 42.3778,
"lng": -3.5097
},
{
"nombre": "Burgos",
"lat": 42.3439,
"lng": -3.6969
},
{
"nombre": "Tardajos",
"lat": 42.3475,
"lng": -3.8186
},
{
"nombre": "Rabé de las Calzadas",
"lat": 42.3403,
"lng": -3.8344
},
{
"nombre": "Hornillos del Camino",
"lat": 42.3394,
"lng": -3.9264
},
{
"nombre": "Hontanas",
"lat": 42.3117,
"lng": -4.0453
},
{
"nombre": "Castrojeriz",
"lat": 42.2881,
"lng": -4.1378
},
{
"nombre": "Itero de la Vega",
"lat": 42.2861,
"lng": -4.2542
},
{
"nombre": "Boadilla del Camino",
"lat": 42.2592,
"lng": -4.3494
},
{
"nombre": "Frómista",
"lat": 42.2683,
"lng": -4.4069
},
{
"nombre": "Población de Campos",
"lat": 42.2708,
"lng": -4.4467
},
{
"nombre": "Villarmentero de Campos",
"lat": 42.2858,
"lng": -4.5103
},
{
"nombre": "Villalcázar de Sirga",
"lat": 42.3164,
"lng": -4.5425
},
{
"nombre": "Carrión de los Condes",
"lat": 42.3392,
"lng": -4.6061
},
{
"nombre": "Calzadilla de la Cueza",
"lat": 42.3592,
"lng": -4.8386
},
{
"nombre": "Lédigos",
"lat": 42.3556,
"lng": -4.9192
},
{
"nombre": "Terradillos de los Templarios",
"lat": 42.3533,
"lng": -4.9567
},
{
"nombre": "Moratinos",
"lat": 42.3578,
"lng": -4.9911
},
{
"nombre": "San Nicolás del Real Camino",
"lat": 42.3614,
"lng": -5.0211
},
{
"nombre": "Sahagún",
"lat": 42.3719,
"lng": -5.0286
},
{
"nombre": "Bercianos del Real Camino",
"lat": 42.3875,
"lng": -5.1464
},
{
"nombre": "El Burgo Ranero",
"lat": 42.4239,
"lng": -5.2217
},
{
"nombre": "Reliegos",
"lat": 42.4847,
"lng": -5.3517
},
{
"nombre": "Mansilla de las Mulas",
"lat": 42.5036,
"lng": -5.4158
},
{
"nombre": "León",
"lat": 42.5989,
"lng": -5.5672
},
{
"nombre": "Virgen del Camino",
"lat": 42.5786,
"lng": -5.6417
},
{
"nombre": "Villadangos del Páramo",
"lat": 42.5169,
"lng": -5.7667
},
{
"nombre": "San Martín del Camino",
"lat": 42.4939,
"lng": -5.8119
},
{
"nombre": "Hospital de Órbigo",
"lat": 42.4631,
"lng": -5.8825
},
{
"nombre": "Santibáñez de Valdeiglesias",
"lat": 42.4647,
"lng": -5.9239
},
{
"nombre": "Astorga",
"lat": 42.4578,
"lng": -6.0567
},
{
"nombre": "Murias de Rechivaldo",
"lat": 42.4608,
"lng": -6.1039
},
{
"nombre": "Santa Catalina de Somoza",
"lat": 42.4553,
"lng": -6.1583
},
{
"nombre": "El Ganso",
"lat": 42.4517,
"lng": -6.2081
},
{
"nombre": "Rabanal del Camino",
"lat": 42.4808,
"lng": -6.2831
},
{
"nombre": "Foncebadón",
"lat": 42.4947,
"lng": -6.3422
},
{
"nombre": "Acebo",
"lat": 42.5097,
"lng": -6.4172
},
{
"nombre": "Molinaseca",
"lat": 42.5375,
"lng": -6.5203
},
{
"nombre": "Ponferrada",
"lat": 42.5458,
"lng": -6.5911
},
{
"nombre": "Camponaraya",
"lat": 42.5811,
"lng": -6.6703
},
{
"nombre": "Cacabelos",
"lat": 42.5997,
"lng": -6.7264
},
{
"nombre": "Villafranca del Bierzo",
"lat": 42.6075,
"lng": -6.8111
},
{
"nombre": "Trabadelo",
"lat": 42.6503,
"lng": -6.8858
},
{
"nombre": "La Portela de Valcarce",
"lat": 42.6681,
"lng": -6.9467
},
{
"nombre": "Vega de Valcarce",
"lat": 42.6644,
"lng": -6.9478
},
{
"nombre": "Las Herrerías",
"lat": 42.6931,
"lng": -7.0039
},
{
"nombre": "La Faba",
"lat": 42.7003,
"lng": -7.0286
},
{
"nombre": "O Cebreiro",
"lat": 42.7081,
"lng": -7.0436
},
{
"nombre": "Liñares",
"lat": 42.7161,
"lng": -7.0864
},
{
"nombre": "Hospital da Condesa",
"lat": 42.7214,
"lng": -7.1122
},
{
"nombre": "Padornelo",
"lat": 42.7239,
"lng": -7.1306
},
{
"nombre": "Triacastela",
"lat": 42.7558,
"lng": -7.2417
},
{
"nombre": "Samos",
"lat": 42.7303,
"lng": -7.3275
},
{
"nombre": "Sarria",
"lat": 42.7778,
"lng": -7.4161
},
{
"nombre": "Barbadelo",
"lat": 42.7664,
"lng": -7.4642
},
{
"nombre": "Ferreiros",
"lat": 42.7417,
"lng": -7.5494
},
{
"nombre": "Portomarín",
"lat": 42.8078,
"lng": -7.6167
},
{
"nombre": "Gonzar",
"lat": 42.8436,
"lng": -7.6964
},
{
"nombre": "Ventas de Narón",
"lat": 42.8594,
"lng": -7.7319
},
{
"nombre": "Ligonde",
"lat": 42.8642,
"lng": -7.7711
},
{
"nombre": "Palas de Rei",
"lat": 42.8733,
"lng": -7.8694
},
{
"nombre": "Casanova",
"lat": 42.8839,
"lng": -7.9342
},
{
"nombre": "Leboreiro",
"lat": 42.8881,
"lng": -7.9864
},
{
"nombre": "Melide",
"lat": 42.9153,
"lng": -8.0142
},
{
"nombre": "Boente",
"lat": 42.9169,
"lng": -8.0811
},
{
"nombre": "Ribadiso da Baixo",
"lat": 42.9231,
"lng": -8.1467
},
{
"nombre": "Arzúa",
"lat": 42.9272,
"lng": -8.1642
},
{
"nombre": "Salceda",
"lat": 42.9136,
"lng": -8.2831
},
{
"nombre": "O Pedrouzo",
"lat": 42.9039,
"lng": -8.3611
},
{
"nombre": "Monte do Gozo",
"lat": 42.8894,
"lng": -8.4942
},
{
"nombre": "Santiago de Compostela",
"lat": 42.8806,
"lng": -8.5447
}
]

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,163 @@
[
{
"nombre": "Saint-Jean-Pied-de-Port",
"lat": 43.1636,
"lng": -1.2394,
"alt": 172,
"tiene_albergue": true
},
{
"nombre": "Huntto",
"lat": 43.1345,
"lng": -1.2461,
"alt": 608,
"tiene_albergue": true
},
{
"nombre": "Orisson",
"lat": 43.1234,
"lng": -1.2642,
"alt": 792,
"tiene_albergue": true
},
{
"nombre": "Puerto de Ibañeta",
"lat": 43.0205,
"lng": -1.3242,
"alt": 1057,
"tiene_albergue": false
},
{
"nombre": "Roncesvalles",
"lat": 43.0092,
"lng": -1.3194,
"alt": 950,
"tiene_albergue": true
},
{
"nombre": "Burguete",
"lat": 42.9891,
"lng": -1.3341,
"alt": 885,
"tiene_albergue": true
},
{
"nombre": "Espinal",
"lat": 42.9774,
"lng": -1.3735,
"alt": 870,
"tiene_albergue": true
},
{
"nombre": "Viscarret",
"lat": 42.9492,
"lng": -1.4111,
"alt": 780,
"tiene_albergue": true
},
{
"nombre": "Zubiri",
"lat": 42.9298,
"lng": -1.5042,
"alt": 526,
"tiene_albergue": true
},
{
"nombre": "Larrasoaña",
"lat": 42.9094,
"lng": -1.5235,
"alt": 485,
"tiene_albergue": true
},
{
"nombre": "Pamplona",
"lat": 42.8125,
"lng": -1.6458,
"alt": 446,
"tiene_albergue": true
},
{
"nombre": "Puente la Reina",
"lat": 42.6719,
"lng": -1.8156,
"alt": 345,
"tiene_albergue": true
},
{
"nombre": "Estella",
"lat": 42.6717,
"lng": -2.0306,
"alt": 425,
"tiene_albergue": true
},
{
"nombre": "Logroño",
"lat": 42.4627,
"lng": -2.4447,
"alt": 384,
"tiene_albergue": true
},
{
"nombre": "Santo Domingo de la Calzada",
"lat": 42.4406,
"lng": -2.9531,
"alt": 638,
"tiene_albergue": true
},
{
"nombre": "Burgos",
"lat": 42.3439,
"lng": -3.6969,
"alt": 856,
"tiene_albergue": true
},
{
"nombre": "León",
"lat": 42.5989,
"lng": -5.5672,
"alt": 837,
"tiene_albergue": true
},
{
"nombre": "Astorga",
"lat": 42.4578,
"lng": -6.0567,
"alt": 869,
"tiene_albergue": true
},
{
"nombre": "Ponferrada",
"lat": 42.5458,
"lng": -6.5911,
"alt": 543,
"tiene_albergue": true
},
{
"nombre": "O Cebreiro",
"lat": 42.7081,
"lng": -7.0436,
"alt": 1330,
"tiene_albergue": true
},
{
"nombre": "Sarria",
"lat": 42.7778,
"lng": -7.4161,
"alt": 454,
"tiene_albergue": true
},
{
"nombre": "Portomarín",
"lat": 42.8078,
"lng": -7.6167,
"alt": 387,
"tiene_albergue": true
},
{
"nombre": "Santiago de Compostela",
"lat": 42.8806,
"lng": -8.5447,
"alt": 260,
"tiene_albergue": true
}
]