/ / Appel de postgis ST_DWinin dans une requête rails - postgis, postgresql-9.3, ruby-on-rails-4.2

Appel de postgis ST_DWinin dans une requête rails - postgis, postgresql-9.3, ruby-on-rails-4.2

Les tentatives suivantes sont tentées dans la console pour une application rails4.2 activée pour Postgis.

@target = Target.last
@meter_radius = 1000
@valid_points = Target.where("ST_DWithin(#{@target.lat}, #{@target.lon},  #{@meter_radius}))

lat et lon sont définis en tant que valeurs décimales. Cela se traduit par la requête suivante

SELECT "targets".* FROM "targets"  WHERE (ST_DWithin(38.656679, 15.984094, 1000))

avec l'erreur: PG::UndefinedFunction: ERROR: function st_dwithin(numeric, numeric, integer) does not exist

Je crois que je dois déclarer le type de données(géométrique ou géographique) pour ces valeurs mais je ne sais pas comment. Je me demande également si la fonction ST_DWithin peut fonctionner en dehors du type de données 3857, même si la documentation ne l'indique pas.

Remarque l'objet @target a aussi un lonlat les attributs définis en tant que valeur spatiale dans postgresql avec: srid => 3857,: type => "point" défini.

Mettre à jour

@valid_points = Target.where("ST_DWithin(lonlat, ST_PointFromText("#{@target.lonlat}",  #{@meter_radius}))

retourne un résultat et apparaît donc syntaxiquement valide.

SELECT "targets".* FROM "targets"  WHERE (ST_DWithin(lonlat, ST_PointFromText("POINT (15.984094 38.656679)", 3857), 1000))

Cependant, le résultat est incorrect. Il trouve essentiellement tous les points du tableau. Étant de type SRID, cela devait être exprimé en degrés et non en mètres.

Réponses:

0 pour la réponse № 1

Une réponse, en exploitant le point spatial non mémorisé stocké:

@target = Target.last
@degree_radius = 0.2249
@valid_points = Target.where("ST_DWithin(lonlat, ST_PointFromText("#{@target.lonlat}",  #{@degree_radius}))

qui retourne un résultat et semble donc syntaxiquement valide.

SELECT "targets".* FROM "targets"  WHERE (ST_DWithin(lonlat, ST_PointFromText("POINT (15.984094 38.656679)", 3857), 0.2249))