Faire un systeme de recherche kilométrique

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Faire un systeme de recherche kilométrique

Re: Faire un systeme de recherche kilométrique

par Spols » 22 janv. 2016, 09:15

essaye en enlevant les quote de cette ligne
$formule = (6366*acos(cos(radians($latitude))*cos(radians($latitude2))*cos(radians($longitude2) -radians($longitude2))+sin(radians($latitude))*sin(radians($latitude2))));
Il te faut la valeur, pas l'expression du calcul

Re: Faire un systeme de recherche kilométrique

par yoann38 » 21 janv. 2016, 20:21

Salut !
Donc ui certe c'est plus cout et plus lisible cependant le problème est le même ca selectionne toutes les villes et pas en fonction de $distance.
$distance = 20;
  // On récupère les coordonnées de la ville selectionnée
  $req = "SELECT ville_nom_simple, ville_latitude_deg, ville_longitude_deg FROM villes_france_free WHERE ville_nom_simple = '".amiens."'";
  $resultat = mysql_query($req) or die(mysql_error());
  $row = mysql_fetch_array($resultat);
   
  $latitude  = $row['ville_latitude_deg'];
  $longitude = $row['ville_longitude_deg'];
  
  echo  $latitude.'<br>';
  echo  $longitude.'<br>';
   
  // On récupère les coordonnés de toutes les villes pour calculer la distance
  $req = "SELECT ville_nom_simple, ville_longitude_deg, ville_latitude_deg FROM villes_france_free";
  $resultat = mysql_query($req) or die(mysql_error());
  while ($row = mysql_fetch_array($resultat)) {
   
  $latitude2 = $row['ville_latitude_deg'];
  $longitude2 = $row['ville_longitude_deg'];
   
  $formule = "(6366*acos(cos(radians($latitude))*cos(radians($latitude2))*cos(radians($longitude2) -radians($longitude2))+sin(radians($latitude))*sin(radians($latitude2))))";
  // echo $req;
    if ($formule < $distance)  { // affiche la ville qui se trouve à moins de $distance km
        echo $row['ville_nom_simple'].'<br>';
    }

}

Je ne sais plus quoi faire pour le coup la.

J'ai juste rajouter un echo que j'ai mis en commentaire pour voir la req et du coup ca nous fait une série de :
SELECT ville_nom_simple, ville_longitude_deg, ville_latitude_deg FROM villes_france_freeozan
SELECT ville_nom_simple, ville_longitude_deg, ville_latitude_deg FROM villes_france_freecormoranche sur saone
SELECT ville_nom_simple, ville_longitude_deg, ville_latitude_deg FROM villes_france_freeplagne
SELECT ville_nom_simple, ville_longitude_deg, ville_latitude_deg FROM villes_france_freetossiat
// ..... ca continue ...

Re: Faire un systeme de recherche kilométrique

par Ascla » 20 janv. 2016, 23:31

Ah mais non, la condition ne doit pas se faire dans le close WHERE !
Ton code actuel prend en compte chaque ville et récupère la distance entre ces villes et ta ville initiale.
Pour chacune de ses villes, il faudra alors vérifier si chacune d'entre elle a bien une distance inférieure à 50km, et ceci avec une condition PHP !
Voilà ce que ça devrait donner :
$distance = 50;
  // On récupère les coordonnées de la ville selectionnée
  $req = "SELECT ville_slug, ville_latitude_deg, ville_longitude_deg FROM villes_france_free WHERE ville_slug = '". ozan."'";
  $resultat = mysql_query($req) or die(mysql_error());
  $row = mysql_fetch_array($resultat);
   
  $latitude  = $row['ville_latitude_deg'];
  $longitude = $row['ville_longitude_deg'];
   
  // On récupère les coordonnés de toutes les villes pour calculer la distance
  $req = "SELECT ville_slug, ville_longitude_deg, ville_latitude_deg FROM villes_france_free";
  $resultat = mysql_query($req) or die(mysql_error());
  while ($row = mysql_fetch_array($resultat)) {
   
  $latitude2 = $row['ville_latitude_deg'];
  $longitude2 = $row['ville_longitude_deg'];
   
  $formule = "(6366*acos(cos(radians($latitude))*cos(radians($latitude2))*cos(radians($longitude2) -radians($longitude2))+sin(radians($latitude))*sin(radians($latitude2))))";

    if ($formule < $distance)  { // affiche la ville qui se trouve à moins de $distance km
        echo $row['ville_slug'].'<br>';
    }

}
Ta 3eme requête était complètement inutile. Essaye de repasser ligne par ligne pour comprendre le fonctionnement de ce script.

