IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

WinDev Discussion :

module "autour de moi" [WD18]


Sujet :

WinDev

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations forums :
    Inscription : Octobre 2012
    Messages : 12
    Points : 9
    Points
    9
    Par défaut module "autour de moi"
    Bonjour,

    Je développe une application de gestion des clients et prospects sous Windev 18. J'ai une base de données Hyperfile. Tous mes clients ou prospects (que j'ai synthétisés en "Contacts") possèdent une adresse, un code postal, et une ville (entre autres bien entendu).

    Je ne suis pas très expérimenté en développement, aussi l'idée que j'ai en tête me parait très difficile à réalisée.

    Je voudrais qu'un commercial se connectant à mon application puisse partir en tournée de façon organisée.
    S'il décide de partir voir un Client A, il doit pouvoir avoir la liste des Contacts se trouvant dans un rayon donné.
    Ainsi, j'aimerais pouvoir implémenter une fonction qui calculerait la distance entre deux adresses. Cette fonction s'appliquerait à tout mon fichier Contacts, ce qui me permettrait donc au final de retourner la liste des Contacts se situant à moins de tant ou tant de kilomètres.

    Mais c'est ce calcul de distance qui me pose problème: je sais qu'il est possible d'exploiter l'URL d'un itinéraire Google maps pour tracer la route à suivre entre deux adresses ou plus, mais la distance à parcourir (ce qui m’intéresse) n'est pas exploitable.
    C'est d'ailleurs cette URL que j'ai prévu de donner à un champ HTML, une fois que j'aurais réussi à isoler les Contacts proche d'une adresse donnée.

    Il existe peut-être des méthodes simples que je ne connais pas ? Peut-être est-il possible, à partir d'une adresse donnée, d'obtenir sa localisation en longitude/latitude, puis de faire des calculs de distance à partir de ces coordonnées ?

    Je patauge un peu ... Si quelqu'un à des idées à me soumettre, je suis preneur.

    Cordialement,

    Ludovic Marquet

  2. #2
    Membre chevronné Avatar de laurent30s
    Homme Profil pro
    Inscrit en
    Novembre 2007
    Messages
    881
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 881
    Points : 1 771
    Points
    1 771
    Par défaut
    Tout d'abord une procédure qui permet récupérer les coordonnées latitude/longitude d'une adresse

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    PROCEDURE Geocode_Adresse(sAdresse,xLat=0,xLng=0)
     
    Res est un booléen
     
    // L'adresse doit être sans accents et des "+" doivent remplacer les " "
    sAdresse = SansAccent(sAdresse)
    sAdresse = Remplace(sAdresse," ","+")
     
    sURL est une chaîne = "http://maps.googleapis.com/maps/api/geocode/xml?language=fr&address="+sAdresse+"&sensor=false"
     
    // Lance la requête
    SI PAS HTTPRequête(sURL) ALORS
    	xLat = 0
    	xLng = 0
    	Erreur(ErreurInfo())
    	RETOUR
    FIN
    // Récupère le résultat de la requête
    sXML est une chaîne = HTTPDonneRésultat(httpRésultat)
     
    // Crée un document XML
    Res = XMLDocument("Geocode_XML", sXML)
    SI ErreurDétectée ALORS
    	xLat = 0
    	xLng = 0
    	Erreur(ErreurInfo())
    	RETOUR
    FIN
     
    // Positionne sur la balise racine du document XML 
    XMLRacine("Geocode_XML")
     
    // Recherche le statut si pas OK retour
    XMLExécuteXPath("Geocode_XML","/GeocodeResponse/status")
    SI XMLEnDehors("Geocode_XML")  ALORS
    	xLat = 0
    	xLng = 0
    	Info("La balise <status> n'a pas été trouvé.")
    	RETOUR
    FIN
    SI Majuscule(XMLDonnée("Geocode_XML"))<>"OK" ALORS 
    	xLat = 0
    	xLng = 0
    	Info("La balise <status> n'est pas OK" + RC + "Valeur retournée : " + XMLDonnée("Geocode_XML"))
    	RETOUR
    FIN
     
    // recherche la latitude
    XMLExécuteXPath("Geocode_XML","/GeocodeResponse/result/geometry/location/lat")
    SI XMLEnDehors("Geocode_XML") ALORS
    	xLat = 0
    SINON
    	xLat = Val(XMLDonnée("Geocode_XML"))
    FIN
     
    // Recherche la longitude
    XMLExécuteXPath("Geocode_XML","/GeocodeResponse/result/geometry/location/lng")
    SI XMLEnDehors("Geocode_XML") ALORS
    	xLng = 0
    SINON
    	xLng = Val(XMLDonnée("Geocode_XML"))
    FIN
     
    // Ferme le document XML
    XMLTermine("Geocode_XML")
    ensuite une procédure qui permet de récupérer la distance et la durée entre 2 couples latitude/longitude (2 adresses)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    PROCEDURE Calcul_distance_google(xLat1=0,xLng1=0,xLat2=0,xLng2=0,nDistance=0,nDuree=0)
     
    Multitâche(-25)
    duDuree est une Durée
    Res est un booléen
     
    XMLTermine("DistXML")
     
    sURL est une chaîne = "http://maps.google.com/maps/api/directions/xml?language=fr&origin="+Remplace(xLat1,",",".")+","+Remplace(xLng1,",",".")+"&destination="+Remplace(xLat2,",",".")+","+Remplace(xLng2,",",".")+"&sensor=false"
    SI PAS HTTPRequête(sURL) ALORS
    	RENVOYER "0;0"
    FIN
    sXML est une chaîne = HTTPDonneRésultat(httpRésultat)
     
    Res = XmlDocument("DistXML", sXML)
    SI ErreurDétectée ALORS
    	RENVOYER "0;0"
    FIN
    XMLRacine("DistXML")
     
    XMLExécuteXPath("DistXML","/DirectionsResponse/status")
    SI XMLEnDehors("DistXML") ALORS RENVOYER "0;0"
    SI Majuscule(XMLDonnée("DistXML"))<>"OK" ALORS RENVOYER "0;0"
     
    XMLExécuteXPath("DistXML","/DirectionsResponse/route/leg/distance/value")
    SI XMLEnDehors("DistXML") ALORS nDistance=0
    nDistance=Arrondi(Val(XMLDonnée("DistXML"))/1000,0)					// en km
     
    XMLExécuteXPath("DistXML","/DirectionsResponse/route/leg/duration/value")
    SI XMLEnDehors("DistXML") ALORS duDuree..Seconde=0
    duDuree..Seconde=XMLDonnée("DistXML")
    nDuree    = Arrondi(duDuree..EnMinutes,0)						// en minute
     
    XMLTermine("DistXML")
    Voila avec ça tu devrais pouvoir te débrouiller
    Bon dev
    Laurent

    - C’est génial.
    - Non c’est bizarre.
    - Justement quand c’est simple y’a des milliers de réponses et quand c’est bizarre y’en a aucune.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations forums :
    Inscription : Octobre 2012
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    Bonjour,

    Merci pour cette réponse !

    J'ai essayé d'exploiter tout d'abord la première procédure, celle qui retourne la latitude et la longitude pour une adresse donnée. J'ai ouvert le document XML dans un navigateur, et je remarque bien les valeurs des balises <lat> et <lng>.

    Seulement, au niveau des prises de valeur dans le code que vous m'avez donné, les variables xLat et xLng prennent toutes deux la valeur "Vrai"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
    PROCEDURE Geocode_Adresse(sAdresse,xLat,xLng)
     
    tabResultats est un tableau de réels
    Res est un booléen
     
    // L'adresse doit être sans accents et des "+" doivent remplacer les " "
    sAdresse = SansAccent(sAdresse)
    sAdresse = Remplace(sAdresse," ","+")
     
    sURL est une chaîne = "http://maps.googleapis.com/maps/api/geocode/xml?language=fr&address="+sAdresse+"&sensor=false"
    LanceAppliAssociée(sURL)
    // Lance la requête
    SI PAS HTTPRequête(sURL) ALORS
    	xLat = 0
    	xLng = 0
    	Erreur(ErreurInfo())
     
    FIN
    // Récupère le résultat de la requête
    sXML est une chaîne = HTTPDonneRésultat(httpRésultat)
     
    // Crée un document XML
    Res = XMLDocument("Geocode_XML", sXML)
    SI ErreurDétectée ALORS
    	xLat = 0
    	xLng = 0
    	Erreur(ErreurInfo())
     
    FIN
     
    // Positionne sur la balise racine du document XML 
    XMLRacine("Geocode_XML")
     
    // Recherche le statut si pas OK retour
    XMLExécuteXPath("Geocode_XML","/GeocodeResponse/status")
    SI XMLEnDehors("Geocode_XML")  ALORS
    	xLat = 0
    	xLng = 0
    	Info("La balise <status> n'a pas été trouvé.")
     
    FIN
    SI Majuscule(XMLDonnée("Geocode_XML"))<>"OK" ALORS 
    	xLat = 0
    	xLng = 0
    	Info("La balise <status> n'est pas OK" + RC + "Valeur retournée : " + XMLDonnée("Geocode_XML"))
     
    FIN
     
    // recherche la latitude
    XMLExécuteXPath("Geocode_XML","/GeocodeResponse/result/geometry/location/lat")
    SI XMLEnDehors("Geocode_XML") ALORS
    	xLat = 0
    SINON
    	xLat = XMLDonnée("Geocode_XML")
            //xLat = Vrai
    	TableauAjoute(tabResultats,xLat)
    FIN
     
    // Recherche la longitude
    XMLExécuteXPath("Geocode_XML","/GeocodeResponse/result/geometry/location/lng")
    SI XMLEnDehors("Geocode_XML") ALORS
    	xLng = 0
    SINON
    	xLng = XMLDonnée("Geocode_XML")
            //xLng = Vrai
    	TableauAjoute(tabResultats,xLng)
    FIN
     
    // Ferme le document XML
    XMLTermine("Geocode_XML")
     
    RENVOYER tabResultats
    Comment faire pour récuperer les valeurs qui sont dans les balises ?

    Cordialement




    Edit: la deuxième procédure marche à merveille

  4. #4
    Membre confirmé Avatar de Nhaps
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    350
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2011
    Messages : 350
    Points : 603
    Points
    603
    Par défaut
    Juste une idée, si les données sont dans une BDD, as tu essayé de faire des requêtes SQL spatiales ?

    Il te faut quand même la latitude, longitude.
    Windev 23 - SQL SERVER - PHP
    Play : TFT - Jeux indé

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations forums :
    Inscription : Octobre 2012
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    C'est vrai qu'a mon avis, faire l’exécution de ces deux procédures à chaque fois serait diablement long, je pense que j'enregistrerai les latitudes/longitudes dans ma BDD ! Cependant je ne sais pas si Hyperfile supporte les requêtes spatiales et pour tout vous dire, je suis tout à fait novice à ce sujet. Mais je vais quand même lire quelques lignes à propos de ces requêtes spatiales, ça peut-être utile pour un autre projet.

    Ma priorité pour l'instant est de comprendre pourquoi je n'arrive pas à récupérer la latitude et la longitude d'une adresse avec la méthode que laurent30s m'a transmise. Le document XML est bien formé, tout semble correct, mais le résultat retourné (Vrai) n'est pas logique et ne m'est d'aucune utilité...

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations forums :
    Inscription : Octobre 2012
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    Problème résolu: je passais des paramètres vides qui étaient à "Vrai" dès la première ligne du traitement de la procédure. Je les ai initialisés à 0, tout marche !

    Merci beaucoup pour vous réponses.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Obligation double-quote autour des noms de champs ?
    Par itokia dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 04/03/2013, 07h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo