Le géocodage consiste à convertir des adresses postales (ou des noms de lieux) en coordonnées géographiques. Avec le plugin MMQGIS, cette opération devient accessible à tous, sans écrire une seule ligne de code. Voici comment procéder.
Ce qu’il vous faut
- Un fichier CSV contenant une liste d’adresses (ou noms de lieux).
- QGIS avec le plugin MMQGIS installé.
- Une connexion internet active (le géocodage utilise des services en ligne).
Préparer vos données
Votre fichier CSV doit contenir :
- une colonne avec l’adresse complète (ou ville + pays),
- des en-têtes simples (ex. :
adresse
), - un encodage UTF-8.
Exemple :
id,adresse
1,"Rue de la République, 75003 Paris, France"
2,"10 Downing Street, London, UK"
3,"Port Mathurin, Rodrigues, Maurice"
Géocoder avec MMQGIS

- Ouvrez QGIS et assurez-vous que MMQGIS est activé.
- Allez dans le menu :
MMQGIS → Geocode → Geocode CSV with Web Service
. - Dans la fenêtre qui s’ouvre :
- Sélectionnez votre fichier CSV.
- Indiquez la colonne contenant les adresses.
- Choisissez le service de géocodage :
OpenStreetMap/Nominatim est gratuit, mais limité en volume.
- Choisissez un fichier de sortie pour les résultats (CSV ou shapefile).
- Cliquez sur OK pour lancer le traitement.

Résultat
- Le plugin crée un fichier avec les coordonnées latitude/longitude ajoutées.
- Une couche de points est automatiquement chargée dans QGIS.
- Chaque point est lié à l’adresse d’origine.

