Estimer le coût d'un trajet de TAXI/VTC ( gratuitement et sous Joomla ! )

Réduire
X
 
  • Filtrer
  • Heure
  • Afficher
Tout effacer
nouveaux messages

  • [Partage] Estimer le coût d'un trajet de TAXI/VTC ( gratuitement et sous Joomla ! )

    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 :

    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'); 
    Ensuite on décode le json :

    Code PHP:

    $firstplace 
    json_decode($firstplacetrue);
    $depart=$firstplace[0]['lat'].','.$firstplace[0]['lon'];
    $secondplace json_decode($secondplacetrue);
    $arrivee=$secondplace[0]['lat'].','.$secondplace[0]['lon']; 
    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 :

    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 $tarif
    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 :

    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($firstplacetrue);
    $depart=$firstplace[0]['lat'].','.$firstplace[0]['lon'];
    $secondplace json_decode($secondplacetrue);
    $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 $tarif;
    $message "La distance de cette course est de ".$distancekm." km soit ".$tarif." €" 
    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 !





    Dernière édition par daneel à 06/04/2024, 07h07
    schlem et woluweb aiment ceci.
    Joomla User Group (JUG) Lille : https://www.facebook.com/groups/JUGLille/

  • #2

    Un autre exemple d'affichage du tarif de trajet mais sans geocodage, uniquement avec un tableau.

    En réponse à une question posée sur FB :
    Bonjour à tous, Je dois créer un formulaire de réservation pour un taxi. Ce formulaire doit pouvoir donner les tarifs en fonction des villes de départ et d'arrivée et du nombre de passagers....


    Voici la réponse.

    En utilisant la version gratuite de Convertform.

    - Définir le formulaire avec les trois champs et un bouton d'envoi :


    Définir en liste déroulante en choisissant respectivement les noms :
    ville_depart pour ville de départ
    ville_arrivee pour ville arrivée
    nb_passagers pour nombre de passagers



    En valeurs de ville de départ, j'ai choisi Paris et Lyon
    et en ville d'arrivée, j'ai choisi Marseille et Nice
    En nombre de passagers, j'ai proposé 1 jusqu'à 8

    J'ai fait un tableau pour indiquer le coût de Paris > Marseille, Paris > Nice puis Lyon > Marseille et Lyon > Nice

    je l'ai indiqué sous forme php :

    Code PHP:
    $tarifs = array(
    "Paris" => array(
    "Marseille" => 100,
    "Nice" => 120
    // Ajoutez les autres tarifs ici
    ),
    "Lyon" => array(
    "Marseille" => 80,
    "Nice" => 90
    // Ajoutez les autres tarifs ici
    )
    // Ajoutez les tarifs pour les autres villes de départ ici
    );​ 
    Dans l'onglet comportement, j'ai inséré le code suivant qui reprend le tableau, effectue le calcul et remplace le message après soumission.
    A coller dans "Après soumission du formulaire"

    Code PHP:

    $tarifs 
    = array(
    "Paris" => array(
    "Marseille" => 100,
    "Nice" => 120
    ),
    "Lyon" => array(
    "Marseille" => 80,
    "Nice" => 90
    )
    );

    $ville_depart $submission->params['ville_depart'];
    $ville_arrivee $submission->params['ville_arrivee'];
    $nb_passagers $submission->params['nb_passagers'];

    if (isset(
    $tarifs[$ville_depart]) && isset($tarifs[$ville_depart][$ville_arrivee]) && $nb_passagers 0) {
    $tarif_total $tarifs[$ville_depart][$ville_arrivee] * $nb_passagers;
    $message ="Le tarif pour votre trajet de $ville_depart à $ville_arrivee pour $nb_passagers passagers est de $tarif_total euros.";
    } else {
    $message $ville_depart."Veuillez sélectionner des valeurs valides.";
    }
    $submission->form->successmsg $message;​ 


    Résultat après intégration du formulaire dans l'article et soumission



    Le formulaire est personnalisable.

    Joomla User Group (JUG) Lille : https://www.facebook.com/groups/JUGLille/

    Commentaire


    • #3
      Envoyé par daneel Voir le message
      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.
      Bonjour

      Je trouve l'initiative remarquable d'autant plus qu'il y a quelques semaines j'avais publié un post sur la recherche d'un composant qui répondrait au contour fonctionnel de solutions comme :
      • Taxi Booking for Joomla 4 à 79 € + 250 € d'intégration du module de paiement par CB soit ~ 330 €
      • Click Chauffeur à 39.50 € HT / mois
      Pour l'instant le VTC qui a commandé ce site est en cours de réflexion et va se positionner rapidement.

      Aussi, je souhaiterais savoir :
      • à quelle date comptez vous publier votre future extension ?
      • à quel prix ?
      • avec ou sans méthode de paiement par CB ?
      Merci d'avance
      Merci

      Cordialement

      Commentaire


      • #4
        Merci, mais ce n'était pas le but, le composant était réalisé sur-mesure.

        L'idée de ce partage, c'est bien de comprendre que l'on peut faire cela sous Joomla sans dépenser un centime avec quelques lignes de code avec l'aide d'API autre que Google. Cependant je ferai une version communautaire de l'extension que je publierai avant la fin du mois (donc gratuit).

        Après si la demande est forte, c'est bien possible d'avoir une alternative au extensions existantes avec des fonctionnalités avancées, utilisant des serveurs privés en France (avec conformité et respect de politique de confidentialité). Mais je ne pourrai pas répondre dans l'immédiat en étant déjà engagé sur d'autres projets.

        woluweb aime ceci.
        Joomla User Group (JUG) Lille : https://www.facebook.com/groups/JUGLille/

        Commentaire


        • #5
          Ok, je veux bien tester la version communautaire dès qu'elle sera publiée.
          Merci
          Merci

          Cordialement

          Commentaire


          • #6
            Salut daneel,
            Je trouve ce partage super cool, ca donne une vraie voie sur les méthodes de conception
            woluweb aime ceci.

            Commentaire

            Annonce

            Réduire
            Aucune annonce pour le moment.

            Partenaire de l'association

            Réduire

            Hébergeur Web PlanetHoster
            Travaille ...
            X