PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

postgresql postgis Si point à l'intérieur du cercle

Premièrement - je suppose que lat_long est une colonne de type georaphy. S'il s'agit d'une colonne de type géométrie, vous devrez modifier mes exemples en un autre EPSG (probablement 3857 EPSG métrique pour le monde entier). C'est très important car st_dwithin vérifie en mètres pour le type de géopraphie et en unités de carte pour la géométrie (et pour EPSG 4326, l'unité est le degré et non le mètre)

Insérez vos données comme ceci

insert into car_wash values (1,'aaa',st_setsrid(st_makepoint(54.51, 22.54),4326))

J'explique pourquoi utiliser st_setsrid, st_makepoint, et qu'est-ce que c'est que 4326.- 4326 est EPSG 4326 - c'est le système de référence de coordonnées le plus connu (où vous avez lat et long en degrés).

  • st_makepoint - créera un point géographique à partir de vos coordonnées lat et long. Cela ressemblera à des octets, mais ne vous inquiétez pas, si vous avez besoin de lat et long pour certaines raisons, vous pouvez les obtenir avec les fonctions st_x() et st_y() ou st_astext(). La meilleure chose à faire avec geoms ou geogs (dans ce cas) est que vous pouvez utiliser l'index gist. Outil très puissant qui accélère vos requêtes géographiques.

  • st_setsrid - st_makepoint créera un point mais avec srid=0. Vous devez indiquer à POSTGIS dans quel EPSG il doit lire vos données. Par exemple, si vous lui dites de le lire avec 4326, il sera aux bons endroits sur la carte du monde de Google, mais si vous dites par exemple 3857, il sera à un endroit complètement différent, car 3857 est un système métrique et non un degré, il sera donc autour de 50 et à 50 mètres du coin inférieur gauche (ou peut-être à gauche, ne vous en souvenez pas)

Créer un index sur geog

create index on car_wash using gist (geog);

Nous avons une table, nous y avons des données et un index dessus. Nous voulons maintenant vérifier si votre point est proche de l'un de vos lave-autos.

select *
  from car_wash cw
 where ST_DWithin (cw.geog,ST_GeogFromtext('SRID=4326;POINT(54.21 22.54)'),1000)
  AND cw.was_deleted=false

Dans ST_D, le troisième paramètre est la distance en mètres (georpahy) ou en unités de carte (geometry). Donc, dans ce cas, il vous montrera tous les lave-autos qui se trouvent jusqu'à 1000 mètres de votre position d'utilisateur et qui ne sont pas supprimés.