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

Langage PHP Discussion :

Recherche dans un périmètre selon un autre périmètre


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 25
    Points : 15
    Points
    15
    Par défaut Recherche dans un périmètre selon un autre périmètre
    Bonjour à tous

    Récemment j'ai eu besoin de chercher tous les points (des lieux) proche de ma position, position qui en plus était nuancée par un périmètre. Par exemple tous les lieux dans les 5km autours de moi.

    Pour ceci aucun problème, après quelques recherches et diverses modifs j'ai eu ma fonction.

    Voici ma fonction actuelle qui marche à merveille :

    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
     
    $lat = $latMe; // Ma latitude
    $lon = $lonMe; // Ma longitude
    $rad = $distanceEvent; // La distance que je veux pour mon périmètre, par exemple 10km
     
    $R = 6371; // En rapport avec la Terre, pas tout compris mais ça marche
     
    $maxLat = $lat + rad2deg($rad/$R);
    $minLat = $lat - rad2deg($rad/$R);
    $maxlon = $lon + rad2deg(asin($rad/$R) / cos(deg2rad($lat)));
    $minlon = $lon - rad2deg(asin($rad/$R) / cos(deg2rad($lat)));
     
    $sql = "SELECT *, acos(sin(:lat)*sin(radians(lati)) + cos(:lat)*cos(radians(lati))*cos(radians(longi)-:lon)) * :R As D
    		FROM ( SELECT * FROM event WHERE lati Between :minLat And :maxLat And longi Between :minlon And :maxlon ) As FirstCut
    		WHERE acos(sin(:lat)*sin(radians(lati)) + cos(:lat)*cos(radians(lati))*cos(radians(longi)-:lon)) * :R < :rad ORDER by date";
     
    $params = [
    	'lat'    => deg2rad($lat),
    	'lon'    => deg2rad($lon),
    	'minLat' => $minLat,
    	'minlon' => $minlon,
    	'maxLat' => $maxLat,
    	'maxlon' => $maxlon,
    	'rad'    => $rad,
    	'R'      => $R,
    ];

    Aujourd'hui j'ai besoin de plus complexe et je ne trouve pas...

    J'ai besoin de trouver autours de moi, dans un périmètre donné, les personnes qui elle même ont stipulé un périmètre de "disponibilité".

    Par exemple moi je dis que je peux me déplacer de ma position et dans les 10km autours et les gens disent la même chose, donc j'ai besoin de cherche autours de moi à 10km les points disponibles eux même dans un rayon de 10km.... Oui un peu compliqué à expliquer à l'écrit.

    En gros schématiquement on aura mon cercle à moi et plein de cercles (les gens) et il faut que je trouve les gens dont le cercle passe dans le miens. (oui c'est l'explication maternelle)

    Merci par avance !

  2. #2
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    L'explication "maternelle" a l'avantage d'être claire et efficace.

    Bon par contre, ça va pas être de la tarte pour faire ce que tu veux. De ce que je comprends, ta requête calcule la distance entre ta position et la position du point P et filtre sur les points pour lesquels cette distance est inférieure à la distance max.

    Ce dont tu as besoin, c'est de trouver un point P à moins de 10 km de toi qui doit également à moins de N km de la position de l'autre personne.
    La version bourrin consisterait à calculer tous les points qui appartiennent au périmètre de quelqu'un et ensuite d'appliquer la requête que tu as actuellement sur ces points

    Sinon pour préciser : $R = 6371; // En rapport avec la Terre, pas tout compris mais ça marche, c'est le rayon de la Terre en kilomètres. Il faut se rappeler que la Terre n'étant pas plate, les distances sont calculées en arc à la surface d'une sphère de rayon $R. Pour une distance de quelques mètres, c'est négligeable, mais si tu commences à compter en kilomètres, ça peut avoir un impact.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 25
    Points : 15
    Points
    15
    Par défaut
    Salut,

    Pffiouh ton raisonnement "bourrin" est juste mais mon dieu voilà la requête T___T J'espérais que quelqu'un gérant bien les geolocations et maths appliquées saurait m'aider à trouver cette requête, je suis sûr qu'il doit y avoir moyen de faire aussi "simple" (on se comprend) que ma première requête (qui est excellente !).

    Bon moi je veux du PHP mais il y a des apps qui font ça, par exemple je précise que je suis dispo à tel point LAT/LONG avec un rayon de 10km et je cherche les gens aussi dispo, sachant qu'eux aussi mettent un rayon de disponibilité, du coup ça se fait, maintenant faut trouver en PHP et pas trop lourd... :-(

    J'allume un cierge, si quelqu'un a une idée, merci infiniment !

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    ...Voici ma fonction actuelle...
    "ma" ? J'ai comme un doute...


    1- une requête aussi "simple" consiste à chercher pour un périmètre2 donné (périmètre indiqué par l'autre).

    En effet, ça équivaut à chercher :
    • pour un périmètre valant $distanceEvent = (périmètre1 + périmètre2) : qu'on remplace dans le calcul PHP précédent
    • ET (périmètre 2 <= valeur donnée) : condition qu'on ajoute à la requête

    [EDIT] Erreur d'interprétation (cf message de Loralina plus bas)

    2- On peut envisager plusieurs requêtes, en faisant varier périmètre 2, pour afficher les résultats pour les personnes ayant indiqué comme périmètre : 0, 5km, 10km, 20km...

    3- Par contre, si on veut trouver TOUS les résultats en une seule requête, et pour toutes les valeurs possibles de périmètre2, il va falloir passer TOUS les calculs DANS la requête, avec "périmètre2" en paramètre "variable"...
    Bon courage... (perso, je ne me risque pas à chercher...)
    Dernière modification par Invité ; 18/04/2018 à 10h21.

  5. #5
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Je dois avouer que ça dépasse également mes compétences. Si tu veux faire l'essentiel du travail dans la requête, ça vaudrait peut-être le coup de transférer le thread à nos collègues du forum BDD.
    Juste pour savoir, tu utilises quel SGDB ? Sous Oracle, on peut faire des trucs de malade en utilisant les clauses WITH.

    @Jreaux : Bah si "sa" fonction, la fonction qu'il utilise quoi (il n'a pas dit qu'il l'avait écrit tout seul, sans aide et les mains dans le dos non plus il a même dit "recherches" et "modifications")
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  6. #6
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 25
    Points : 15
    Points
    15
    Par défaut
    Merci des réponses ! Je n'ai rien compris sur le "ma" oui j'utilise ce pronom car c'est la fonction actuelle que j'utilise et que j'ai trouvé sur internet :-) Je n'ai pas déposé d'enveloppe Soleau ni de Copyright sur celle-ci ! Le feu part vite ici !

    Alors pour le SGBD avec Oracle et compagnie ça va être délicat je suis assez "newbie", j'ai mon petit code PHP dans un coin et dans l'autre dans le mysql fourni par mon hébergeur avec mon petit phpmyadmin Jusqu'ici je n'ai jamais eu besoin de fonctions complexes ou alors je m'en suis toujours sorti. Mais là c'est vrai que ça devient la cata, j'ai planché dessus toute la journée c'est bien prise de tête.

    J'ai tenté de modifié la requête actuelle en faisant une jonction et diverses tentatives avec des maths trouvées à droite et à gauche mais rien ne marche...

    Je reviendrai tous les jours ici au cas où et sinon je continue mon investigation dans mon coin ! Merci de l'attention. Je retiens le point n°1 @Jreaux comme piste.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Explication :
    Le "ma" a son importance, car si tu avais effectivement écrit le code toi-même, ça aurait voulu dire que tu le maîtrisais, et le comprenais.
    Du coup, il aurait été beaucoup plus facile de se comprendre, et de le reprendre ensuite pour le modifier !

    Mais là, tu confirmes qu'il n'est pas de toi, et ce ne sont pas nos "explications" qui t'aideront, mais le fait qu'on écrive ces modifications pour toi.

    Ça change la donne...

    Et en l'occurrence, le problème posé est loin d'être trivial, et la solution, pour reprendre l'expression de Celira, ne s'écrit pas "les mains dans le dos"...
    Dernière modification par Invité ; 18/04/2018 à 10h22.

  8. #8
    Membre éclairé
    Femme Profil pro
    Autre
    Inscrit en
    Janvier 2017
    Messages
    335
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Janvier 2017
    Messages : 335
    Points : 715
    Points
    715
    Par défaut
    Bonjour,
    Citation Envoyé par Celira Voir le message
    Ce dont tu as besoin, c'est de trouver un point P à moins de 10 km de toi qui doit également à moins de N km de la position de l'autre personne.
    La version bourrin consisterait à calculer tous les points qui appartiennent au périmètre de quelqu'un et ensuite d'appliquer la requête que tu as actuellement sur ces points
    Citation Envoyé par silency Voir le message
    Pffiouh ton raisonnement "bourrin" est juste
    Cela ne correspond pourtant pas vraiment à ceci :
    Citation Envoyé par silency Voir le message
    En gros schématiquement on aura mon cercle à moi et plein de cercles (les gens) et il faut que je trouve les gens dont le cercle passe dans le miens.
    mais peut-être plutôt à ceci :
    Citation Envoyé par silency Voir le message
    Par exemple moi je dis que je peux me déplacer de ma position et dans les 10km autours et les gens disent la même chose, donc j'ai besoin de cherche autours de moi à 10km les points disponibles eux même dans un rayon de 10km....
    en supposant que la fin de la phrase aurait pu être "des autres personnes".

    S'agit-il de déterminer les points étant dans la surface d'intersection de votre cercle avec les cercles des autres personnes, ou de trouver les personnes, donc les centres des cercles ?

    Si l'interprétation de Celira est valide, alors, si on considère qu'il y a deux autres personnes par exemple, la condition pourrait être dans ce style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    distance(maLatitude,maLongitude,latitudeChampTable,longitureChampTable,rayonTerre) < monRayonDeDisponibilite
    AND
    (
    distance(latitudeAutre1,longitudeAutre1,latitudeChampTable,longitureChampTable,rayonTerre) < rayonDeDisponibiliteAutre1
    OR
    distance(latitudeAutre2,longitudeAutre2,latitudeChampTable,longitureChampTable,rayonTerre) < rayonDeDisponibiliteAutre2
    )
    distance(...) étant à remplacer par votre formule de calcul.
    J'ai mis OR, mais cela peut être remplacé par AND selon vos besoins.

    Si les données des personnes (longitude, latitude et rayon de disponibilité) proviennent d'une table "personnes", essayez ceci (sans dire que c'est optimisé, ni même correct, et sachant que c'est toujours dans la logique du OR) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT DISTINCT alias.latitude,alias.longitude
    FROM (SELECT latitude,longitude FROM event WHERE distance(maLatitude,maLongitude,latitude,longitude,rayonTerre) < monRayonDeDisponibilite) as alias,personnes
    WHERE distance(alias.latitude,alias.longitude,personnes.latitude,personnes.longitude,rayonTerre) < personnes.rayonDeDisponibilite
    Il reste à mettre les bons noms, les formules de calcul que vous avez déjà, le "FirstCut" etc.

    S'il s'agit plutôt de trouver des personnes, cela devrait être encore plus simple, tout dépend d'où viennent leurs données.

  9. #9
    Invité
    Invité(e)
    Par défaut
    S'agit-il de déterminer les points étant dans la surface d'intersection de votre cercle avec les cercles des autres personnes, ou de trouver les personnes, donc les centres des cercles ?
    @Loralina
    Je pense que tu as raison : c'est la 2ème option ("trouver les personnes, donc les centres des cercles"), et ça remet en cause ma théorie. (pour le coup, c'est bien ma théorie )
    Ton raisonnement est plus logique : c'est la distance entre les deux points (personnes, lieux, positions,...) qui compte.
    Le mien était faux (ou du moins, faussé, car je prenais la 1ère option, et faisais le cumul des distances).

    Si j'ai bien tout compris, on peut résumer :

    Je cherche...
    1. D'UNE PART : les personnes qui sont dans un rayon de XX km autour de MOI = ELLES sont dans un cercle de XX km autour de MOI
    2. D'AUTRE PART : les personnes pour lesquels JE suis dans un rayon de YY km autour d'ELLE(S) = JE suis dans un cercle de YY km autour d'ELLE(S)


    • Si (YY <= XX), alors ce seront les même : elles sont déjà dans "mon" cercle".
    • Par contre, si (YY > XX), ce sont des personnes EN DEHORS de MON propre cercle.

    Ce qui compte donc ici, c'est MAX(XX,YY), avec en contrainte que YY est la distance définie par l'"autre".
    YY est une inconnue (contrairement à XX).
    Dernière modification par Invité ; 18/04/2018 à 10h30.

  10. #10
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    l'intersection de 2 disques c'est par ici et par
    Après, il faut y rajouter la topologie pour tenir compte de la notion planète Terre.
    En gros tu dois calculer l'aire de points acceptables autour d'un profil et sélectionner les profils qui intercepteraient cette aire.
    Good luck

  11. #11
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    @Loralina : effectivement, ton interprétation est valable. Du coup, ça simplifie le problème : on peut reprendre la formule actuelle pour calculer la distance entre ma position et la position de l'autre personne et modifier la condition actuelle qui est "cette distance est inférieur à N" en "cette distance est inférieure à N et à L", N mon rayon de périmètre et L le rayon du périmètre de l'autre personne (N et L n'étant pas forcément égaux)
    Mais c'est à silency de nous dire quelle est la bonne interprétation
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  12. #12
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 25
    Points : 15
    Points
    15
    Par défaut
    Merci de toutes ces pistes, en fait pour faire simple il faut oublier le mot événement et lieu qui sont surtout liés à mon premier projet et ma première fonction, qui marche actuellement.

    Là pour ce second projet je parle uniquement de deux personnes qui souhaitent voir si elles sont "à portée" selon leur deux périmètres de disponibilité.

    Je vais tester toute la journée les codes de @Loralina , pour les liens de @rawsrc j'avoue que mes maths qui remontent à il y a 20 ans ne m'aideront pas à digérer ces formules

    J'ai aussi mes propres pistes même si ça fait souvent planter PHP pour l'instant ! Je reviens vers vous si j'ai du nouveau et sinon pour lire les nouveaux commentaires.

    Merci !

  13. #13
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Fait juste attention, la topologie terrestre fait que tu ne peux pas raisonner en terme de lignes droites.
    J'ai eu à travailler sur un projet de ligne maritime et pensait m'en sortir par simple interpolation de points en 2 d, ben j'ai vite déchanté, je faisais des ploufs assez éloignés des relevés topologiques réels.
    Bon, les distances n'étaient pas les mêmes aussi
    En tout cas j'ai dû me cogner à coder les formules de math, j'en ai encore mal aux cheveux.
    Sur des distances de l'ordre de 10 km, la 2d devrait être acceptable.

  14. #14
    Invité
    Invité(e)
    Par défaut
    Yop.

    Si tu jettes un œil aux (savants) calculs, ils intègrent bien le rayon de la Terre.

    En 2D, le théorème de Pythagore suffirait.


    N.B. Si on veut pinailler, il faudrait aussi prendre en compte :
    • L'altitude
    • Les obstacles (rivière = détour)
    • Les grèves de transport !
    • ...

  15. #15
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 25
    Points : 15
    Points
    15
    Par défaut
    La distance max est de 50km j'espère que ça ira du coup !

  16. #16
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 25
    Points : 15
    Points
    15
    Par défaut
    Bon j'ai une piste mais je n'arrive pas à la concrétiser en fonction (légère) :

    - Moi user 1 j'ai ma position et mon rayon de dispo
    - Les autres user X ont leur position et leur rayon de dispo

    On sait que lorsque l'on défini son rayon de dispo il y a un max (50km), donc dans la logique on pourrait reprendre ma première fonction mais mon rayon deviendrait : mon rayon + le rayon maximum de l'appli.

    Du coup dans ce nouveau rayon on sélectionne tous les users dont les positions sont dedans et après on vérifie que nos distances sont corrects par rapport à nos rayons personnels.

    Je ne sais pas si je suis clair ? Bon maintenant reste à réussir à pondre ça en fonction... T_T

  17. #17
    Invité
    Invité(e)
    Par défaut
    Non. Tu fais fausse route.

    1- ta 1ere requête est correcte.

    2- il faut réaliser une 2eme requête pour les autres.
    La différence est que leur "rayon d'action" est un paramètre, une inconnue.
    La méthode de calcul est la même.

    3- à ta place, j'oublierais tout ça !
    Exit les "calculs savants" !
    À 50km maxi, on peut très bien se contenter d'un calcul 2D :
    • C'est la distance, en ligne droite, entre les deux points qui sera prise en compte.

    La requête se simplifie en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE (distance entre ma_position et user_position) <= MAX ( mon_rayon , user_rayon)
    théorème de Pythagore
    Dernière modification par Invité ; 20/04/2018 à 12h07.

  18. #18
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 25
    Points : 15
    Points
    15
    Par défaut
    Je ne suis pas sûr car tu dis que notre distance entre nous deux doit être inférieure ou égale à l'un des deux rayons, mais admettons qu'on a 40km entre nous, que moi je peux bouger à 10 et lui a 20, avec ta requête actuelle (ton point 3) ça veut dire qu'on "nous" sélectionne comme étant un bon résultat alors que non : 10 + 20 ça fait 30, on a 10km d'écart pour pouvoir se joindre (vu qu'on a 40 d'écart entre nous). Ton idée est fausse du coup.

    Je pense partir sur une recherche d'un rayon de : mon rayon + rayon max de l'appli.

    Ensuite sur tous les users que je trouve, je vérifie que mon rayon + son rayon est supérieur à la distance qui nous sépare que ça voudra forcément dire que nos rayons se chevauchent et que donc on peut se rejoindre !

    Ca me paraît top (je viens de le pondre sur papier à l'instant). J'ai plus qu'à coder ! Je vous tiens au courant.

  19. #19
    Invité
    Invité(e)
    Par défaut
    Ton raisonnement est totalement faux.
    Depuis quand 40 est inférieur à 30 ??

    Par contre, apparemment, on ne parle pas de la même chose.

    Quelle est la contrainte précisément ?
    Que la distance soit inférieure :
    1. Au rayon maximum entre les 2 points ? (C'est ce que j'ai proposé)
    2. À la somme des 2 rayons ?

    Dans le 2eme cas c'est à peu près pareil... On remplace "maximum" par "somme des 2".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE (distance entre ma_position et user_position) <= ( mon_rayon + user_rayon)
    C'est de la géométrie, niveau 6ème...

    Reprends ton papier... et un compas !
    Dernière modification par Invité ; 20/04/2018 à 12h15.

  20. #20
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 25
    Points : 15
    Points
    15
    Par défaut
    Calmos Ramos ! Je n'ai jamais dis que c'était inférieur, je ne suis pas idiot, c'est juste que quand tu as écris <= MAX( mon_rayon , user_rayon) j'ai cru que tu voulais dire "<= MAX(soit mon rayon, soit le rayon de l'user)", car je ne connaissais pas l'indicateur MAX et du coup la "virgule" qui est dedans je pensais que c'était un moyen de me dire "teste voir l'un ou l'autre.

    Mais du coup maintenant que j'ai compris, tu avais juste. C'est juste un peu lourd par contre d'ajouter le rayon user dans la requete, pour chaque user, à moins de pondre, j'imagine, une jonction (ce pourquoi je suis un gros noob).

    Mais la formule que je viens de trouver marche impec, ainsi que le raisonnement du coup, on a réussi Je la mets au propre et je la publierai ici pour ceux qui un jour auront le même soucis ! Ca sera sûrement un poil plus lourd qu'avec une jonction mais c'est déjà ça !

    La contrainte était simple : je suis à un point donné (long/lat), je suis dispo sur 5km (par exemple. 50km étant le max). Je cherche les gens autours de moi, sachant que eux-même peuvent spécifier un rayon de disponibilité, du coup ce n'est pas parce que leur point (long/lat) n'est pas dans mon rayon (5km) qu'ils ne sont pas dispos, car ils peuvent très bien être hors de mon rayon (leur point) mais avoir un rayon suffisamment large pour être quand même à portée.


    Cela rejoint ma phrase "maternelle" de mon premier post : [...]on aura mon cercle à moi et plein de cercles (les gens) et il faut que je trouve les gens dont le cercle passe dans le miens[...].

    J'ai testé pendant une heure plusieurs cas, plusieurs users, plusieurs rayons, tout marche à merveille.

    Avant de poster la fonction dans la journée ou ce week end, je résume la trouvaille : je cherche tout simplement les users autours de moi dans un rayon qui est "mon rayon + rayon max de l'appli (50)", et ensuite j'additionne mon rayon à celui des users trouvés, si le résultat est supérieur à la distance qui sépare nos deux points c'est que nous sommes forcément "accessible" (la zone verte de mon schéma).

    Du coup tant que j'en parle, voici le schéma qui résume tout !

    Merci de vos commentaires et aide ! A plus.

    Nom : BGczK.jpg
Affichages : 114
Taille : 126,5 Ko

Discussions similaires

  1. Réponses: 3
    Dernier message: 19/03/2018, 13h45
  2. Recherche dans une table selon critères
    Par Senkai dans le forum Langage SQL
    Réponses: 2
    Dernier message: 04/05/2015, 05h32
  3. Réponses: 0
    Dernier message: 30/03/2010, 21h07
  4. rechercher dans sous formulaire selon 1 critère
    Par cilcemax dans le forum IHM
    Réponses: 2
    Dernier message: 05/02/2008, 19h05

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