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

Ruby on Rails Discussion :

[Geocoder] Géolocalisation du visiteur


Sujet :

Ruby on Rails

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 1
    Points : 4
    Points
    4
    Par défaut [Geocoder] Géolocalisation du visiteur
    Bonjour / Bonsoir à tous !

    Je suis actuellement en train de developper un site web permettant d'afficher des magasins sur une Google Map.
    Je le fais avec la gem GeoCoder et je n'ai pas de problème pour tous les afficher sur la carte.

    Cependant, je voudrais récupérer l'adresse ip du visiteur afin d'obtenir sa position et n'afficher que les magasins présents dans un rayon de X kilomètres autour de lui.

    Ma question est donc la suivante : connaissez-vous un moyen de géolocaliser ce visiteur via son adresse IP via GeoCoder ?

    Voici mon controller qui affiche tous les magasins:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    def index
        @shops = Shop.all
        @hash = Gmaps4rails.build_markers(@shops) do |shop, marker|
          marker.lat shop.latitude
          marker.lng shop.longitude
          marker.infowindow shop.name
        end
     end
    Et celui ou j'essaye de localiser le visiteur :
    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
     
    def index
        result = request.remote_ip
        if request.remote_ip == '::1'
          # Codage d'une adresse ip en dur afin de pouvoir tester 
          result = '63.136.167.174'
        end
     
        @shops = Shop.all
        @hash = Gmaps4rails.build_markers(@shops) do |shop, marker|
          # Le problème intervient à la ligne suivante 
          if Geocoder::Calculations.distance_between(Geocoder.coordinates(result), shop.to_coordinates) < 30
            marker.lat shop.latitude
            marker.lng shop.longitude
            marker.infowindow shop.name
          end
        end
    end
    Mon erreur est : undefined method `lat' for #<Shop:0x007f969b732b28>, ce qui est normal, mais je ne sais pas comment traduire cette adresse

    Merci d'avance

  2. #2
    Membre actif
    Profil pro
    Problem Solver
    Inscrit en
    Juin 2013
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Problem Solver

    Informations forums :
    Inscription : Juin 2013
    Messages : 138
    Points : 231
    Points
    231
    Par défaut
    Salut,
    tout d'abord je pense que ton modèle "Shop" a un champ "latitude" (code du dessous)
    mais que ta méthode "Shop.to_coordinates" doit appeler un champ/méthode "lat" (message d'erreur).
    C'est ton premier souci.


    Ensuite, tu parles de traduire une adresse en lat/lng, mais normalement tu le fais déjà avec Geocoder :
    il regarde l'adresse de Shop via une API Google certainement, et te donne les lat/lng de la boutique.

    Alors qu'en fait ce que tu veux c'est convertir une IP visiteur en lat/lng. Ça, je suis moins expert, mais je pense qu'il y a un Gem ou une API pour ça, au pire c'est un projet commercial, mais du coup tu vois bien que ça a de la valeur pour toi


    Enfin, tu fais une requête à base de Shop.all.select{|shop| comparaison lat-lng ou distance }
    Donc tu regardes pour tous tes visiteurs (chaque requête !?!) des milliers de magasins et comparaisons.
    J'aime pas forcer les gens à optimiser trop tôt mais en réalité ce que tu voudras probablement faire à terme,
    c'est de stocker dans la session une lat/lng de la personne, et comparer avec une requête SQL toute bête.
    Par exemple pour faire un "carré" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    d = 42 # une valeur de "delta" qui donne les bornes pour comparer -- ajuste avec ton écran et ton appli
    Shop.where(['lat > ? AND lat < ? AND lng > ? AND lng < ?', user.lat - d, user.lat + d, user.lng - d, user.lng + d])
    Mais bien entendu, il y a sûrement des gems qui font ça bien et même des SGBD qui font ça bien.
    Par exemple, PostGreSQL sait très bien faire des calculs sur des distances, radius etc.
    Cherche "PostGis" pour avoir un aperçu de tout ce qu'on peut vouloir faire avec un SIG (Système d'Information Géographique).


    De toutes façons tu feras sûrement un code plus malin parce que :
    - les infos géographiques sont peu fiables (IP etc)
    - les gens sont parfois en voyage (je suis à Marseille mais je veux voir les magasins de Paris)
    - après l'utilisateur peut déplacer son "écran" (dézoomer ou déplacer), donc changer la zone

    Bref il y a de fortes chances que tu stockes à la fois la localisation
    - devinée via IP
    - choisie par l'utilisateur (son lieu "principal")
    - et temporaire (la zone qu'il veut regarder)


    Bon courage et bonne chance !

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Juillet 2012
    Messages : 17
    Points : 24
    Points
    24
    Par défaut
    Je début dans RoR mais tu peux utiliser cette fonctionnalité de Geocoder : https://github.com/alexreisner/geoco...-by-ip-address pur récupérer la latitude/longitude de l'utilisateur connecté.

    Ensuite tu utilises https://github.com/alexreisner/geoco...tabase-queries (fonction near()) avec la latitude/longitude de l'utilisateur, voilà.
    Il faut bien sûr avoir un champ latitude/longitude dans la table de ton modèle.

Discussions similaires

  1. Géolocalisation Google Maps coordonnées visiteur web
    Par Stephane_br dans le forum ASP.NET
    Réponses: 2
    Dernier message: 09/10/2012, 19h26
  2. Réponses: 3
    Dernier message: 26/01/2005, 08h08
  3. Poposer aux visiteurs de choisir le design, style switcher
    Par frimo dans le forum Mise en page CSS
    Réponses: 6
    Dernier message: 29/11/2004, 20h15
  4. [J2EE] Connaitre l'IP d'un visiteur
    Par goulime dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 19/01/2004, 15h23

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