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()CP
Pm<
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');