From 9317ba8c54344f1713ae5802b933e46521098d97 Mon Sep 17 00:00:00 2001 From: Francisco Sandoval Date: Sun, 26 Nov 2023 20:05:39 -0300 Subject: [PATCH] avance ver buses y paraderos de ruta --- src/assets/autobus.png | Bin 0 -> 2617 bytes .../{parada-de-autobus.png => parada.png} | Bin src/assets/partida.png | Bin 1909 -> 1898 bytes src/assets/termino.png | Bin 3272 -> 1820 bytes src/pages/mapas/FiltroRutas.svelte | 86 +++++++++++ src/pages/mapas/Paraderos.svelte | 8 +- src/pages/mapas/Rutas.svelte | 139 +++++++++++------- src/services/lineas.js | 16 ++ 8 files changed, 192 insertions(+), 57 deletions(-) create mode 100644 src/assets/autobus.png rename src/assets/{parada-de-autobus.png => parada.png} (100%) create mode 100644 src/pages/mapas/FiltroRutas.svelte diff --git a/src/assets/autobus.png b/src/assets/autobus.png new file mode 100644 index 0000000000000000000000000000000000000000..d89a719a692fb72e76a29e70f83816d6ebebda7d GIT binary patch literal 2617 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 delta 1820 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 Z{tu=8K-{p)%klsK002ovPDHLkV1iqaQj-7x delta 3194 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 diff --git a/src/pages/mapas/FiltroRutas.svelte b/src/pages/mapas/FiltroRutas.svelte new file mode 100644 index 0000000..d1ddb53 --- /dev/null +++ b/src/pages/mapas/FiltroRutas.svelte @@ -0,0 +1,86 @@ + + +
+
+ +
+
Operador
+ +
+ +
+
Linea
+ +
+ +
+
+ +
+ + +
+ +
+ + +
+ +
+
diff --git a/src/pages/mapas/Paraderos.svelte b/src/pages/mapas/Paraderos.svelte index b1ac578..830ddec 100644 --- a/src/pages/mapas/Paraderos.svelte +++ b/src/pages/mapas/Paraderos.svelte @@ -12,7 +12,7 @@ // libs import { onMount } from 'svelte' import { storeParaderos } from "$/stores/global" - import imagenParada from '$/assets/parada-de-autobus.png' + import imagenParada from '$/assets/parada.png' let myMap = null let elMap = null @@ -41,9 +41,9 @@ if (!iconParada) { iconParada = L.icon({ iconUrl: imagenParada, - iconSize: [64, 64], - iconAnchor: [32, 64], - popupAnchor: [0, -32] + iconSize: [32, 32], + iconAnchor: [16, 32], + popupAnchor: [0, -16] }) } if (!myMap) { diff --git a/src/pages/mapas/Rutas.svelte b/src/pages/mapas/Rutas.svelte index ba90f18..feba301 100644 --- a/src/pages/mapas/Rutas.svelte +++ b/src/pages/mapas/Rutas.svelte @@ -2,54 +2,40 @@ // componentes import PageTitle from "$/components/PageTitle.svelte"; - import IconLoading from "$/components/IconLoading.svelte"; import imagenPartida from '$/assets/partida.png' import imagenTermino from '$/assets/termino.png' + import imagenParada from '$/assets/parada.png' + import imagenAutobus from '$/assets/autobus.png' import { onMount } from "svelte"; // servicios - import { getOperadores } from "$/services/operadores"; - import { getLineas } from "$/services/lineas"; import { getRutas } from "$/services/mapas"; import ModalLetreroLUR from "./ModalLetreroLUR.svelte"; + import FiltroRutas from "./FiltroRutas.svelte"; + import { getBusesLinea, getParaderosLinea } from "$/services/lineas"; let myMap = null let elMap = null - let operadores = [] - let lineas = [] - let lineas_operador = [] - let id_operador = '' - let id_linea = '' + let loading = false let polyline = null let iconPartida = null let iconTermino = null - let L = null + let iconParada = null + let L = null // leaflet.js let marker1 = null let marker2 = null let showLetrero = false + + let id_operador = '' + let id_linea = '' let codigo = null + let ver_buses = false + let ver_paraderos = false + let markers = [] - $: codigo = lineas.find(el => el.id_linea === id_linea)?.route_short_name || null - $: lineas_operador = id_operador ? - lineas.filter(el => el.id_operador === id_operador) - .sort((a,b) => a.route_short_name < b.route_short_name ? -1 : 1) : []; - - getOperadores({ vigente: 1 }) - .then(data => data.sort((a,b) => a.nombre_operador < b.nombre_operador? -1 : 1)) - .then(data => operadores = data) - .catch(error => alert(error)) - getLineas({ vigente: 1 }) - .then(data => data.sort((a,b) => a.nombre_linea < b.nombre_linea? -1 : 1)) - .then(data => lineas = data) - .catch(error => alert(error)) - - $: cargar_coordenadas(id_operador, id_linea) - - onMount(() => { - create_map() - }) + onMount(() => { create_map() }) function create_map() { if (!elMap || !globalThis.L) return; @@ -66,10 +52,18 @@ iconTermino = L.icon({ iconUrl: imagenTermino, iconSize: [64, 64], - iconAnchor: [32, 64], + iconAnchor: [0, 64], popupAnchor: [0, -32] }) } + if (!iconParada) { + iconParada = L.icon({ + iconUrl: imagenParada, + iconSize: [32, 32], + iconAnchor: [16, 32], + popupAnchor: [0, -16] + }) + } if (!myMap) { myMap = L.map(elMap) L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', @@ -88,8 +82,7 @@ ) } - - async function cargar_coordenadas(id_operador, id_linea) { + async function onMostrarRuta(id_operador, id_linea) { try { loading = true polyline && polyline.remove() @@ -105,7 +98,9 @@ if (coordenadas) { marker1 = L.marker(coordenadas[0], { icon: iconPartida }).addTo(myMap) + marker1.bindTooltip('Inicio') marker2 = L.marker(coordenadas[coordenadas.length -1], { icon: iconTermino }).addTo(myMap) + marker2.bindTooltip('Termino') } } catch (error) { @@ -114,6 +109,54 @@ loading = false; } } + + + async function onMostrarParaderos(ver_paraderos) { + // 1. eliminar marcadores anteriores + markers.forEach(marker => marker.remove()) + + if (!ver_paraderos || !id_linea) return; + + const paraderos = await getParaderosLinea(id_linea) + + // 2. crear marcadores + for (let mark of paraderos) { + const { stop_lat: lat, stop_lon: lng } = mark + const marker = L.marker([lat, lng], { icon: iconParada }).addTo(myMap) + const { id_paradero: title, stop_name: location } = mark; + const html = `${title}
${location}` + + marker.bindTooltip(html) + markers.push(marker) + } + } + + async function onMostrarBuses(ver_buses) { + // 1. eliminar marcadores anteriores + // markers.forEach(marker => marker.remove()) + + if (!ver_buses || !id_linea) return; + + const buses = await getBusesLinea(id_linea) + console.log({ buses }) + + // 2. crear marcadores + // for (let mark of paraderos) { + // const { stop_lat: lat, stop_lon: lng } = mark + // const marker = L.marker([lat, lng], { icon: iconParada }).addTo(myMap) + // const { id_paradero: title, stop_name: location } = mark; + // const html = `${title}
${location}` + + // marker.bindTooltip(html) + // markers.push(marker) + // } + } + + + + $: onMostrarRuta(id_operador, id_linea) + $: onMostrarParaderos(ver_paraderos) + $: onMostrarBuses(ver_buses) @@ -123,37 +166,27 @@
-
+
Rutas
-
-
-
Operador
- - -
Linea
- -
+
+
{#if id_operador && codigo}
- +
{/if}
diff --git a/src/services/lineas.js b/src/services/lineas.js index c536415..e59c08b 100644 --- a/src/services/lineas.js +++ b/src/services/lineas.js @@ -46,3 +46,19 @@ export async function deleteLinea(id) { if (!res.ok) throw await res.text() return res.json() } + +export async function getParaderosLinea(id_linea) { + const res = await fetch(`${base}/lineas/${id_linea}/paraderos`, { + headers: { "Authorization": `Bearer ${getToken()}`, "Content-Type": "application/json" } + }) + if (!res.ok) throw await res.text() + return res.json() +} + +export async function getBusesLinea(id_linea) { + const res = await fetch(`${base}/lineas/${id_linea}/buses`, { + headers: { "Authorization": `Bearer ${getToken()}`, "Content-Type": "application/json" } + }) + if (!res.ok) throw await res.text() + return res.json() +}