from fastapi import FastAPI, HTTPException, Query from typing import Dict, Any, List from api_sources.lexicon import LexiconAPI from domain.repositories.parcel_repository import ParcelRepository from domain.use_cases.get_nearby_parcels_by_sampling import GetNearbyParcelsBySamplingUseCase app = FastAPI( title="Data API", description="API pour récupérer des données de parcelles depuis différentes sources", version="1.0.0" ) # Instance de l'API Lexicon lexicon_api = LexiconAPI() # Repository et use cases parcel_repository = ParcelRepository(lexicon_api) @app.get("/") def greet_json(): return {"Hello": "World!"} @app.get("/tools/parcel-identifier") async def get_parcel_identifier( latitude: float = Query(..., description="Latitude en degrés décimaux"), longitude: float = Query(..., description="Longitude en degrés décimaux") ) -> Dict[str, Any]: """ Récupère les informations d'identification de parcelle à partir des coordonnées GPS. Args: latitude: Latitude en degrés décimaux longitude: Longitude en degrés décimaux Returns: Dict contenant les données de la parcelle """ try: # Appel de l'API Lexicon pour récupérer les données parcel_data = await lexicon_api.get_parcel_from_lat_lon(latitude, longitude) return parcel_data except Exception as e: raise HTTPException( status_code=500, detail=f"Erreur lors de la récupération des données de parcelle: {str(e)}" ) @app.get("/tools/get_nearby_parcel") async def get_nearby_parcels( latitude: float = Query(..., description="Latitude du point central en degrés décimaux"), longitude: float = Query(..., description="Longitude du point central en degrés décimaux"), radius_m: float = Query(200, description="Rayon de recherche en mètres", gt=0), step_m: float = Query(100, description="Pas d'échantillonnage en mètres (densité des points)", gt=0) ) -> Dict : """ Récupère les parcelles à proximité d'un point donné par échantillonnage. Args: latitude: Latitude du point central en degrés décimaux longitude: Longitude du point central en degrés décimaux radius_m: Rayon de recherche en mètres step_m: Pas d'échantillonnage en mètres (plus petit = plus dense) Returns: Liste des parcelles trouvées dans la zone """ try: # Création du use case avec les paramètres get_nearby_parcels_use_case = GetNearbyParcelsBySamplingUseCase( parcel_repository=parcel_repository, buffer_radius_m=radius_m, step_m=step_m ) # Exécution du use case nearby_parcels = await get_nearby_parcels_use_case(latitude, longitude) return { "parcels": nearby_parcels["parcels"], "number_of_points": nearby_parcels["number_of_points"] } except Exception as e: raise HTTPException( status_code=500, detail=f"Erreur lors de la récupération des parcelles à proximité: {str(e)}" )