Spaces:
Sleeping
Sleeping
AUTO-FRANCE-PARTS
commited on
Commit
·
b411033
1
Parent(s):
a7e3f58
feat : Add Get parcel tool
Browse files- .gitignore +1 -0
- __pycache__/app.cpython-312.pyc +0 -0
- api_sources/__init__.py +1 -0
- api_sources/base.py +28 -0
- api_sources/config.py +13 -0
- api_sources/example_new_source.py +51 -0
- api_sources/lexicon.py +53 -0
- app.py +37 -2
- requirements.txt +2 -0
.gitignore
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
*/__pycache__/*
|
__pycache__/app.cpython-312.pyc
ADDED
Binary file (1.96 kB). View file
|
|
api_sources/__init__.py
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
|
api_sources/base.py
ADDED
@@ -0,0 +1,28 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from abc import ABC, abstractmethod
|
2 |
+
from typing import Dict, Any, Optional
|
3 |
+
|
4 |
+
|
5 |
+
class BaseAPISource(ABC):
|
6 |
+
"""Classe de base abstraite pour toutes les sources d'API externes."""
|
7 |
+
|
8 |
+
def __init__(self, base_url: str, timeout: int = 30):
|
9 |
+
self.base_url = base_url.rstrip('/')
|
10 |
+
self.timeout = timeout
|
11 |
+
|
12 |
+
@abstractmethod
|
13 |
+
async def get_parcel_from_lat_lon(self, latitude: float, longitude: float) -> Dict[str, Any]:
|
14 |
+
"""
|
15 |
+
Récupère les informations de parcelle à partir des coordonnées GPS.
|
16 |
+
|
17 |
+
Args:
|
18 |
+
latitude: Latitude en degrés décimaux
|
19 |
+
longitude: Longitude en degrés décimaux
|
20 |
+
|
21 |
+
Returns:
|
22 |
+
Dict contenant les données de la parcelle
|
23 |
+
"""
|
24 |
+
pass
|
25 |
+
|
26 |
+
def _build_url(self, endpoint: str) -> str:
|
27 |
+
"""Construit l'URL complète à partir du base_url et de l'endpoint."""
|
28 |
+
return f"{self.base_url}/{endpoint.lstrip('/')}"
|
api_sources/config.py
ADDED
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""Configuration des API externes."""
|
2 |
+
|
3 |
+
API_CONFIGS = {
|
4 |
+
"lexicon": {
|
5 |
+
"base_url": "https://lexicon.osfarm.org",
|
6 |
+
"timeout": 30
|
7 |
+
},
|
8 |
+
# Exemple pour futures API sources
|
9 |
+
# "autre_api": {
|
10 |
+
# "base_url": "https://exemple.com",
|
11 |
+
# "timeout": 45
|
12 |
+
# }
|
13 |
+
}
|
api_sources/example_new_source.py
ADDED
@@ -0,0 +1,51 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""
|
2 |
+
EXEMPLE : Comment ajouter une nouvelle source d'API
|
3 |
+
|
4 |
+
Pour ajouter une nouvelle source d'API, suivez ces étapes :
|
5 |
+
|
6 |
+
1. Créez une nouvelle classe qui hérite de BaseAPISource
|
7 |
+
2. Implémentez la méthode get_parcel_from_lat_lon
|
8 |
+
3. Ajoutez d'autres méthodes spécifiques si nécessaire
|
9 |
+
4. Intégrez la nouvelle source dans app.py
|
10 |
+
|
11 |
+
Exemple d'implémentation :
|
12 |
+
"""
|
13 |
+
|
14 |
+
import httpx
|
15 |
+
from typing import Dict, Any
|
16 |
+
from .base import BaseAPISource
|
17 |
+
from .config import API_CONFIGS
|
18 |
+
|
19 |
+
|
20 |
+
class ExempleAPI(BaseAPISource):
|
21 |
+
"""Exemple d'implémentation d'une nouvelle source d'API."""
|
22 |
+
|
23 |
+
def __init__(self):
|
24 |
+
config = API_CONFIGS.get("exemple_api", {
|
25 |
+
"base_url": "https://exemple.com",
|
26 |
+
"timeout": 30
|
27 |
+
})
|
28 |
+
super().__init__(
|
29 |
+
base_url=config["base_url"],
|
30 |
+
timeout=config["timeout"]
|
31 |
+
)
|
32 |
+
|
33 |
+
async def get_parcel_from_lat_lon(self, latitude: float, longitude: float) -> Dict[str, Any]:
|
34 |
+
"""Implémentation pour l'API exemple."""
|
35 |
+
url = self._build_url("/api/parcelle")
|
36 |
+
|
37 |
+
params = {
|
38 |
+
"lat": latitude,
|
39 |
+
"lon": longitude
|
40 |
+
}
|
41 |
+
|
42 |
+
async with httpx.AsyncClient(timeout=self.timeout) as client:
|
43 |
+
response = await client.get(url, params=params)
|
44 |
+
response.raise_for_status()
|
45 |
+
return response.json()
|
46 |
+
|
47 |
+
async def autre_methode_specifique(self, param: str) -> Dict[str, Any]:
|
48 |
+
"""Exemple d'une méthode spécifique à cette API."""
|
49 |
+
url = self._build_url("/api/autre-endpoint")
|
50 |
+
# ... implémentation
|
51 |
+
pass
|
api_sources/lexicon.py
ADDED
@@ -0,0 +1,53 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import httpx
|
2 |
+
from typing import Dict, Any
|
3 |
+
from .base import BaseAPISource
|
4 |
+
from .config import API_CONFIGS
|
5 |
+
|
6 |
+
|
7 |
+
class LexiconAPI(BaseAPISource):
|
8 |
+
"""Implémentation de l'API Lexicon pour récupérer les données de parcelles."""
|
9 |
+
|
10 |
+
def __init__(self):
|
11 |
+
config = API_CONFIGS["lexicon"]
|
12 |
+
super().__init__(
|
13 |
+
base_url=config["base_url"],
|
14 |
+
timeout=config["timeout"]
|
15 |
+
)
|
16 |
+
|
17 |
+
async def get_parcel_from_lat_lon(self, latitude: float, longitude: float) -> Dict[str, Any]:
|
18 |
+
"""
|
19 |
+
Récupère les informations de parcelle depuis l'API Lexicon.
|
20 |
+
|
21 |
+
Args:
|
22 |
+
latitude: Latitude en degrés décimaux
|
23 |
+
longitude: Longitude en degrés décimaux
|
24 |
+
|
25 |
+
Returns:
|
26 |
+
Dict contenant les données de la parcelle depuis Lexicon
|
27 |
+
|
28 |
+
Raises:
|
29 |
+
httpx.HTTPStatusError: Si la requête échoue
|
30 |
+
httpx.RequestError: Si une erreur de connexion survient
|
31 |
+
"""
|
32 |
+
url = self._build_url("/tools/parcel-identifier.json")
|
33 |
+
|
34 |
+
params = {
|
35 |
+
"latitude": latitude,
|
36 |
+
"longitude": longitude
|
37 |
+
}
|
38 |
+
|
39 |
+
async with httpx.AsyncClient(timeout=self.timeout) as client:
|
40 |
+
try:
|
41 |
+
response = await client.get(url, params=params)
|
42 |
+
response.raise_for_status()
|
43 |
+
return response.json()
|
44 |
+
except httpx.HTTPStatusError as e:
|
45 |
+
raise Exception(f"Erreur HTTP {e.response.status_code}: {e.response.text}")
|
46 |
+
except httpx.RequestError as e:
|
47 |
+
raise Exception(f"Erreur de connexion à l'API Lexicon: {str(e)}")
|
48 |
+
|
49 |
+
# Exemple : Vous pouvez ajouter d'autres méthodes spécifiques à Lexicon ici
|
50 |
+
# async def autre_methode_lexicon(self, param: str) -> Dict[str, Any]:
|
51 |
+
# """Autre méthode spécifique à l'API Lexicon."""
|
52 |
+
# url = self._build_url("/autre-endpoint")
|
53 |
+
# # ... implémentation
|
app.py
CHANGED
@@ -1,7 +1,42 @@
|
|
1 |
-
from fastapi import FastAPI
|
|
|
|
|
2 |
|
3 |
-
app = FastAPI(
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4 |
|
5 |
@app.get("/")
|
6 |
def greet_json():
|
7 |
return {"Hello": "World!"}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from fastapi import FastAPI, HTTPException, Query
|
2 |
+
from typing import Dict, Any
|
3 |
+
from api_sources.lexicon import LexiconAPI
|
4 |
|
5 |
+
app = FastAPI(
|
6 |
+
title="Data API",
|
7 |
+
description="API pour récupérer des données de parcelles depuis différentes sources",
|
8 |
+
version="1.0.0"
|
9 |
+
)
|
10 |
+
|
11 |
+
# Instance de l'API Lexicon
|
12 |
+
lexicon_api = LexiconAPI()
|
13 |
|
14 |
@app.get("/")
|
15 |
def greet_json():
|
16 |
return {"Hello": "World!"}
|
17 |
+
|
18 |
+
@app.get("/tools/parcel-identifier")
|
19 |
+
async def get_parcel_identifier(
|
20 |
+
latitude: float = Query(..., description="Latitude en degrés décimaux"),
|
21 |
+
longitude: float = Query(..., description="Longitude en degrés décimaux")
|
22 |
+
) -> Dict[str, Any]:
|
23 |
+
"""
|
24 |
+
Récupère les informations d'identification de parcelle à partir des coordonnées GPS.
|
25 |
+
|
26 |
+
Args:
|
27 |
+
latitude: Latitude en degrés décimaux
|
28 |
+
longitude: Longitude en degrés décimaux
|
29 |
+
|
30 |
+
Returns:
|
31 |
+
Dict contenant les données de la parcelle
|
32 |
+
"""
|
33 |
+
try:
|
34 |
+
# Appel de l'API Lexicon pour récupérer les données
|
35 |
+
parcel_data = await lexicon_api.get_parcel_from_lat_lon(latitude, longitude)
|
36 |
+
return parcel_data
|
37 |
+
|
38 |
+
except Exception as e:
|
39 |
+
raise HTTPException(
|
40 |
+
status_code=500,
|
41 |
+
detail=f"Erreur lors de la récupération des données de parcelle: {str(e)}"
|
42 |
+
)
|
requirements.txt
CHANGED
@@ -1,2 +1,4 @@
|
|
1 |
fastapi
|
2 |
uvicorn[standard]
|
|
|
|
|
|
1 |
fastapi
|
2 |
uvicorn[standard]
|
3 |
+
requests
|
4 |
+
httpx
|