Rechercher des adresses
Le géocodage permet de convertir une adresse textuelle en coordonnées GPS. Ce guide vous explique comment utiliser l'endpoint de recherche d'adresses.
Vue d'ensemble
L'endpoint /geocoder/search utilise un algorithme de recherche par similarité pour trouver les adresses correspondant le mieux à votre requête, même si elle est approximative.
Fonctionnalités principales
- ✅ Recherche textuelle flexible
- ✅ Algorithme de similarité fuzzy
- ✅ Recherche sur toute la France
- ✅ Support des adresses partielles
- ✅ Retour des coordonnées GPS
- ✅ Références cadastrales associées
Recherche basique
Adresse complète
- cURL
- JavaScript
- PHP
- Python
curl -X GET \
"https://app.infoparcelle.fr/api/v1/geocoder/search?recherche=7+Rue+de+l%27Elysée+75008+Paris" \
-H "Authorization: Bearer VOTRE_CLE_API"
const apiKey = process.env.INFOPARCELLE_API_KEY;
const response = await fetch(
'https://app.infoparcelle.fr/api/v1/geocoder/search?' +
new URLSearchParams({
recherche: '7 Rue de l\'Elysée 75008 Paris',
}),
{
headers: {
'Authorization': `Bearer ${apiKey}`,
},
}
);
const adresses = await response.json();
console.log(adresses);
<?php
$apiKey = getenv('INFOPARCELLE_API_KEY');
$params = http_build_query([
'recherche' => '7 Rue de l\'Elysée 75008 Paris'
]);
$ch = curl_init("https://app.infoparcelle.fr/api/v1/geocoder/search?$params");
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Authorization: Bearer $apiKey"]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
$adresses = json_decode($response, true);
print_r($adresses);
import os
import requests
api_key = os.getenv('INFOPARCELLE_API_KEY')
response = requests.get(
'https://app.infoparcelle.fr/api/v1/geocoder/search',
params={'recherche': '7 Rue de l\'Elysée 75008 Paris'},
headers={'Authorization': f'Bearer {api_key}'}
)
adresses = response.json()
print(adresses)
Adresse partielle
L'API accepte des adresses incomplètes :
- cURL
- JavaScript
- PHP
- Python
# Sans code postal
curl "https://app.infoparcelle.fr/api/v1/geocoder/search?recherche=Rue+de+l%27Elysée+Paris" \
-H "Authorization: Bearer VOTRE_CLE_API"
# Seulement le nom et la ville
curl "https://app.infoparcelle.fr/api/v1/geocoder/search?recherche=Tour+Eiffel+Paris" \
-H "Authorization: Bearer VOTRE_CLE_API"
# Lieu-dit ou monument
curl "https://app.infoparcelle.fr/api/v1/geocoder/search?recherche=Château+de+Versailles" \
-H "Authorization: Bearer VOTRE_CLE_API"
const apiKey = process.env.INFOPARCELLE_API_KEY;
// Sans code postal
const response1 = await fetch(
'https://app.infoparcelle.fr/api/v1/geocoder/search?recherche=Rue+de+l%27Elysée+Paris',
{ headers: { 'Authorization': `Bearer ${apiKey}` } }
);
// Seulement le nom et la ville
const response2 = await fetch(
'https://app.infoparcelle.fr/api/v1/geocoder/search?recherche=Tour+Eiffel+Paris',
{ headers: { 'Authorization': `Bearer ${apiKey}` } }
);
// Lieu-dit ou monument
const response3 = await fetch(
'https://app.infoparcelle.fr/api/v1/geocoder/search?recherche=Château+de+Versailles',
{ headers: { 'Authorization': `Bearer ${apiKey}` } }
);
<?php
$apiKey = getenv('INFOPARCELLE_API_KEY');
// Sans code postal
$ch = curl_init('https://app.infoparcelle.fr/api/v1/geocoder/search?recherche=Rue+de+l%27Elysée+Paris');
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Authorization: Bearer $apiKey"]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response1 = curl_exec($ch);
curl_close($ch);
// Seulement le nom et la ville
$ch = curl_init('https://app.infoparcelle.fr/api/v1/geocoder/search?recherche=Tour+Eiffel+Paris');
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Authorization: Bearer $apiKey"]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response2 = curl_exec($ch);
curl_close($ch);
import os
import requests
api_key = os.getenv('INFOPARCELLE_API_KEY')
headers = {'Authorization': f'Bearer {api_key}'}
# Sans code postal
response1 = requests.get(
'https://app.infoparcelle.fr/api/v1/geocoder/search',
params={'recherche': 'Rue de l\'Elysée Paris'},
headers=headers
)
# Seulement le nom et la ville
response2 = requests.get(
'https://app.infoparcelle.fr/api/v1/geocoder/search',
params={'recherche': 'Tour Eiffel Paris'},
headers=headers
)
# Lieu-dit ou monument
response3 = requests.get(
'https://app.infoparcelle.fr/api/v1/geocoder/search',
params={'recherche': 'Château de Versailles'},
headers=headers
)
Score de similarité
Chaque résultat inclut un score de similarité entre 0 et 1 :
1.0: Correspondance exacte0.8 - 0.99: Très bonne correspondance0.6 - 0.79: Bonne correspondance< 0.6: Correspondance faible
{
"adresse_complete": "7 Rue de l'Elysée 75008 Paris",
"similarite": 0.95
}
Filtrer par score
- cURL
- JavaScript
- PHP
- Python
curl "https://app.infoparcelle.fr/api/v1/geocoder/search?recherche=Elysée+Paris" \
-H "Authorization: Bearer VOTRE_CLE_API"
# Filtrer ensuite avec jq (outil ligne de commande pour JSON)
curl "https://app.infoparcelle.fr/api/v1/geocoder/search?recherche=Elysée+Paris" \
-H "Authorization: Bearer VOTRE_CLE_API" | jq '.[] | select(.similarite > 0.8)'
const apiKey = process.env.INFOPARCELLE_API_KEY;
const response = await fetch(
'https://app.infoparcelle.fr/api/v1/geocoder/search?recherche=Elysée+Paris',
{
headers: { 'Authorization': `Bearer ${apiKey}` }
}
);
const adresses = await response.json();
// Garder uniquement les résultats avec score > 0.8
const adressesFiltrées = adresses.filter(a => a.similarite > 0.8);
<?php
$apiKey = getenv('INFOPARCELLE_API_KEY');
$ch = curl_init('https://app.infoparcelle.fr/api/v1/geocoder/search?recherche=Elysée+Paris');
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Authorization: Bearer $apiKey"]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
$adresses = json_decode($response, true);
// Garder uniquement les résultats avec score > 0.8
$adressesFiltrees = array_filter($adresses, function($a) {
return $a['similarite'] > 0.8;
});
import os
import requests
api_key = os.getenv('INFOPARCELLE_API_KEY')
response = requests.get(
'https://app.infoparcelle.fr/api/v1/geocoder/search',
params={'recherche': 'Elysée Paris'},
headers={'Authorization': f'Bearer {api_key}'}
)
adresses = response.json()
# Garder uniquement les résultats avec score > 0.8
adresses_filtrees = [a for a in adresses if a['similarite'] > 0.8]
Limiter le nombre de résultats
Par défaut, l'API retourne 10 résultats. Vous pouvez ajuster ce nombre :
- cURL
- JavaScript
- PHP
- Python
# Un seul résultat (le meilleur)
curl "https://app.infoparcelle.fr/api/v1/geocoder/search?recherche=1+Rue+de+Rivoli&limite=1" \
-H "Authorization: Bearer VOTRE_CLE_API"
# 20 résultats
curl "https://app.infoparcelle.fr/api/v1/geocoder/search?recherche=1+Rue+de+Rivoli&limite=20" \
-H "Authorization: Bearer VOTRE_CLE_API"
# Maximum : 50 résultats
curl "https://app.infoparcelle.fr/api/v1/geocoder/search?recherche=1+Rue+de+Rivoli&limite=50" \
-H "Authorization: Bearer VOTRE_CLE_API"
const apiKey = process.env.INFOPARCELLE_API_KEY;
// Un seul résultat (le meilleur)
const response1 = await fetch(
'https://app.infoparcelle.fr/api/v1/geocoder/search?recherche=1+Rue+de+Rivoli&limite=1',
{ headers: { 'Authorization': `Bearer ${apiKey}` } }
);
// 20 résultats
const response2 = await fetch(
'https://app.infoparcelle.fr/api/v1/geocoder/search?recherche=1+Rue+de+Rivoli&limite=20',
{ headers: { 'Authorization': `Bearer ${apiKey}` } }
);
// Maximum : 50 résultats
const response3 = await fetch(
'https://app.infoparcelle.fr/api/v1/geocoder/search?recherche=1+Rue+de+Rivoli&limite=50',
{ headers: { 'Authorization': `Bearer ${apiKey}` } }
);
<?php
$apiKey = getenv('INFOPARCELLE_API_KEY');
// Un seul résultat (le meilleur)
$ch = curl_init('https://app.infoparcelle.fr/api/v1/geocoder/search?recherche=1+Rue+de+Rivoli&limite=1');
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Authorization: Bearer $apiKey"]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response1 = curl_exec($ch);
curl_close($ch);
// 20 résultats
$ch = curl_init('https://app.infoparcelle.fr/api/v1/geocoder/search?recherche=1+Rue+de+Rivoli&limite=20');
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Authorization: Bearer $apiKey"]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response2 = curl_exec($ch);
curl_close($ch);
import os
import requests
api_key = os.getenv('INFOPARCELLE_API_KEY')
# Un seul résultat (le meilleur)
response1 = requests.get(
'https://app.infoparcelle.fr/api/v1/geocoder/search',
params={'recherche': '1 Rue de Rivoli', 'limite': 1},
headers={'Authorization': f'Bearer {api_key}'}
)
# 20 résultats
response2 = requests.get(
'https://app.infoparcelle.fr/api/v1/geocoder/search',
params={'recherche': '1 Rue de Rivoli', 'limite': 20},
headers={'Authorization': f'Bearer {api_key}'}
)
# Maximum : 50 résultats
response3 = requests.get(
'https://app.infoparcelle.fr/api/v1/geocoder/search',
params={'recherche': '1 Rue de Rivoli', 'limite': 50},
headers={'Authorization': f'Bearer {api_key}'}
)
Sélectionner les champs
Optimisez la réponse en ne demandant que les champs nécessaires :
- cURL
- JavaScript
- PHP
- Python
curl "https://app.infoparcelle.fr/api/v1/geocoder/search?recherche=1+Rue+de+Rivoli&champs=identifiant_ban,adresse_complete,centre" \
-H "Authorization: Bearer VOTRE_CLE_API"
const apiKey = process.env.INFOPARCELLE_API_KEY;
const response = await fetch(
'https://app.infoparcelle.fr/api/v1/geocoder/search?' +
new URLSearchParams({
recherche: '1 Rue de Rivoli',
champs: 'identifiant_ban,adresse_complete,centre'
}),
{ headers: { 'Authorization': `Bearer ${apiKey}` } }
);
const adresses = await response.json();
<?php
$apiKey = getenv('INFOPARCELLE_API_KEY');
$params = http_build_query([
'recherche' => '1 Rue de Rivoli',
'champs' => 'identifiant_ban,adresse_complete,centre'
]);
$ch = curl_init("https://app.infoparcelle.fr/api/v1/geocoder/search?$params");
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Authorization: Bearer $apiKey"]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
$adresses = json_decode($response, true);
import os
import requests
api_key = os.getenv('INFOPARCELLE_API_KEY')
response = requests.get(
'https://app.infoparcelle.fr/api/v1/geocoder/search',
params={
'recherche': '1 Rue de Rivoli',
'champs': 'identifiant_ban,adresse_complete,centre'
},
headers={'Authorization': f'Bearer {api_key}'}
)
adresses = response.json()
Champs disponibles
| Champ | Type | Description |
|---|---|---|
identifiant_ban | string | Identifiant unique BAN |
adresse_complete | string | Adresse formatée |
numero | string | Numéro de voie |
nom_voie | string | Nom de la voie |
municipalite | string | Commune |
parcelles | array | Références cadastrales |
centre | object | Coordonnées GPS (Point GeoJSON) |
similarite | number | Score de correspondance (0-1) |
Format GeoJSON
Pour une intégration directe dans une carte :
- cURL
- JavaScript
- PHP
- Python
curl "https://app.infoparcelle.fr/api/v1/geocoder/search?recherche=1+Rue+de+Rivoli&format=geojson" \
-H "Authorization: Bearer VOTRE_CLE_API"
const apiKey = process.env.INFOPARCELLE_API_KEY;
const response = await fetch(
'https://app.infoparcelle.fr/api/v1/geocoder/search?recherche=1+Rue+de+Rivoli&format=geojson',
{ headers: { 'Authorization': `Bearer ${apiKey}` } }
);
const geojson = await response.json();
console.log(geojson);
<?php
$apiKey = getenv('INFOPARCELLE_API_KEY');
$ch = curl_init('https://app.infoparcelle.fr/api/v1/geocoder/search?recherche=1+Rue+de+Rivoli&format=geojson');
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Authorization: Bearer $apiKey"]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
$geojson = json_decode($response, true);
import os
import requests
api_key = os.getenv('INFOPARCELLE_API_KEY')
response = requests.get(
'https://app.infoparcelle.fr/api/v1/geocoder/search',
params={'recherche': '1 Rue de Rivoli', 'format': 'geojson'},
headers={'Authorization': f'Bearer {api_key}'}
)
geojson = response.json()
Résultat attendu :
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [2.3364, 48.8606]
},
"properties": {
"identifiant_ban": "75056_7560_00001",
"adresse_complete": "1 Rue de Rivoli 75001 Paris"
}
}
]
}
Cas d'usage avancés
1. Autocomplétion d'adresses
- JavaScript
- PHP
- Python
import { useState, useEffect } from 'react';
function AddressAutocomplete() {
const apiKey = process.env.INFOPARCELLE_API_KEY;
const [query, setQuery] = useState('');
const [suggestions, setSuggestions] = useState([]);
useEffect(() => {
if (query.length < 3) {
setSuggestions([]);
return;
}
const timeoutId = setTimeout(async () => {
const response = await fetch(
`https://app.infoparcelle.fr/api/v1/geocoder/search?` +
new URLSearchParams({
recherche: query,
limite: '10',
champs: 'identifiant_ban,adresse_complete,centre',
}),
{
headers: { 'Authorization': `Bearer ${apiKey}` }
}
);
const results = await response.json();
setSuggestions(results);
}, 300); // Debounce de 300ms
return () => clearTimeout(timeoutId);
}, [query]);
return (
<div>
<input
type="text"
value={query}
onChange={(e) => setQuery(e.target.value)}
placeholder="Rechercher une adresse..."
/>
{suggestions.length > 0 && (
<ul>
{suggestions.map((adresse) => (
<li key={adresse.identifiant_ban}>
{adresse.adresse_complete}
<span>Score: {Math.round(adresse.similarite * 100)}%</span>
</li>
))}
</ul>
)}
</div>
);
}
<?php
// Fonction pour rechercher des adresses avec debounce côté serveur
function autocomplete_adresse($query, $api_key) {
if (strlen($query) < 3) {
return [];
}
$params = http_build_query([
'recherche' => $query,
'limite' => 10,
'champs' => 'identifiant_ban,adresse_complete,centre'
]);
$ch = curl_init("https://app.infoparcelle.fr/api/v1/geocoder/search?$params");
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Authorization: Bearer $api_key"]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
return json_decode($response, true);
}
// Utilisation dans une API AJAX
$api_key = getenv('INFOPARCELLE_API_KEY');
$query = $_GET['q'] ?? '';
$suggestions = autocomplete_adresse($query, $api_key);
header('Content-Type: application/json');
echo json_encode($suggestions);
?>
import os
import requests
import time
class AddressAutocomplete:
"""
Classe pour gérer l'autocomplétion d'adresses avec debounce
"""
def __init__(self):
self.api_key = os.getenv('INFOPARCELLE_API_KEY')
self.last_query = ''
self.last_query_time = 0
self.debounce_delay = 0.3 # 300ms
def rechercher(self, query):
"""
Recherche des adresses avec debounce
"""
if len(query) < 3:
return []
# Debounce simple
current_time = time.time()
if current_time - self.last_query_time < self.debounce_delay:
time.sleep(self.debounce_delay)
self.last_query = query
self.last_query_time = time.time()
response = requests.get(
'https://app.infoparcelle.fr/api/v1/geocoder/search',
params={
'recherche': query,
'limite': 10,
'champs': 'identifiant_ban,adresse_complete,centre'
},
headers={'Authorization': f'Bearer {self.api_key}'}
)
return response.json()
def afficher_suggestions(self, suggestions):
"""
Affiche les suggestions avec score
"""
for adresse in suggestions:
score = round(adresse['similarite'] * 100)
print(f"{adresse['adresse_complete']} - Score: {score}%")
# Utilisation
autocomplete = AddressAutocomplete()
suggestions = autocomplete.rechercher("Champs Elysées Paris")
autocomplete.afficher_suggestions(suggestions)
2. Validation d'adresse
- JavaScript
- PHP
- Python
async function validerAdresse(adresseSaisie) {
/**
* Valide une adresse saisie par l'utilisateur
* Retourne l'adresse normalisée ou null si invalide
*/
const apiKey = process.env.INFOPARCELLE_API_KEY;
const response = await fetch(
'https://app.infoparcelle.fr/api/v1/geocoder/search?' +
new URLSearchParams({
recherche: adresseSaisie,
limite: '1',
}),
{
headers: { 'Authorization': `Bearer ${apiKey}` }
}
);
const adresses = await response.json();
if (!adresses || adresses.length === 0) {
return null;
}
const adresse = adresses[0];
// Vérifier le score de similarité
if (adresse.similarite < 0.8) {
console.warn(`⚠️ Attention: correspondance faible (${Math.round(adresse.similarite * 100)}%)`);
return null;
}
return {
adresse_complete: adresse.adresse_complete,
latitude: adresse.centre.coordinates[1],
longitude: adresse.centre.coordinates[0],
};
}
// Utilisation
const adresseValidee = await validerAdresse("7 Rue de l'Elysée Paris");
if (adresseValidee) {
console.log(`✅ Adresse validée: ${adresseValidee.adresse_complete}`);
} else {
console.log("❌ Adresse invalide");
}
<?php
function valider_adresse($adresse_saisie, $api_key) {
/**
* Valide une adresse saisie par l'utilisateur
* Retourne l'adresse normalisée ou null si invalide
*/
$params = http_build_query([
'recherche' => $adresse_saisie,
'limite' => 1
]);
$ch = curl_init("https://app.infoparcelle.fr/api/v1/geocoder/search?$params");
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Authorization: Bearer $api_key"]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
$adresses = json_decode($response, true);
if (empty($adresses)) {
return null;
}
$adresse = $adresses[0];
// Vérifier le score de similarité
if ($adresse['similarite'] < 0.8) {
$score = round($adresse['similarite'] * 100);
echo "⚠️ Attention: correspondance faible ($score%)\n";
return null;
}
return [
'adresse_complete' => $adresse['adresse_complete'],
'latitude' => $adresse['centre']['coordinates'][1],
'longitude' => $adresse['centre']['coordinates'][0]
];
}
// Utilisation
$api_key = getenv('INFOPARCELLE_API_KEY');
$adresse_validee = valider_adresse("7 Rue de l'Elysée Paris", $api_key);
if ($adresse_validee) {
echo "✅ Adresse validée: {$adresse_validee['adresse_complete']}\n";
} else {
echo "❌ Adresse invalide\n";
}
?>
import os
import requests
def valider_adresse(adresse_saisie):
"""
Valide une adresse saisie par l'utilisateur
Retourne l'adresse normalisée ou None si invalide
"""
api_key = os.getenv('INFOPARCELLE_API_KEY')
response = requests.get(
'https://app.infoparcelle.fr/api/v1/geocoder/search',
params={
'recherche': adresse_saisie,
'limite': 1,
},
headers={'Authorization': f'Bearer {api_key}'}
)
adresses = response.json()
if not adresses:
return None
adresse = adresses[0]
# Vérifier le score de similarité
if adresse['similarite'] < 0.8:
print(f"⚠️ Attention: correspondance faible ({adresse['similarite']:.0%})")
return None
return {
'adresse_complete': adresse['adresse_complete'],
'latitude': adresse['centre']['coordinates'][1],
'longitude': adresse['centre']['coordinates'][0],
}
# Utilisation
adresse_validee = valider_adresse("7 Rue de l'Elysée Paris")
if adresse_validee:
print(f"✅ Adresse validée: {adresse_validee['adresse_complete']}")
else:
print("❌ Adresse invalide")
3. Recherche de proximité avec autocomplétion
- JavaScript
- PHP
- Python
async function rechercherAvecProximite(query, userLat, userLon) {
const apiKey = process.env.INFOPARCELLE_API_KEY;
// 1. Rechercher les adresses
const response = await fetch(
`https://app.infoparcelle.fr/api/v1/geocoder/search?recherche=${encodeURIComponent(query)}&limite=20`,
{
headers: { 'Authorization': `Bearer ${apiKey}` }
}
);
const adresses = await response.json();
// 2. Calculer la distance pour chaque adresse
const adressesAvecDistance = adresses.map(adresse => {
const coords = adresse.centre.coordinates;
const distance = calculerDistance(
userLat, userLon,
coords[1], coords[0]
);
return { ...adresse, distance };
});
// 3. Trier par distance
adressesAvecDistance.sort((a, b) => a.distance - b.distance);
return adressesAvecDistance;
}
function calculerDistance(lat1, lon1, lat2, lon2) {
// Formule de Haversine
const R = 6371; // Rayon de la Terre en km
const dLat = (lat2 - lat1) * Math.PI / 180;
const dLon = (lon2 - lon1) * Math.PI / 180;
const a =
Math.sin(dLat / 2) * Math.sin(dLat / 2) +
Math.cos(lat1 * Math.PI / 180) * Math.cos(lat2 * Math.PI / 180) *
Math.sin(dLon / 2) * Math.sin(dLon / 2);
const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
return R * c;
}
<?php
function rechercher_avec_proximite($query, $user_lat, $user_lon, $api_key) {
// 1. Rechercher les adresses
$params = http_build_query([
'recherche' => $query,
'limite' => 20
]);
$ch = curl_init("https://app.infoparcelle.fr/api/v1/geocoder/search?$params");
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Authorization: Bearer $api_key"]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
$adresses = json_decode($response, true);
// 2. Calculer la distance pour chaque adresse
$adresses_avec_distance = array_map(function($adresse) use ($user_lat, $user_lon) {
$coords = $adresse['centre']['coordinates'];
$distance = calculer_distance(
$user_lat, $user_lon,
$coords[1], $coords[0]
);
$adresse['distance'] = $distance;
return $adresse;
}, $adresses);
// 3. Trier par distance
usort($adresses_avec_distance, function($a, $b) {
return $a['distance'] <=> $b['distance'];
});
return $adresses_avec_distance;
}
function calculer_distance($lat1, $lon1, $lat2, $lon2) {
// Formule de Haversine
$R = 6371; // Rayon de la Terre en km
$dLat = deg2rad($lat2 - $lat1);
$dLon = deg2rad($lon2 - $lon1);
$a = sin($dLat / 2) * sin($dLat / 2) +
cos(deg2rad($lat1)) * cos(deg2rad($lat2)) *
sin($dLon / 2) * sin($dLon / 2);
$c = 2 * atan2(sqrt($a), sqrt(1 - $a));
return $R * $c;
}
// Utilisation
$api_key = getenv('INFOPARCELLE_API_KEY');
$resultats = rechercher_avec_proximite("pharmacie", 48.8566, 2.3522, $api_key);
foreach ($resultats as $adresse) {
echo "{$adresse['adresse_complete']} - {$adresse['distance']} km\n";
}
?>
import os
import requests
import math
def rechercher_avec_proximite(query, user_lat, user_lon):
"""
Recherche des adresses et les trie par distance
"""
api_key = os.getenv('INFOPARCELLE_API_KEY')
# 1. Rechercher les adresses
response = requests.get(
'https://app.infoparcelle.fr/api/v1/geocoder/search',
params={'recherche': query, 'limite': 20},
headers={'Authorization': f'Bearer {api_key}'}
)
adresses = response.json()
# 2. Calculer la distance pour chaque adresse
adresses_avec_distance = []
for adresse in adresses:
coords = adresse['centre']['coordinates']
distance = calculer_distance(
user_lat, user_lon,
coords[1], coords[0]
)
adresse['distance'] = distance
adresses_avec_distance.append(adresse)
# 3. Trier par distance
adresses_avec_distance.sort(key=lambda x: x['distance'])
return adresses_avec_distance
def calculer_distance(lat1, lon1, lat2, lon2):
"""
Calcule la distance entre deux points GPS (formule de Haversine)
"""
R = 6371 # Rayon de la Terre en km
dLat = math.radians(lat2 - lat1)
dLon = math.radians(lon2 - lon1)
a = (math.sin(dLat / 2) * math.sin(dLat / 2) +
math.cos(math.radians(lat1)) * math.cos(math.radians(lat2)) *
math.sin(dLon / 2) * math.sin(dLon / 2))
c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a))
return R * c
# Utilisation
resultats = rechercher_avec_proximite("pharmacie", 48.8566, 2.3522)
for adresse in resultats[:5]:
print(f"{adresse['adresse_complete']} - {adresse['distance']:.2f} km")
Bonnes pratiques
✅ À faire
- Implémenter un debounce pour l'autocomplétion (300-500ms)
- Vérifier le score de similarité (>0.8 recommandé)
- Limiter le nombre de résultats (10-20 pour une UI)
- Utiliser
champspour optimiser la bande passante - Gérer les erreurs (adresse non trouvée, timeout)
- Cacher les résultats pour les recherches fréquentes
❌ À éviter
- ❌ Requête à chaque frappe sans debounce
- ❌ Accepter des scores de similarité < 0.6
- ❌ Demander trop de résultats (>50)
- ❌ Ne pas gérer les cas sans résultat
- ❌ Ignorer les erreurs de timeout
- ❌ Requêtes synchrones bloquantes
Limites
- Minimum 3 caractères pour déclencher une recherche
- France uniquement (métropole + DOM)
- Pas de recherche par coordonnées (utilisez le géocodage inverse)
- Pas de regex dans la recherche
Performances
- Temps de réponse moyen : < 100ms
- Cache côté serveur : 15 minutes
- Rate limit : 1200 requêtes/minute
Voir aussi
- Référence API - Documentation technique complète
- Gestion des erreurs - Gérer les erreurs
- Rate Limits - Optimisations et limites