Re: Faire un systeme de recherche kilométrique

par yoann38 » 20 janv. 2016, 21:12

Pour le coup j'ai toujours toutes les villes.
Je n'ai pas les yeux en face des trous ?
$distance = 50;
	// On récupère les coordonnées de la ville selectionnée
	$req = "SELECT ville_slug, ville_latitude_deg, ville_longitude_deg FROM villes_france_free WHERE ville_slug = '". ozan."'";
	$resultat = mysql_query($req) or die(mysql_error());
	$row = mysql_fetch_array($resultat);
	 
	$latitude  = $row['ville_latitude_deg'];
	$longitude = $row['ville_longitude_deg'];
	 
	// On récupère les coordonnés de toutes les villes pour calculer la distance
	$req = "SELECT ville_slug, ville_longitude_deg, ville_latitude_deg FROM villes_france_free";
	$resultat = mysql_query($req) or die(mysql_error());
	while ($row = mysql_fetch_array($resultat)) {
	 
	$latitude2 = $row['ville_latitude_deg'];
	$longitude2 = $row['ville_longitude_deg'];
	 
	$formule = "(6366*acos(cos(radians($latitude))*cos(radians($latitude2))*cos(radians($longitude2) -radians($longitude2))+sin(radians($latitude))*sin(radians($latitude2))))";
	 
	echo $formule.'<br><br>';
	 
	$requete = "SELECT ville_slug, ville_longitude_deg, ville_latitude_deg as distance  FROM villes_france_free WHERE $formule < '". $distance."'";
	echo $requete.'<br><br>';
	mysql_query ($requete) or die(mysql_error());
	
	while ($row = mysql_fetch_array($resultat)) {

	  if ($formule < $distance)  { // affiche la ville qui se trouve à moins de $distance km
		echo $row['ville_slug'].'<br>';
	  }
	}
}
Voici l'echo de ma requete:
SELECT ville_slug, ville_longitude_deg, ville_latitude_deg as distance FROM villes_france_free WHERE (6366*acos(cos(radians(46.3833))*cos(radians(46.3833))*cos(radians(4.91667) -radians(4.91667))+sin(radians(46.3833))*sin(radians(46.3833)))) < '50'
et le echo de $formule:
SELECT ville_slug, ville_longitude_deg, ville_latitude_deg as distance FROM villes_france_free WHERE (6366*acos(cos(radians(46.3833))*cos(radians(46.3833))*cos(radians(4.91667) -radians(4.91667))+sin(radians(46.3833))*sin(radians(46.3833)))) < '50'

Les lontitude et latitude sont exact pour le test
Je viens dé vérifier j'ai un message d'erreur :
Use of undefined constant ozan - assumed 'ozan' in C:

Re: Faire un systeme de recherche kilométrique

par Ryle » 20 janv. 2016, 16:07

Un if() tout simple dans ta boucle devrait faire l'affaire :)
while (...) {
  ...
  if ($formule < $distance)  { // affiche la ville qui se trouve à moins de $distance km
    echo ...;
  }
}

Re: Faire un systeme de recherche kilométrique

par yoann38 » 20 janv. 2016, 15:23

Aurais tu une suggestion pr ca justement ou just passer avec un if tt simple ?

Re: Faire un systeme de recherche kilométrique

par Ascla » 20 janv. 2016, 01:33

Le problème c'est qu'il n'y a aucune condition, et donc l'affichage de toutes les villes.
Comme je te l'ai dis juste avant, $formule te renvoie pour chaque ville la distance qui les sépare (si le calcul est correct bien sûr). Il suffit donc juste d'instaurer une condition qui sera validé si et seulement si la distance est inférieur à 50km.
Dans ce cas, tu pourras afficher la ville.
Ah et inutile de faire une nouvelle requête !

Re: Faire un systeme de recherche kilométrique

par yoann38 » 19 janv. 2016, 23:53

Donc bah j'ai fait un echo de ma requete pour voi les valeurs retournée celle ci sont juste

Et le php en commantaire m'affiche toutes les villes de la bdd et moi ce que je souhaite c'est toutes les villes mais à une distance maximum d'environ 50 KM

Dans ma table ville_france_free ( on recupère les infos pour la géoloc )
$requete = "SELECT ville_slug, ville_longitude_deg, ville_latitude_deg as distance  FROM villes_france_free WHERE $formule < '". $distance."'";
Et ds une autre table ou j'ai mes annonces en gros ( table: annonce )
J'ai une colonne city

