Il y a quelques années, j'ai du créer un site pour un chauffeur de taxi et intégrer un système de calcul de nombre de km afin d'avoir un estimatif de distance ainsi que le coût du trajet.
Le but du site n'étant pas de faire payer les courses en ligne mais d'être le plus transparent possible, le tarif taxi étant fixé par arrêté préfectoral.
Evidemment, l'estimation ne tient pas compte des aléas et imprévus comme des travaux ou des embouteillages ni des extra comme le fait d'attendre ou avoir plus de bagages.
A la base, c'est un formulaire suivi d'un traitement qui donne en retour le résultat estimatif.
Cela semble assez simple mais comme toujours, on rencontre quelques difficultés.
Cette publication de code a pour but de faciliter les personnes qui souhaitent également proposer de calculer une estimation sans passer par des solutions payantes ou assez lourdes à gérer qui nécessiterait un hébergement spécifique.
En d'autres termes, il est possible de calculer gratuitement le coût d'un trajet en taxi et de proposer cela sur son site.
On donc la possibilité :
- de développer sous la forme d'un composant Joomla voir d'un plugin de contenu avec le résultat dans une page spécifique ou dans la même page en utilisant l'ajax.
- ou d'utiliser le code php dans un gestionnaire de formulaire comme CONVERTFORM ( https://extensions.joomla.org/extension/convert-forms/ ).
Perso, j'ai choisi de réaliser une extension afin d'assurer le suivi (mise à jour développeur avec clé de licence), et de proposer des évolutions comme coupler avec mon propre système de reservation en ligne.
Voilà pour l'origine du projet.
Pour l'explication, je vais me limiter au calcul en php de façon très simpliste afin que ce soit intégrable, y compris pour les débutants par exemple dans convert form, rsform et autres.
1. GEOCODAGE NOMINATIM :
Rapidement, vous avez défini deux champs essentiels dans votre formulaire : l'adresse de départ et l'adresse d'arrivée rempli par l'utilisateur
En premier, on doit déterminer la longitude et la latitude de ces deux adresses. C'est du géocodage et c'est généralement payant.
Fort heureusement, on trouve la solution sur openstreetmap à travers l'api de nominatim :
https://nominatim.openstreetmap.org/ui/search.html
Les limites sont indiquées dans la politique d'utilisation ( pas d'utilisation intensive... ) :
https://operations.osmfoundation.org...ies/nominatim/
Exemple de requête de recherche avec le résultat au format json
https://nominatim.openstreetmap.org/search?q=55+Rue+du+Faubourg+Saint-Honoré,+Paris&format=jsonv2&extratags=1&limit=1
Pour l'usage fréquent (donc le site en production), il faudra préciser une adresse mail valide dans l'url
comme expliqué dans la documentation : https://nominatim.org/release-docs/develop/api/Search/
Si vous avez intégré le champ de l'adresse de départ dans une variable nommé $adresseun
et l'adresse d'arrivée dans une variable nommée $adressedeux
cela donne :
Ensuite on décode le json :
Note : on peut également utiliser curl à la place de file_get_contents
2. CALCUL DU TRAJET :
Donc on a nos deux adresses géocodées mais comment calculer le trajet ?
En fait, il y a plusieurs services et celui de graphhopper a le mérite d'avoir la gratuité pour 500 requêtes par jour.
https://www.graphhopper.com/pricing/
Il faut s'inscrire pour récupérer la clé nécessaire
Et j'ai donc soumis les points de geocodage (départ et arrivé) dans l'API
ce qui donne :
Il ne reste plus qu'à afficher un message style :
La distance estimative de cette course est de ".$distancekm." km soit ".$tarif
Pour info, la solution fonctionne depuis plusieurs années, le formulaire est sécurisé et je filtre les champs de saisie.
Comme c'est un chauffeur d'une ville moyenne, le site est moyennement fréquenté donc il ne dépasse pas les 500 requêtes.
Le script réel est plus complexe car il tient compte des différentes variations de tarif ( passage au tarif de nuit, dimanche et jours fériés, course circulaire ou à vide à la station )
J'ai aussi adapté également aux services de livraison.
Petit résumé pour débuter :
Attention de changer l'adresse mail pour l'api de nominatim ainsi que la clé (key=) pour l'api de graphhopper.
Vérifier que le forum n'est pas inséré des espaces...
N'hésitez pas à commenter en sachant que ce n'est pour but que le partage pour ceux qui recherchent par où commencer.
Vous pouvez également proposer vos adaptations, indiquer vos réussites ou échecs.
En espérant que cela sera utile pour futures créations de site !
Le but du site n'étant pas de faire payer les courses en ligne mais d'être le plus transparent possible, le tarif taxi étant fixé par arrêté préfectoral.
Evidemment, l'estimation ne tient pas compte des aléas et imprévus comme des travaux ou des embouteillages ni des extra comme le fait d'attendre ou avoir plus de bagages.
A la base, c'est un formulaire suivi d'un traitement qui donne en retour le résultat estimatif.
Cela semble assez simple mais comme toujours, on rencontre quelques difficultés.
Cette publication de code a pour but de faciliter les personnes qui souhaitent également proposer de calculer une estimation sans passer par des solutions payantes ou assez lourdes à gérer qui nécessiterait un hébergement spécifique.
En d'autres termes, il est possible de calculer gratuitement le coût d'un trajet en taxi et de proposer cela sur son site.
On donc la possibilité :
- de développer sous la forme d'un composant Joomla voir d'un plugin de contenu avec le résultat dans une page spécifique ou dans la même page en utilisant l'ajax.
- ou d'utiliser le code php dans un gestionnaire de formulaire comme CONVERTFORM ( https://extensions.joomla.org/extension/convert-forms/ ).
Perso, j'ai choisi de réaliser une extension afin d'assurer le suivi (mise à jour développeur avec clé de licence), et de proposer des évolutions comme coupler avec mon propre système de reservation en ligne.
Voilà pour l'origine du projet.
Pour l'explication, je vais me limiter au calcul en php de façon très simpliste afin que ce soit intégrable, y compris pour les débutants par exemple dans convert form, rsform et autres.
1. GEOCODAGE NOMINATIM :
Rapidement, vous avez défini deux champs essentiels dans votre formulaire : l'adresse de départ et l'adresse d'arrivée rempli par l'utilisateur
En premier, on doit déterminer la longitude et la latitude de ces deux adresses. C'est du géocodage et c'est généralement payant.
Fort heureusement, on trouve la solution sur openstreetmap à travers l'api de nominatim :
https://nominatim.openstreetmap.org/ui/search.html
Les limites sont indiquées dans la politique d'utilisation ( pas d'utilisation intensive... ) :
https://operations.osmfoundation.org...ies/nominatim/
Exemple de requête de recherche avec le résultat au format json
https://nominatim.openstreetmap.org/search?q=55+Rue+du+Faubourg+Saint-Honoré,+Paris&format=jsonv2&extratags=1&limit=1
Pour l'usage fréquent (donc le site en production), il faudra préciser une adresse mail valide dans l'url
comme expliqué dans la documentation : https://nominatim.org/release-docs/develop/api/Search/
Si vous avez intégré le champ de l'adresse de départ dans une variable nommé $adresseun
et l'adresse d'arrivée dans une variable nommée $adressedeux
cela donne :
Code PHP:
$firstplace = file_get_contents('https://nominatim.openstreetmap.org/search?q='.$adresseun.'&email=monmail%40domaine.com&format=jsonv2&extratags=1&limit=1');
$secondplace = file_get_contents('https://nominatim.openstreetmap.org/search?q='.$adressedeux.'&email=monmail%40domaine.com&format=jsonv2&extratags=1&limit=1');
Code PHP:
$firstplace = json_decode($firstplace, true);
$depart=$firstplace[0]['lat'].','.$firstplace[0]['lon'];
$secondplace = json_decode($secondplace, true);
$arrivee=$secondplace[0]['lat'].','.$secondplace[0]['lon'];
2. CALCUL DU TRAJET :
Donc on a nos deux adresses géocodées mais comment calculer le trajet ?
En fait, il y a plusieurs services et celui de graphhopper a le mérite d'avoir la gratuité pour 500 requêtes par jour.
https://www.graphhopper.com/pricing/
Il faut s'inscrire pour récupérer la clé nécessaire
Et j'ai donc soumis les points de geocodage (départ et arrivé) dans l'API
ce qui donne :
Code PHP:
$urlde = "https://graphhopper.com/api/1/route?point=".$depart."&point=".$arrivee."&vehicle =car&locale=fr&calc_points=false&key=00000000-0000-0000-0000-000000000000";
$demo = file_get_contents($urlde);
$res = json_decode($demo);
$distance = $res->paths[0]->distance;
$distancekm = round($distance/1000);
$tempstrajet = $res->paths[0]->time;
$temps = round($tempstrajet/60000); // à rajouter : if temps>60 diviser par 60
$tarif= $distancekm * 3;
$couttrajet = 3 + $tarif;
La distance estimative de cette course est de ".$distancekm." km soit ".$tarif
Pour info, la solution fonctionne depuis plusieurs années, le formulaire est sécurisé et je filtre les champs de saisie.
Comme c'est un chauffeur d'une ville moyenne, le site est moyennement fréquenté donc il ne dépasse pas les 500 requêtes.
Le script réel est plus complexe car il tient compte des différentes variations de tarif ( passage au tarif de nuit, dimanche et jours fériés, course circulaire ou à vide à la station )
J'ai aussi adapté également aux services de livraison.
Petit résumé pour débuter :
Code PHP:
$adresseun = urlencode($champ1);
$adressedeux = urlencode($champ2);
$firstplace = file_get_contents('https://nominatim.openstreetmap.org/search?q='.$adresseun.'&email=monmail%40domaine.com&format=jsonv2&extratags=1&limit=1');
$secondplace = file_get_contents('https://nominatim.openstreetmap.org/search?q='.$adressedeux.'&email=monmail%40domaine. com&format=jsonv2&extratags=1&limit=1');
$firstplace = json_decode($firstplace, true);
$depart=$firstplace[0]['lat'].','.$firstplace[0]['lon'];
$secondplace = json_decode($secondplace, true);
$arrivee=$secondplace[0]['lat'].','.$secondplace[0]['lon'];
$urlde = "https://graphhopper.com/api/1/route?point=".$depart."&point=".$arrivee."&vehicle =car&locale=fr&calc_points=false&key=00000000-0000-0000-0000-000000000000";
$demo = file_get_contents($urlde);
$res = json_decode($demo);
$distance = $res->paths[0]->distance;
$distancekm = round($distance/1000);
$tempstrajet = $res->paths[0]->time;
$temps = round($tempstrajet/60000); // à rajouter : if temps>60 diviser par 60
$tarif= $distancekm * 3;
$couttrajet = 3 + $tarif;
$message = "La distance de cette course est de ".$distancekm." km soit ".$tarif." €" ;
Vérifier que le forum n'est pas inséré des espaces...
N'hésitez pas à commenter en sachant que ce n'est pour but que le partage pour ceux qui recherchent par où commencer.
Vous pouvez également proposer vos adaptations, indiquer vos réussites ou échecs.
En espérant que cela sera utile pour futures créations de site !
Commentaire