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> todas = CaminoData.getEtapasPorCamino(this, camino);
List<Etapa> filtradas = new ArrayList<>();
for (Etapa e : todas) {
if (e.getDistancia() <= maxDistancia) {
filtradas.add(e);
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);
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
}
]