fix: geolocalización GPS corregida con fallback por coordenadas

This commit is contained in:
2026-05-23 03:54:05 -06:00
parent 8296839ec7
commit e69fb36c49
4 changed files with 43 additions and 8 deletions

View File

@@ -1,7 +1,7 @@
[ [
{ "colonia": "Zona Centro", "routeId": "RUTA-01", "horarioEstimado": "Matutino (06:30 - 07:15)" }, { "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": "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": "San Juanico", "routeId": "RUTA-03", "horarioEstimado": "Matutino (06:45 - 07:15)" },
{ "colonia": "Los Olivos", "routeId": "RUTA-04", "horarioEstimado": "Matutino (07:00 - 07:40)" }, { "colonia": "Los Olivos", "routeId": "RUTA-04", "horarioEstimado": "Matutino (07:00 - 07:40)" },
{ "colonia": "Rancho Seco", "routeId": "RUTA-05", "horarioEstimado": "Vespertino (14:15 - 15:00)" }, { "colonia": "Rancho Seco", "routeId": "RUTA-05", "horarioEstimado": "Vespertino (14:15 - 15:00)" },

View File

@@ -81,6 +81,20 @@ def crear_domicilio(data: schemas.DomicilioCreate,
db: Session = Depends(get_db)): db: Session = Depends(get_db)):
colonia_key = data.colonia.lower() colonia_key = data.colonia.lower()
colonia_info = simulator.COLONIAS.get(colonia_key) 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: if not colonia_info:
raise HTTPException(status_code=404, detail="Colonia no encontrada en el sistema") raise HTTPException(status_code=404, detail="Colonia no encontrada en el sistema")
dom = models.Domicilio(direccion=data.direccion, colonia=data.colonia, dom = models.Domicilio(direccion=data.direccion, colonia=data.colonia,

View File

@@ -7,8 +7,13 @@ import * as Location from 'expo-location';
const API_URL = 'http://10.137.112.65:8000'; const API_URL = 'http://10.137.112.65:8000';
const COLONIAS = [ const COLONIAS = [
'Zona Centro', 'Las Arboledas', 'Trojes', 'San Juanico', 'Zona Centro', 'Las Arboledas', 'Sector Norte - Av. Tecnológico',
'Los Olivos', 'Rancho Seco', 'Las Insurgentes' '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() { export default function App() {
@@ -34,6 +39,8 @@ export default function App() {
}); });
const [alertaOperativa, setAlertaOperativa] = useState(null); const [alertaOperativa, setAlertaOperativa] = useState(null);
const [localizando, setLocalizando] = useState(false); const [localizando, setLocalizando] = useState(false);
const [latGPS, setLatGPS] = useState(20.5185);
const [lngGPS, setLngGPS] = useState(-100.8450);
useEffect(() => { useEffect(() => {
cargarSesion(); cargarSesion();
@@ -170,7 +177,7 @@ export default function App() {
const res = await fetch(`${API_URL}/domicilios`, { const res = await fetch(`${API_URL}/domicilios`, {
method: 'POST', method: 'POST',
headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${token}` }, 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(); const data = await res.json();
if (data.id) { if (data.id) {
@@ -178,6 +185,7 @@ export default function App() {
setDomicilioActivo(data); setDomicilioActivo(data);
await cargarDomicilios(token); await cargarDomicilios(token);
setDireccion(''); setColoniaSeleccionada(''); setCodigoPostal(''); setDireccion(''); setColoniaSeleccionada(''); setCodigoPostal('');
setLatGPS(20.5185); setLngGPS(-100.8450);
setScreen('eta'); setScreen('eta');
consultarETA(data.id, token); consultarETA(data.id, token);
} else { Alert.alert('Error', data.detail || 'Colonia no encontrada'); } } else { Alert.alert('Error', data.detail || 'Colonia no encontrada'); }
@@ -267,12 +275,25 @@ export default function App() {
try { try {
const { status } = await Location.requestForegroundPermissionsAsync(); const { status } = await Location.requestForegroundPermissionsAsync();
if (status !== 'granted') { 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); setLocalizando(false);
return; return;
} }
const location = await Location.getCurrentPositionAsync({ accuracy: Location.Accuracy.High }); const location = await Location.getCurrentPositionAsync({
accuracy: Location.Accuracy.Balanced,
});
const { latitude, longitude } = location.coords; 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( const res = await fetch(
`${API_URL}/domicilios/ruta-por-coordenadas?lat=${latitude}&lng=${longitude}`, `${API_URL}/domicilios/ruta-por-coordenadas?lat=${latitude}&lng=${longitude}`,
@@ -283,10 +304,10 @@ export default function App() {
setColoniaSeleccionada(data.colonia_sugerida); setColoniaSeleccionada(data.colonia_sugerida);
Alert.alert( Alert.alert(
'📍 Ubicación detectada', '📍 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 { } 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 { } catch {
Alert.alert('Error', 'No se pudo obtener tu ubicación'); Alert.alert('Error', 'No se pudo obtener tu ubicación');