Download the PHP package andydefer/laravel-locationiq without Composer
On this page you can find all versions of the php package andydefer/laravel-locationiq. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Download andydefer/laravel-locationiq
More information about andydefer/laravel-locationiq
Files in andydefer/laravel-locationiq
Package laravel-locationiq
Short Description Laravel SDK for integrating LocationIQ and Nominatim geospatial services (balance, timezone, directions, reverse geocoding).
License MIT
Informations about the package laravel-locationiq
Laravel LocationIQ
Intégration Laravel du SDK LocationIQ/Nominatim pour le géocodage, les itinéraires, les fuseaux horaires et les matrices de durées/distances.
Table des matières
- Introduction
- Installation
- Configuration
- Routes exposées
- Utilisation
- Contrats et extension
- Gestion des erreurs
- Tests
- Sécurité
- Compatibilité
1. Introduction
Objectif
andydefer/laravel-locationiq expose les opérations LocationIQ et Nominatim (solde de quota, fuseau horaire, itinéraires, matrices de durées/distances, reverse geocoding) sous forme d'endpoints HTTP Laravel prêts à l'emploi.
Le package s'appuie sur andydefer/php-locationiq, qui contient toute la logique métier et les objets typés (Record, Response, Data, Graph, Collection). Laravel LocationIQ n'ajoute que la couche transport : routes, validation, injection.
Ce que le package fournit
- 5 endpoints HTTP : solde de quota, fuseau horaire, itinéraires, matrices, reverse geocoding.
- 4
FormRequest: validation stricte des payloads et construction desRecordtypés du SDK. - 5
Action: résolvent le client LocationIQ ou Nominatim via la configuration, appellent l'opération correspondante et renvoient laDatatypée. En cas d'erreur, l'action propage unErrorResponseDatanormalisé. - Une configuration unique : clé API, URL régionale, URL Nominatim, User-Agent, profil de directions par défaut.
- Deux points d'extension : remplacer le client LocationIQ (
locationiq_client_fqcn) ou le client Nominatim (nominatim_client_fqcn) sans modifier le package.
Ce que le package ne fait pas
- Aucune authentification. Les routes sont publiées sans middleware.
- Aucune persistance. Le package ne touche pas à la base de données.
- Aucune mise en cache. À implémenter côté application hôte selon les besoins.
2. Installation
Le LocationIqServiceProvider est découvert automatiquement par Laravel.
3. Configuration
3.1 Publier les fichiers
- Config publiée dans
config/locationiq.php. - Routes publiées dans
routes/locationiq.php.
3.2 Charger les routes
Les routes ne sont pas chargées automatiquement. Charge-les explicitement depuis ton application :
Tu contrôles ainsi le préfixe, les middlewares et l'ordre de chargement.
3.3 Fichier de configuration
3.4 Clés de configuration
| Clé | Type | Défaut | Description |
|---|---|---|---|
api_key |
string |
'' |
Clé API LocationIQ |
base_url |
string |
https://us1.locationiq.com |
URL régionale LocationIQ (us1, eu1) |
locationiq_client_fqcn |
class-string |
LocationIqClient::class |
Implémentation de LocationIqClientInterface |
nominatim.base_url |
string |
https://nominatim.openstreetmap.org |
URL Nominatim |
nominatim.user_agent |
string |
andydefer/laravel-locationiq |
User-Agent obligatoire pour Nominatim |
nominatim.accept_language |
string |
fr |
Langue préférée des résultats Nominatim |
nominatim_client_fqcn |
class-string |
NominatimClient::class |
Implémentation de NominatimClientInterface |
directions.profile |
string |
driving |
Profil par défaut pour Directions (driving, walking) |
directions.accept_language |
string\|null |
null |
Langue préférée des réponses LocationIQ |
matrix.profile |
string |
driving |
Profil par défaut pour Matrix (driving, walking) |
3.5 Variables d'environnement
3.6 Cas concret : configuration Afya (RDC)
4. Routes exposées
Le fichier routes/locationiq.php déclare cinq endpoints, tous en POST, sous le préfixe locationiq.
| Méthode | URI | Nom | Description |
|---|---|---|---|
| POST | /locationiq/balance |
locationiq.balance |
Récupérer le solde de requêtes du jour |
| POST | /locationiq/timezone |
locationiq.timezone |
Résoudre le fuseau horaire d'un point GPS |
| POST | /locationiq/directions |
locationiq.directions |
Calculer un itinéraire |
| POST | /locationiq/matrix |
locationiq.matrix |
Calculer une matrice de durées/distances |
| POST | /locationiq/reverse |
locationiq.reverse |
Reverse geocoding via Nominatim |
5. Utilisation
5.1 Récupérer le solde de quota
Requête :
Aucun paramètre.
Réponse succès (200) :
5.2 Résoudre un fuseau horaire
Requête :
Paramètres :
| Champ | Type | Requis | Contrainte |
|---|---|---|---|
lat |
numeric |
✅ | Entre -90 et 90 |
lon |
numeric |
✅ | Entre -180 et 180 |
timestamp |
integer |
❌ | Unix timestamp, ≥ 0 |
Réponse succès (200) :
5.3 Calculer un itinéraire
Requête :
Paramètres :
| Champ | Type | Requis | Contrainte |
|---|---|---|---|
coordinates |
array |
✅ | 2 à 25 paires [lon, lat] |
coordinates.* |
array |
✅ | Exactement 2 valeurs |
coordinates.*.0 |
numeric |
✅ | Entre -180 et 180 (longitude) |
coordinates.*.1 |
numeric |
✅ | Entre -90 et 90 (latitude) |
profile |
DirectionsProfile |
❌ | driving, walking |
overview |
OverviewType |
❌ | simplified, full, false |
steps |
boolean |
❌ | Inclure les étapes détaillées |
alternatives |
boolean |
❌ | Retourner des itinéraires alternatifs |
geometries |
GeometriesType |
❌ | polyline, polyline6, geojson |
Réponse succès (200) :
Polymorphisme géré : LocationIQ retourne tantôt un objet unique, tantôt un tableau. Le SDK normalise toujours en collection typée.
5.4 Calculer une matrice de durées/distances
Calcule les durées et/ou distances des trajets les plus rapides entre toutes les paires de coordonnées fournies. Utile pour comparer rapidement plusieurs points (livraisons, tournées, répartition géographique).
Requête minimale :
Requête complète :
Paramètres :
| Champ | Type | Requis | Contrainte |
|---|---|---|---|
coordinates |
array |
✅ | 2 à 25 paires [lon, lat] |
coordinates.* |
array |
✅ | Exactement 2 valeurs |
coordinates.*.0 |
numeric |
✅ | Entre -180 et 180 (longitude) |
coordinates.*.1 |
numeric |
✅ | Entre -90 et 90 (latitude) |
profile |
DirectionsProfile |
❌ | driving, walking |
annotations |
array<MatrixAnnotation> |
❌ | duration, distance (au moins un si fourni) |
sources |
array<int> |
❌ | Index de coordonnées, entre 0 et N-1 |
destinations |
array<int> |
❌ | Index de coordonnées, entre 0 et N-1 |
fallback_speed |
numeric |
❌ | Strictement supérieur à 0 |
fallback_coordinate |
FallbackCoordinate |
❌ | input, snapped |
Réponse succès (200) :
Comprendre la matrice
- Non symétrique.
durations[0][1]peut différer dedurations[1][0]à cause des sens uniques, priorités aux carrefours et feux de circulation. C'est la réalité du trafic — et c'est précisément l'intérêt de l'endpoint Matrix. - Diagonale à zéro. Le trajet d'un point vers lui-même est toujours
0.0. - Distances routières. Ce ne sont pas des distances à vol d'oiseau, mais la longueur du chemin routier le plus rapide.
- Cellules sans route. Si LocationIQ ne trouve pas de route, la cellule vaut
-1.0(sentinelFloatMatrixVO::NO_ROUTE_SENTINEL). Vérifie avecisNoRoute($row, $column).
Restreindre les sources et destinations
Par défaut, LocationIQ calcule la matrice complète N×N. Tu peux restreindre avec des index de coordonnées (base 0) :
sources: [0]→ matrice1×N(départs depuis la coordonnée #0 uniquement).destinations: [1, 2]→ matriceN×2.sources: [0]etdestinations: [1, 2]→ matrice1×2.
Utile quand tu as un entrepôt fixe et plusieurs destinations. Économie de quota et de temps de calcul.
Fallback : paires non routables
Si tu veux garantir qu'aucune cellule ne soit vide, active le fallback :
fallback_speed: vitesse en m/s utilisée pour estimer la durée à partir de la distance à vol d'oiseau.fallback_coordinate:input(coordonnée envoyée) ousnapped(coordonnée projetée sur le réseau routier).snappedest plus cohérent avec le reste de la matrice.
5.5 Reverse geocoding
Requête :
Paramètres :
| Champ | Type | Requis | Contrainte |
|---|---|---|---|
lat |
numeric |
✅ | Entre -90 et 90 |
lon |
numeric |
✅ | Entre -180 et 180 |
format |
NominatimFormat |
❌ | json, jsonv2, geojson, geocodejson |
accept_language |
string |
❌ | Code ISO 639-1, max 10 caractères |
zoom |
integer |
❌ | Entre 0 et 18 |
address_details |
boolean |
❌ | Inclure le bloc address |
Réponse succès (200) :
6. Contrats et extension
6.1 LocationIqConfigInterface
Contrat de la configuration. Utilisé par le ServiceProvider pour construire les clients et par les Action pour les résoudre.
6.2 ErrorDescribable
Contrat hérité du package andydefer/laravel-nemesis. Tout enum d'erreur qui l'implémente expose une API cohérente :
getHttpStatusCode(): HttpStatusCodegetMessage(): stringgetLabel(): stringtoResponseData(): ErrorResponseDatatoJsonResponseFactory(): ResponseFactory
6.3 ErrorCode
Enum qui implémente ErrorDescribable. Couvre les codes d'erreur LocationIQ et Nominatim.
6.4 Remplacer le client LocationIQ
Contraintes :
- La classe doit implémenter
LocationIqClientInterface. - Son constructeur doit être auto-résolvable par le conteneur Laravel.
6.5 Remplacer le client Nominatim
Contraintes :
- La classe doit implémenter
NominatimClientInterface. - Son constructeur doit être auto-résolvable par le conteneur Laravel.
6.6 Binder les interfaces manuellement
L'option bind n'a d'effet que si les clés locationiq_client_fqcn et nominatim_client_fqcn restent égales à leurs valeurs par défaut.
7. Gestion des erreurs
Le package distingue trois niveaux.
7.1 Validation (HTTP 422)
Les FormRequest rejettent les payloads invalides avant toute exécution.
| Situation | Message type |
|---|---|
lat manquant |
The lat field is required. |
lat hors bornes |
The lat field must be between -90 and 90. |
lon hors bornes |
The lon field must be between -180 and 180. |
timestamp négatif |
The timestamp field must be at least 0. |
coordinates moins de 2 paires |
The coordinates field must have at least 2 items. |
coordinates plus de 25 paires |
The coordinates field must not have more than 25 items. |
coordinates.* non conforme |
The coordinates.0 field must contain 2 items. |
profile invalide |
The selected profile is invalid. |
overview invalide |
The selected overview is invalid. |
geometries invalide |
The selected geometries is invalid. |
annotations vide |
The annotations field must have at least 1 item. |
annotations.* invalide |
The selected annotations.0 is invalid. |
sources.* hors plage |
The sources.0 field must be between 0 and {max}. |
destinations.* hors plage |
The destinations.0 field must be between 0 and {max}. |
fallback_speed nul ou négatif |
The fallback speed field must be greater than 0. |
fallback_coordinate invalide |
The selected fallback coordinate is invalid. |
format invalide |
The selected format is invalid. |
zoom hors bornes |
The zoom field must be between 0 and 18. |
accept_language trop long |
The accept language field must not be greater than 10 characters. |
7.2 Erreurs LocationIQ
L'action map le message brut vers un ErrorCode, puis renvoie un ErrorResponseData avec le bon code HTTP.
Correspondances message → code :
| Message brut LocationIQ | ErrorCode |
HTTP |
|---|---|---|
Invalid Request |
INVALID_REQUEST |
422 |
Invalid Key |
INVALID_KEY |
401 |
Access restricted |
ACCESS_RESTRICTED |
403 |
Unable to geocode |
UNABLE_TO_GEOCODE |
404 |
Rate Limited Day |
RATE_LIMITED_DAY |
429 |
InvalidOptions |
INVALID_OPTIONS |
422 |
NoTable |
NO_TABLE |
422 |
NotImplemented |
NOT_IMPLEMENTED |
422 |
Unknown error - Please try again after some time |
UNKNOWN_ERROR |
500 |
LocationIQ peut renvoyer
InvalidOptions,NoTableouNotImplementeddans le champcodeavec un HTTP 200. Le SDK détecte ce cas et les mappe vers les codes d'erreur typés.
7.3 Erreurs SDK
Les Action capturent les exceptions levées par le SDK et les transforment en ErrorResponseData.
| Exception SDK | ErrorCode |
HTTP |
|---|---|---|
InvalidArgumentException (coordonnées Directions ou Matrix hors bornes, index sources/destinations invalides, fallback speed invalide) |
INVALID_COORDINATES |
422 |
RuntimeException (erreur réseau Guzzle) |
Non capturée → 500 Laravel | 500 |
Note : les index sources et destinations hors plage sont rejetés au niveau de la validation (FormRequest::withValidator) avant d'atteindre le SDK. Ils produisent une erreur 422 sur sources.0 / destinations.0, pas sur errorCode.
8. Tests
Le package fournit un IntegrationTestCase basé sur orchestra/testbench. Chaque test enregistre le vrai endpoint via action_route(...) et remplace les clients HTTP bas niveau par des mocks (MockLocationIqClient, MockNominatimClient).
Structure d'un test
Les tests suivent la convention AAA :
Restreindre les valeurs en test
Si tu veux tester avec une configuration alternative :
9. Sécurité
- Routes non protégées par défaut. Ajoute tes middlewares (
auth:sanctum,throttle:60,1, signature HMAC…) dans le fichier publié. LOCATIONIQ_API_KEYcôté serveur uniquement. Ne jamais l'exposer au frontend.NOMINATIM_USER_AGENTobligatoire en production. Nominatim peut bloquer les requêtes sans User-Agent identifiable.- Rate limit Nominatim : 1 requête/seconde sur l'instance publique. Prévoir un throttling côté application.
- Rate limit LocationIQ : sur les plans gratuits, minimum 1 seconde entre deux requêtes (
Rate Limited Second). Prévoir un throttling côté application si tu enchaînes plusieurs appels Matrix ou Directions. - Validation stricte : toutes les entrées (coordonnées, formats, profils, langues, annotations, sources, destinations) sont validées par les
FormRequestavant tout appel HTTP. - Restriction des formats Nominatim : seuls
json,jsonv2,geojsonetgeocodejsonsont acceptés. - Restriction des profils Directions et Matrix : seuls
drivingetwalkingsont acceptés. - Limite de coordonnées : 2 à 25 par requête Directions ou Matrix (limite imposée par l'API).
- Aucune donnée sensible persistée. Le package ne stocke rien.
10. Compatibilité
| Version | Support |
|---|---|
| PHP 8.2+ | ✅ Complet |
| Laravel 10 | ✅ Complet |
| Laravel 11 | ✅ Complet |
| Laravel 12 | ✅ Complet |
Licence
All versions of laravel-locationiq with dependencies
andydefer/php-locationiq Version ^0.3.3
andydefer/laravel-nemesis Version ^1.22.23