Donc j'ai l'idée mais voit pas comment combiner le tout avec un JOIN je suppose.

Re: Faire un systeme de recherche kilométrique

par Ascla » 19 janv. 2016, 22:54

Tout me semble correct jusqu'à ceci :
echo $formule.'<br><br>';
   
  $requete = "SELECT ville_slug, ville_longitude_deg, ville_latitude_deg FROM villes_france_free WHERE $formule < '". $distance."'";
  echo $requete.'<br><br>';
  mysql_query ($requete) or die(mysql_error());
  while ($row = mysql_fetch_array($resultat)) {
  //echo $row['ville_slug'].'<br>';
  }
Qu'est ce que tu cherches à faire ici ?

Il faudrait maintenant remplacer ces lignes par une condition du style: Si $formule < 50 Alors on affiche la ville.

Re: Faire un systeme de recherche kilométrique

par yoann38 » 19 janv. 2016, 22:48

Bon en suivant vos conseil et en cherchant à droite à gauche.
J'ai adapté un script certe avec l'ancienne syntaxe mais le but est de voir déjà si ca marche

J'ai donc bien une bdd avec les longtitude, latitude ....
et un script qui marche, sauf petit hic il affiche toutes les villes même au dela des 50 km
Le but du script est d'affiché les villes dont ca ne dépasse pas approximativement 50 km.
Merci à vous
$distance = 50;
	// On récupère les coordonnées de la ville selectionnée
	$req = "SELECT ville_slug, ville_latitude_deg, ville_longitude_deg FROM villes_france_free WHERE ville_slug = '". ozan."'";
	$resultat = mysql_query($req) or die(mysql_error());
	$row = mysql_fetch_array($resultat);
	 
	$latitude  = $row['ville_latitude_deg'];
	$longitude = $row['ville_longitude_deg'];
	 
	// On récupère les coordonnés de toutes les villes pour calculer la distance
	$req = "SELECT ville_slug, ville_longitude_deg, ville_latitude_deg FROM villes_france_free";
	$resultat = mysql_query($req) or die(mysql_error());
	while ($row = mysql_fetch_array($resultat)) {
	 
	$latitude2 = $row['ville_latitude_deg'];
	$longitude2 = $row['ville_longitude_deg'];
	 
	$formule = "(6366*acos(cos(radians($latitude))*cos(radians($latitude2))*cos(radians($longitude2) -radians($longitude2))+sin(radians($latitude))*sin(radians($latitude2))))";
	 
	echo $formule.'<br><br>';
	 
	$requete = "SELECT ville_slug, ville_longitude_deg, ville_latitude_deg FROM villes_france_free WHERE $formule < '". $distance."'";
	echo $requete.'<br><br>';
	mysql_query ($requete) or die(mysql_error());
	while ($row = mysql_fetch_array($resultat)) {
	//echo $row['ville_slug'].'<br>';
	}
	}

Re: Faire un systeme de recherche kilométrique

par Ascla » 19 janv. 2016, 19:45

Bonjour,
Oui comme l'a mentionné or1, il faudrait récupérer la longitude et latitude de chaque annonce.
Ensuite, il existe une multitude de scripts déjà tout prêt en faisant une simple recherche sur google.
Celui-ci me semble pas mal mais il est tout de même à tester !
https://www.geodatasource.com/developers/php

Re: Faire un systeme de recherche kilométrique

par or 1 » 19 janv. 2016, 19:29

vu que ce sont les événements du site qui doivent sortir, il faut integrer la recherche au site, donc ajout de la latitude à chaque ville ou événement, pour pouvoir filtrer selon ce critère.
après, il faut se poser la question de savoir si les visiteurs n'arrivent pas sur la fiche d'un événement et ne vont que très peu faire une recherche d'événements depuis le site, donc que c'est beaucoup de boulot pour un gain très faible.

Faire un systeme de recherche kilométrique

par yoann38 » 19 janv. 2016, 19:24

Salut à tous.
Je me tourne vers vous afin d'avoir vos retours et conseil.
Je cherche a faire un filtre kilométrique

Si l'utilisateur tape par exemple Grenoble et qu'il sélectionne via un input ou autre 50 km alors lui affiches les annonces avec une distance d'environ 50km maximum.

Faut il passer par du php avec une base avec latitude, lontitue.
Une api google map ?
Js ?

Merci pour vos retours