9
votes

Commandez en la plus proche - Postgis, Georuby, Spatial_Adapter

J'essaie de faire une requête de commande qui trouve des enregistrements les plus proches de l'actuel_utilisateur.

Je sais que la distance entre les deux points est la suivante: actuel_location.euclidean_distance (@ enregistrement.position)

Comment puis-je y travailler dans une requête PostGis (ou Active_Record / Spatial_Adapter)?


0 commentaires

6 Réponses :


1
votes

Regardez la documentation ST_DISTANCE EN POSTGIS.


0 commentaires

0
votes

Si vous n'avez pas besoin d'utiliser PostGis, Geo-Kit l'utilise parfaitement avec Google ou Yahoo (je n'ai utilisé que Google) et dans vos requêtes que vous pouvez trier à distance, son génial ..


1 commentaires

Vous avez raison mais vous êtes limité par la limite de demande de Google pour leur API. Dans ce cas, il s'agit de 2500 Demande / 24 heures



17
votes

Pour obtenir le 5 le plus proche:

SELECT * FROM your_table 
WHERE ST_DWithin(your_table.geom, ST_Geomfromtext(your point as wkt, 1000)
ORDER BY ST_Distance(your_table.geom, ST_Geomfromtext(your point as wkt))  
limit 5;


5 commentaires

J'ai ma position dans une méthode d'assistance actuelle_location. Savez-vous s'il est possible de l'insérer dans la requête (rails)? Quelque chose comme: .Order ('st_distance (articles.position, # {actuel_location})')


Un problème était que j'avais besoin de doubles quatoses. .ordre ("# actuel_location")


Il y a un support manquant sur la ligne suivante après "ton point comme wkt '


Pourquoi le transmettre comme wkt?


Pour d'autres débutants comme moi, il pourrait être utile de savoir que éléments dans l'appel à st_distance désigne le nom de la table de base de données contenant les éléments géographiques.



2
votes

Pour envelopper cela, avec l'aide de tout le monde, je l'ai travaillé comment je voulais:

order("ST_Distance(items.position, ST_GeomFromText('POINT (#{current_location.y} #{current_location.x})', #{SRID}))")


0 commentaires

2
votes

Si vous voulez vraiment trouver littéralement les 5 enregistrements les plus proches de l'actuel_uuser, envisagez la recherche de quartier, qui est prise en charge par Index Knn dans PostGis 2.0 (voir «<->» Opérateur):

Sélectionnez * à partir de votre commande_Table par votre_Table.geom <-> st_geomfromtext (votre point comme wkt, 1000) limite 5


0 commentaires

6
votes

Juste au cas où quelqu'un trébuche sur cette question dans les rails 4. J'utilise RGGEO GEM et cela fonctionne pour moi

scope :closest, ->(point) { order("ST_Distance(lonlat, ST_GeomFromText('#    {point.as_text}', #{SRID}))").limit(5) }


2 commentaires

Vous devriez ajouter à la réponse comment vous définissez le lonlat dans rails / rgeo


Pour d'autres débutants comme moi, il peut être utile de savoir que la valeur de srid devrait être un entier qui pointe vers l'ID universellement connu du système de coordonnées que vous utilisez pour calculer des distances. Vous êtes la plupart probablement cherche à utiliser le Système de coordonnées géodésiques de la planète Terre qui est ID 4326 .