J'essaie de faire une requête de commande qui trouve des enregistrements les plus proches de l'actuel_utilisateur. p>
Je sais que la distance entre les deux points est la suivante: Comment puis-je y travailler dans une requête PostGis (ou Active_Record / Spatial_Adapter)? P> actuel_location.euclidean_distance (@ enregistrement.position) code> p>
6 Réponses :
Regardez la documentation ST_DISTANCE EN POSTGIS. P>
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 .. p>
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
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;
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})') code>
Un problème était que j'avais besoin de doubles quatoses. .ordre ("# actuel_location") code>
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 code> dans l'appel à
st_distance code> désigne le nom de la table de base de données contenant les éléments géographiques.
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}))")
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): P>
Sélectionnez * à partir de votre commande_Table par votre_Table.geom <-> st_geomfromtext (votre point comme wkt, 1000) limite 5 code> p> P>
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) }
Vous devriez ajouter à la réponse comment vous définissez le lonlat code> dans rails / rgeo
Pour d'autres débutants comme moi, il peut être utile de savoir que la valeur de srid code> 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 i> cherche à utiliser le Système de coordonnées géodésiques de la planète Terre qui est ID 4326 B>.