Bonnes pratiques
- Pour éviter d’être bloqué par Nominatim, limitez le nombre de requêtes et ajoutez un délai si vous utilisez beaucoup d’adresses.
- Si vous avez un volume important ou des exigences de précision, envisagez un service professionnel (Google Maps, HERE, etc.).
- Vérifiez la qualité des adresses : une adresse mal formatée sera mal géocodée.
Astuce
Vous pouvez ensuite utiliser la couche obtenue pour :
- cartographier des points d’intérêt,
- calculer des distances,
- enrichir vos analyses spatiales, etc.
⚠️ Limites de Nominatim et précautions à prendre
Le service Nominatim utilisé par le plugin MMQGIS repose sur les serveurs d’OpenStreetMap, qui imposent des règles strictes d’usage pour éviter la surcharge de leurs infrastructures.
Limite importante :
Une requête par seconde maximum est autorisée. Si vous envoyez trop de requêtes trop rapidement, vous risquez :
- de recevoir des erreurs,
- de vous faire temporairement bloquer par le serveur.
Le problème avec MMQGIS
Le plugin ne permet pas d’ajouter un délai entre les requêtes, ce qui rend son usage risqué pour les grandes listes d’adresses (plus de 50 à 100).
Solutions si vous avez beaucoup d’adresses
- Découpez votre fichier CSV en petits lots (ex. 50 ou 100 adresses) et lancez le géocodage manuellement pour chaque lot, en espaçant les opérations.
- Utilisez un autre service de géocodage, comme :
- Google Maps API (nécessite une clé API et a ses propres quotas).
- BAN (Base Adresse Nationale) si vos données concernent la France.
- Photon (basé aussi sur OpenStreetMap, mais avec d’autres conditions).
- ArcGIS Online si vous avez accès à ce service.
- Utilisez un script Python avec une boucle lente :
Un script personnalisé avectime.sleep(1)
entre chaque requête vous permet de respecter les conditions d’utilisation.
Script Python
Voici un script Python simple pour géocoder une liste d’adresses avec Nominatim en respectant un délai minimum d’une seconde entre chaque requête, comme recommandé.
Objectif :
- Lire un fichier CSV contenant des adresses.
- Utiliser l’API Nominatim (OpenStreetMap).
- Attendre 1 seconde entre chaque requête pour respecter les conditions d’utilisation.
- Écrire un fichier CSV en sortie avec les coordonnées lat/lon.
Fichier source (exemple)
Un fichier CSV nommé adresses.csv
avec une colonne adresse
:
id,adresse
1,10 rue de Paris, Lyon, France
2,5 avenue Victor Hugo, Marseille, France
3,place Bellecour, Lyon, France
Script à coller dans la console Python de QGIS
import csv
import time
import requests
from qgis.core import (
QgsVectorLayer,
QgsFields,
QgsField,
QgsFeature,
QgsGeometry,
QgsPointXY,
QgsProject
)
from PyQt5.QtCore import QVariant
# Paramètres
CSV_PATH = 'C:/chemin/vers/adresses.csv' # ← À adapter
USER_AGENT = "VotreNomOuProjet (email@exemple.com)" # Obligatoire !
DELAY = 1.1 # Délai entre requêtes en secondes
# Fonction de géocodage
def geocode(adresse):
url = 'https://nominatim.openstreetmap.org/search'
params = {
'q': adresse,
'format': 'json',
'limit': 1
}
headers = {'User-Agent': USER_AGENT}
try:
response = requests.get(url, params=params, headers=headers)
response.raise_for_status()
data = response.json()
if data:
return float(data[0]['lon']), float(data[0]['lat'])
else:
return None, None
except Exception as e:
print(f"Erreur : {adresse} → {e}")
return None, None
# Lecture du CSV
features = []
with open(CSV_PATH, newline='', encoding='utf-8') as f:
reader = csv.DictReader(f)
for row in reader:
adresse = row['adresse']
print(f"Géocodage : {adresse}")
lon, lat = geocode(adresse)
if lon is not None and lat is not None:
feat = QgsFeature()
feat.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(lon, lat)))
feat.setAttributes([adresse, lat, lon])
features.append(feat)
else:
print(f"Adresse non trouvée : {adresse}")
time.sleep(DELAY)
# Création de la couche mémoire
vl = QgsVectorLayer('Point?crs=EPSG:4326', 'Adresses géocodées', 'memory')
prov = vl.dataProvider()
prov.addAttributes([
QgsField('adresse', QVariant.String),
QgsField('latitude', QVariant.Double),
QgsField('longitude', QVariant.Double)
])
vl.updateFields()
prov.addFeatures(features)
vl.updateExtents()
QgsProject.instance().addMapLayer(vl)
print("✅ Géocodage terminé. Couche ajoutée à QGIS.")
À noter :
- Le champ
User-Agent
est obligatoire pour l’usage de Nominatim. Mettez votre nom ou votre projet, avec un mail valide. - Le script attend 1,1 seconde entre chaque appel.
- Vous pouvez adapter la structure du CSV (champ
adresse
, séparateurs, etc.).
À adapter avant d’exécuter :
CSV_PATH
→ mettre le chemin complet du fichier.csv
contenant la colonneadresse
.USER_AGENT
→ indispensable pour respecter les conditions de Nominatim.
Résultat :
- Une nouvelle couche point s’ajoute automatiquement au projet QGIS.
- Chaque point représente une adresse géocodée, avec les colonnes :
adresse
,latitude
,longitude
.
Et ensuite ?
Dans un prochain article, nous verrons comment géocoder des lieux uniquement à partir du nom (commune, pays, etc.), ou encore comment faire l’inverse : retrouver l’adresse à partir de coordonnées GPS (reverse géocoding).
Comment « ajouter un délai si vous utilisez beaucoup d’adresses » ? Le plugin n’offre pas cette possibilité, alors que l’aide sur Nominatim suggère d’envoyer moins d’une requête par seconde.
(Merci pour vos articles toujours aussi intéressants)
Bonjour,
Merci pour votre question très pertinente !
En effet, le service Nominatim impose une limite d’une requête par seconde (voire plus strictement pour certains serveurs publics), comme précisé dans leur documentation. Le plugin MMQGIS, malheureusement, ne permet pas de configurer un délai entre les requêtes, ce qui peut entraîner des erreurs ou un blocage temporaire si vous tentez de géocoder une longue liste d’adresses.
Que faire dans ce cas ?
✅ Solutions de contournement possibles :
1. Découper votre fichier CSV en petits lots (par exemple 50 ou 100 adresses), et les géocoder un par un avec une pause manuelle entre chaque lot.
2. Utiliser un service de géocodage alternatif, comme :
* Google Maps (avec API et clé, limité mais plus stable).
* BAN (Base Adresse Nationale – France).
* Photon ou ArcGIS Online (selon vos données et contraintes).
3.Utiliser un script Python avec `time.sleep()`, si vous êtes à l’aise avec un peu de code :
Cela permet de respecter la limite d’une requête/sec avec Nominatim.
Je vais ajouter une note à l’article pour signaler cette limitation et proposer ces alternatives. Merci encore pour votre retour !
Bonjour,
Merci pour votre réponse.
Pour info je voulais utiliser Nominatim sur un reliquat de 11000 adresses que le géocodeur de adresse.data.gouv.fr n’avait pas localisé dans un lot initial de 120000. Je me suis dit que le serveur de openstreetmap était peut-être en France et donc peu chargé la nuit, et j’ai procédé le soir par lots croissants de 500, 600, … jusqu’à environ 1000 adresses et ça c’est bien passé. Nominatim en a trouvé le moitié. Je ferai le reste avec l’API Google, car les moteurs de recherche internet trouvent très bien la plupart des adresses en échec que j’ai testées, et même les IA, mais celles-ci refusent de traiter des lots conséquents, et puis c’est peut-être un marteau pour écraser une mouche.
Après, je n’ai pas regardé de près la qualité des diverses localisations, car pour mon sujet ça importe peu.
Cordialement, AF