From e69fb36c497e50452d021d1bf8e57bd33e83c385 Mon Sep 17 00:00:00 2001 From: hack_21031301_c761d3 <21031301@itcelaya.edu.mx> Date: Sat, 23 May 2026 03:54:05 -0600 Subject: [PATCH] =?UTF-8?q?fix:=20geolocalizaci=C3=B3n=20GPS=20corregida?= =?UTF-8?q?=20con=20fallback=20por=20coordenadas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/__pycache__/main.cpython-312.pyc | Bin 15347 -> 16042 bytes backend/data/colonias-rutas.json | 2 +- backend/main.py | 14 +++++++++ frontend/App.js | 35 ++++++++++++++++++----- 4 files changed, 43 insertions(+), 8 deletions(-) diff --git a/backend/__pycache__/main.cpython-312.pyc b/backend/__pycache__/main.cpython-312.pyc index 864af120e4ac1f3a9c4529a459ed3716ccf74747..2c30e8520affd41ed9d7eca51b5f77ca2bb344b5 100644 GIT binary patch delta 1717 zcmaJ>ZERCz6uxiUd)uzCcHO#mcV%5^XLma&w!#WHKr+9kxXHi>Ofs7F4%_tu-gbX4f$7c6+Tn=DQIV~i=7Kwb zvQAaD+hHfu6WC0;D37!pi8p}TR&5r}3+1f5A*YGEVVL<0=SkT|IOg-Pxtuy?G-1&C z_n=`FC+R!kth8D@r&07YJ(!g{qMfvrrAt~x6L?%9Tfppht()CPPm< zqnuUvSXNGE;0M3^nN2KAHzTwmQP>hm49Xdb<)Pi^F+M%LV4A|QCKjbl7+s67j)7DG zKi4gIY(UH|30TR)*g7F&^}_jW44YAl+5nYo=@6uHHGiEydyIvEVfBKWBh91W;pIy z>&LB&OV-5~=U-WPY2nq?U$42gX3W}oKwr=mA`>R_clEBjmY!1`drhHi(QF1uaj^R$4T z9SF-1hT%h(qv9j+80ptQGz_Tyybe*ne9P)J|-HfY(Pv2hojg@geHFxM}U8}O>X*-8`W z#CxphQjw%g({R$?*-nSht#$(5QJO{AiY%V}Zc7%g5cXSpH$Nsnr6f(_Sh1V9iQPK=!3Gkgl&GS#5;!y|hth+!^1ddUI_vc9 zn)D|jKTV|+Dz(+{r{+=)psGQLbX6q8g%bymDiA`5cY<>-DLugjX5I>1A;gpR+j-x7 zZ+70y?45;2bIsp2H8qBCt(e=U_w3wkKDQ%slZ8TXb;n$+$%~SUmc=aXlkkQX>{b{Q z+w!p3*#Qr>ZP(^Qa6H)-jaZRR^v|>Dc1X5uZ_zi5K)#^QYtx;utT+r#i-nMjL2FkJ zi<9R`eWT{lCqikX03)%z4YE#DsvbXP!EEe6vPDecS*e#Rb6kjnWY-@adwHyIY;;0~ zC%Ff#yS;Z3d0`VwlR~pCk)qv6g4Yq!2JGw3AFwJjE~S`IOT^KXEhWKCQAC$rvdeZw zRFN&<YA~JRw)9@y-&fz)XxSd^%8uytJhGc*WmYEFSQ0H zxztUrz^nbc^&7ZfgQb4S*5K4YoLz9#s0Vdm$?gv&_Zc1%~sPxc(l}AHsU(mJv*+Kf1e< zF%GBptmg3hr_o&y&rrm$)CTuSR+14>#SmfS5{V@>qJK1uOmc^xn-$MPV>Zpcgj{x@ z%dJPrrPdgGr!K}+BpGqc87`*4$rj+7Sn>sGh8Q83L6F89X1U5;spAjkSlFe1{utFD z*`zn#AkW_KYzB-kcgA3BI3?+>|SRnpO)A)_yz z7#-*CY{hZ84BL(uOe)Qepyo@%;$`k}K|L2#X{nzsS4>Y($|6B<53Uc#*$@7w!=JNM pGi&*v|EI3~-*@fb3gPCLj-KCid_M|@w8LymLvt(PUl~bie*yN&Hyr=~ diff --git a/backend/data/colonias-rutas.json b/backend/data/colonias-rutas.json index f3dd957..3cc2be6 100644 --- a/backend/data/colonias-rutas.json +++ b/backend/data/colonias-rutas.json @@ -1,7 +1,7 @@ [ { "colonia": "Zona Centro", "routeId": "RUTA-01", "horarioEstimado": "Matutino (06:30 - 07:15)" }, { "colonia": "Las Arboledas", "routeId": "RUTA-01", "horarioEstimado": "Matutino (07:00 - 07:30)" }, - { "colonia": "Sector Norte", "routeId": "RUTA-02", "horarioEstimado": "Matutino (06:30 - 07:10)" }, + { "colonia": "Sector Norte - Av. Tecnológico", "routeId": "RUTA-02", "horarioEstimado": "Matutino (06:30 - 07:10)" }, { "colonia": "San Juanico", "routeId": "RUTA-03", "horarioEstimado": "Matutino (06:45 - 07:15)" }, { "colonia": "Los Olivos", "routeId": "RUTA-04", "horarioEstimado": "Matutino (07:00 - 07:40)" }, { "colonia": "Rancho Seco", "routeId": "RUTA-05", "horarioEstimado": "Vespertino (14:15 - 15:00)" }, diff --git a/backend/main.py b/backend/main.py index 60cd788..3bdada0 100644 --- a/backend/main.py +++ b/backend/main.py @@ -81,6 +81,20 @@ def crear_domicilio(data: schemas.DomicilioCreate, db: Session = Depends(get_db)): colonia_key = data.colonia.lower() colonia_info = simulator.COLONIAS.get(colonia_key) + if not colonia_info: + # Buscar por similitud parcial + for key, value in simulator.COLONIAS.items(): + if key in colonia_key or colonia_key in key: + colonia_info = value + break + if not colonia_info: + # Buscar por route_id si viene en el nombre + ruta, _ = simulator.encontrar_ruta_por_coordenadas(data.lat, data.lng) + if ruta: + colonia_info = next( + (v for v in simulator.COLONIAS.values() if v["routeId"] == ruta["routeId"]), + None + ) if not colonia_info: raise HTTPException(status_code=404, detail="Colonia no encontrada en el sistema") dom = models.Domicilio(direccion=data.direccion, colonia=data.colonia, diff --git a/frontend/App.js b/frontend/App.js index 706785f..7f06a05 100644 --- a/frontend/App.js +++ b/frontend/App.js @@ -7,8 +7,13 @@ import * as Location from 'expo-location'; const API_URL = 'http://10.137.112.65:8000'; const COLONIAS = [ - 'Zona Centro', 'Las Arboledas', 'Trojes', 'San Juanico', - 'Los Olivos', 'Rancho Seco', 'Las Insurgentes' + 'Zona Centro', 'Las Arboledas', 'Sector Norte - Av. Tecnológico', + 'San Juanico', 'Los Olivos', 'Rancho Seco', + 'Norte Extremo - Rumbos de Roque', 'Nororiente - Ciudad Industrial', + 'Suroriente - Universidad Latina', 'Poniente - Hospital General', + 'Eje Juan Pablo II - Sede UG Sur', 'Zona de Oro - Torres Landa', + 'Las Insurgentes', 'Trojes', + 'Sur Poniente - La Toscana', 'Norponiente - San José de Celaya' ]; export default function App() { @@ -34,6 +39,8 @@ export default function App() { }); const [alertaOperativa, setAlertaOperativa] = useState(null); const [localizando, setLocalizando] = useState(false); + const [latGPS, setLatGPS] = useState(20.5185); + const [lngGPS, setLngGPS] = useState(-100.8450); useEffect(() => { cargarSesion(); @@ -170,7 +177,7 @@ export default function App() { const res = await fetch(`${API_URL}/domicilios`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${token}` }, - body: JSON.stringify({ direccion, colonia: coloniaSeleccionada, lat: 20.5185, lng: -100.8450 }), + body: JSON.stringify({ direccion, colonia: coloniaSeleccionada, lat: latGPS, lng: lngGPS }), }); const data = await res.json(); if (data.id) { @@ -178,6 +185,7 @@ export default function App() { setDomicilioActivo(data); await cargarDomicilios(token); setDireccion(''); setColoniaSeleccionada(''); setCodigoPostal(''); + setLatGPS(20.5185); setLngGPS(-100.8450); setScreen('eta'); consultarETA(data.id, token); } else { Alert.alert('Error', data.detail || 'Colonia no encontrada'); } @@ -267,12 +275,25 @@ export default function App() { try { const { status } = await Location.requestForegroundPermissionsAsync(); if (status !== 'granted') { - Alert.alert('Permiso denegado', 'Necesitamos acceso a tu ubicación para encontrar tu zona de recolección'); + Alert.alert('Permiso denegado', 'Necesitamos acceso a tu ubicación'); setLocalizando(false); return; } - const location = await Location.getCurrentPositionAsync({ accuracy: Location.Accuracy.High }); + const location = await Location.getCurrentPositionAsync({ + accuracy: Location.Accuracy.Balanced, + }); const { latitude, longitude } = location.coords; + setLatGPS(latitude); + setLngGPS(longitude); + + const geocode = await Location.reverseGeocodeAsync({ latitude, longitude }); + if (geocode.length > 0) { + const lugar = geocode[0]; + const dirAuto = `${lugar.street || ''} ${lugar.streetNumber || ''}`.trim(); + const cpAuto = lugar.postalCode || ''; + if (dirAuto) setDireccion(dirAuto); + if (cpAuto) setCodigoPostal(cpAuto); + } const res = await fetch( `${API_URL}/domicilios/ruta-por-coordenadas?lat=${latitude}&lng=${longitude}`, @@ -283,10 +304,10 @@ export default function App() { setColoniaSeleccionada(data.colonia_sugerida); Alert.alert( '📍 Ubicación detectada', - `Se detectó tu zona: ${data.colonia_sugerida}\nRuta: ${data.nombre_ruta}\nDistancia: ${data.distancia_metros}m` + `Zona: ${data.colonia_sugerida}\nRuta: ${data.nombre_ruta}\nDistancia: ${data.distancia_metros}m` ); } else { - Alert.alert('Sin cobertura', 'Tu ubicación no está dentro de las zonas de servicio de Celaya'); + Alert.alert('Sin cobertura', 'Tu ubicación no está dentro de las zonas de Celaya'); } } catch { Alert.alert('Error', 'No se pudo obtener tu ubicación');