Aller au contenu principal

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 -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"

Adresse partielle

L'API accepte des adresses incomplètes :

# 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"

Score de similarité

Chaque résultat inclut un score de similarité entre 0 et 1 :

  • 1.0 : Correspondance exacte
  • 0.8 - 0.99 : Très bonne correspondance
  • 0.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 "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)'

Limiter le nombre de résultats

Par défaut, l'API retourne 10 résultats. Vous pouvez ajuster ce nombre :

# 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"

Sélectionner les champs

Optimisez la réponse en ne demandant que les champs nécessaires :

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"

Champs disponibles

ChampTypeDescription
identifiant_banstringIdentifiant unique BAN
adresse_completestringAdresse formatée
numerostringNuméro de voie
nom_voiestringNom de la voie
municipalitestringCommune
parcellesarrayRéférences cadastrales
centreobjectCoordonnées GPS (Point GeoJSON)
similaritenumberScore de correspondance (0-1)

Format GeoJSON

Pour une intégration directe dans une carte :

curl "https://app.infoparcelle.fr/api/v1/geocoder/search?recherche=1+Rue+de+Rivoli&format=geojson" \
-H "Authorization: Bearer VOTRE_CLE_API"

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

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>
);
}

2. Validation d'adresse

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");
}

3. Recherche de proximité avec autocomplétion

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;
}

Bonnes pratiques

✅ À faire

  1. Implémenter un debounce pour l'autocomplétion (300-500ms)
  2. Vérifier le score de similarité (>0.8 recommandé)
  3. Limiter le nombre de résultats (10-20 pour une UI)
  4. Utiliser champs pour optimiser la bande passante
  5. Gérer les erreurs (adresse non trouvée, timeout)
  6. Cacher les résultats pour les recherches fréquentes

❌ À éviter

  1. ❌ Requête à chaque frappe sans debounce
  2. ❌ Accepter des scores de similarité < 0.6
  3. ❌ Demander trop de résultats (>50)
  4. ❌ Ne pas gérer les cas sans résultat
  5. ❌ Ignorer les erreurs de timeout
  6. ❌ 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