Géocodage par lots
Chaque requête nécessite une clé API; voir Authentification.
Le produit est POST /geocode/batch : jusqu'à 100 recherches, une requête HTTP, un appel facturé
par requête non vide. Il y a un exemple à copier. Un CSV est un
fichier sur votre machine. unmap geocode csv est un client de cette route. unmap ne stocke pas
le fichier.
L'API
POST /geocode/batch
Le corps est du JSON. queries est obligatoire : 1 à 100 chaînes, ordre conservé. Contrôles de
recherche partagés seulement (lang, limit, layers, focus, region, bbox). La réponse
est un tableau aligné sur queries. L'index i est ce que GET /geocode/search retournerait
pour cette chaîne. Les entrées vides restent [] et ne sont pas facturées. Plus de 100 requêtes
donne un 413. Une allocation restante inférieure au nombre de requêtes non vides refuse la
requête entière.
curl -X POST "https://api.unmap.dev/geocode/batch" \
-H "Authorization: Bearer $UNMAP_API_KEY" \
-H "Content-Type: application/json" \
-d '{"queries":["17 Ave SW Calgary","Springfield"],"limit":1}'import { Geocoder } from "@unmap/geocoding";
const geocoder = new Geocoder({ key: "um_live_..." });
const results = await geocoder.batch(["17 Ave SW Calgary", "Springfield"], { limit: 1 });geocoder.batch découpe une liste plus longue par 100. Un fichier de 100 000 lignes, c'est
1 000 requêtes cliente, pas une file d'attente Worker. L'API de géocodage
porte le contrat complet.
Un CSV sur votre machine
unmap geocode csv lit le fichier, envoie la colonne désignée par lots de 100, et écrit une
copie avec dix colonnes ajoutées. Votre fichier n'est jamais modifié et jamais téléversé.
npx @unmap/cli geocode csv adresses.csv --query-column address --output geocode.csv --review-output revision.csvTéléchargez un fichier d'exemple pour l'essayer. Vingt lignes synthétiques couvrant les cas qui valent la peine d'être vus : accents, une rue sans numéro civique, une route rurale, le même nom de rue dans deux provinces, une ligne vide et une adresse impossible à résoudre.
Seule la colonne que vous désignez quitte la machine. Les colonnes non désignées ne sont jamais
envoyées. Votre clé d'API provient de --key, de la variable d'environnement UNMAP_KEY ou de
unmap.config.json. Elle n'est jamais écrite dans la sortie, le fichier de révision, le fichier
de reprise, ni dans aucun message affiché par l'outil.
Compter avant de dépenser
--estimate valide la correspondance de colonne et compte les lignes sans envoyer une seule
requête.
npx @unmap/cli geocode csv adresses.csv --query-column address --estimate20 rows, 19 with an address, 1 without.
1 requests if nothing retries; up to 4 if every request uses all 4 attempts.
Each request geocodes up to 100 addresses. Every successful address is one billed call. Retries are billed.
Remaining allowance: unknown from the CLI. Check the dashboard at unmap.dev/dashboard/usage.
La sortie de l'outil en ligne de commande est en anglais. Deux nombres, pas un seul. Les requêtes
sont des POST d'au plus 100 adresses. Chaque adresse réussie est un appel sur votre forfait. Une
requête réessayée est facturée à nouveau, comme pour GET /geocode/search. Une ligne sans adresse
en coûte zéro. L'estimation donne le plancher et le plafond, et dit lequel est lequel.
--sample 100 ne traite que les cent premières lignes ayant une adresse, puis s'arrête et
enregistre un point de reprise. Cela envoie bel et bien des requêtes, et elles sont facturées.
Relancez avec --resume et sans --sample pour terminer.
Les colonnes ajoutées
Dix colonnes, toutes préfixées unmap_, ajoutées après les vôtres. Si votre fichier porte déjà
l'un de ces noms, la colonne ajoutée est suffixée (unmap_status_2) au lieu d'écraser la vôtre, et
l'outil vous le dit.
| Colonne | Signification |
|---|---|
unmap_status | matched, review, no_match, invalid, failed ou unprocessed |
unmap_id | Identifiant stable de la fiche appariée |
unmap_name | Le libellé résolu par le géocodeur |
unmap_lng, unmap_lat | Coordonnées, WGS84 |
unmap_layer | address, street, locality, region ou poi |
unmap_source | Le jeu de données d'où provient la fiche |
unmap_match_type | exact, partial, fallback ou unknown |
unmap_precision | point, street, locality, region ou unknown |
unmap_review | Pourquoi la ligne mérite un coup d'oeil, le cas échéant |
unmap_status et unmap_match_type répondent à deux questions différentes, et la combinaison à
surveiller est matched avec fallback. Elle signifie qu'une réponse est revenue et qu'elle est
plus grossière que la demande : vous avez donné un numéro civique et obtenu la rue. Voir
métadonnées de résultat.
Le fichier de révision
--review-output écrit un second CSV qui ne contient que les lignes méritant un coup d'oeil :
réponses plus grossières que la demande, concordances partielles, quasi-égalités entre les deux
meilleurs candidats, lignes sans résultat et lignes en échec. C'est un sous-ensemble de la sortie
principale, au même format et avec les mêmes colonnes.
Chaque ligne d'entrée figure exactement une fois dans la sortie principale, quoi qu'il lui soit arrivé. Rien n'est écarté en silence, et c'est tout l'intérêt d'avoir une colonne de statut.
Interrompre
Ctrl-C arrête l'exécution après les requêtes déjà en vol, puis écrit un fichier de reprise à côté
de la sortie. Relancez la même commande avec --resume et elle repart de la dernière ligne
écrite de façon durable.
npx @unmap/cli geocode csv adresses.csv --query-column address --output geocode.csv --resumeLa reprise est refusée si le fichier d'entrée ou la correspondance de colonne a changé : les
numéros de ligne ne concorderaient plus et la moitié du fichier aurait été géocodée autrement.
Changer le rythme (--rate, --concurrency, --max-attempts) est permis : cela change l'effort
de l'outil, pas ce à quoi une ligne se résout.
Une chose que la reprise ne peut pas faire : une requête en vol au moment de l'arrêt a peut-être déjà été servie, et elle sera renvoyée. Rien sur votre machine ne peut savoir lesquelles, donc une reprise peut facturer deux fois un petit nombre de lignes.
Rythme
| Option | Défaut | Ce qu'elle borne |
|---|---|---|
--rate | 10 par seconde | La vitesse d'envoi, en moyenne |
--concurrency | 4 | Le nombre de requêtes en vol à la fois |
--max-attempts | 4 | Les tentatives par requête, la première comprise |
Le débit et la concurrence bornent deux choses différentes et se règlent séparément. Les valeurs par défaut restent délibérément bien en deçà de la limite de rafale par clé, parce qu'un travail par lots partage l'allocation de votre compte avec ce que vous servez à de vrais utilisateurs. Voir forfaits et limites.
Les nouvelles tentatives ne visent que les échecs qui pourraient réussir plus tard : une limite de
débit, un délai dépassé, une erreur 5xx. Une requête mal formée n'est jamais réessayée. Une clé
invalide arrête immédiatement toute l'exécution sans marquer aucune adresse comme mauvaise, parce
que l'adresse n'était pas le problème. Un quota épuisé ou un plafond de dépenses atteint arrête
aussi l'exécution au lieu d'insister; relancez avec --resume une fois la limite levée.
Tableurs
--spreadsheet-safe préfixe une tabulation à toute valeur qu'Excel, Sheets ou LibreOffice
évaluerait comme une formule, afin qu'une cellule commençant par =, +, - ou @ s'affiche
comme du texte. L'option est désactivée par défaut parce qu'elle modifie les octets, et qu'un
traitement automatisé qui relit le fichier veut la valeur d'origine.
Ce que l'outil ne fait pas
- Il géocode du texte libre. La correspondance de colonnes séparées pour l'adresse, la ville et la province passe par la recherche structurée et n'est pas encore branchée dans la ligne de commande.
- Il ne valide pas la distribution du courrier. Un code postal dans une ligne est comparé à celui que porte la fiche appariée; unmap ne sait pas si une adresse reçoit du courrier.
- Canada seulement.
Pas une API de traitements
Il n'y a pas de POST /jobs aujourd'hui, et POST /geocode/batch n'en est pas une. La requête
répond dans le même appel HTTP. unmap ne conserve pas votre fichier, ne maintient pas une file
après la fermeture de l'onglet, et n'accepte pas de webhook.
Une API générique de traitements est un travail ultérieur, et elle sera asynchrone :
POST /jobs retourne 202 et un identifiant; le client interroge GET /jobs/:id et lit le
résultat seulement quand le traitement a réussi. La requête de création n'attend pas le
travail. Le déclencheur est le premier produit qui ne peut pas finir en une requête : une
grande matrice d'itinéraires, beaucoup de trajets camion, tout ce qui dépasse le budget d'un
Worker ou d'un conteneur. Cette API sera un nouveau préfixe et de nouvelles tables, pas une
extension du CSV hébergé. Le géocodage n'y aura pas de gestionnaire dans cette première
coupe. Ne la construisez pas pour accélérer un tableur.
Prochaines étapes
- L'API de géocodage pour la recherche que ceci regroupe, une requête à la fois.
- Géocoder plusieurs adresses reprend la requête comme exemple à copier.
- Forfaits et limites pour ce qu'un gros lot coûte sur votre quota.