PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

postgresql postgis Wenn Punkt innerhalb des Kreises

Erstens - ich nehme an, dass lat_long eine Spalte vom Typ Geophy ist. Wenn es sich um eine Geometriespalte handelt, müssen Sie meine Beispiele in eine andere EPSG ändern (wahrscheinlich 3857 metrische EPSG für die ganze Welt). Dies ist sehr wichtig, da st_dwithin Meter für den Geografietyp und Karteneinheiten für die Geometrie eincheckt (und für EPSG 4326 ist die Einheit Grad, nicht Meter)

Geben Sie Ihre Daten so ein

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

Ich erkläre, warum st_setsrid, st_makepoint verwendet werden und was zum Teufel 4326 ist. - 4326 ist EPSG 4326 - es ist das bekannteste Koordinatenreferenzsystem (wo Sie Breite und Länge in Grad haben).

  • st_makepoint - erstellt geografische Punkte aus Ihren Lat- und Long-Koordinaten. Es wird wie Bytes aussehen, aber keine Sorge, wenn Sie Lat und Long aus bestimmten Gründen benötigen, können Sie sie mit den Funktionen st_x() und st_y() oder st_astext() erhalten. Das Beste an Geoms oder Geogs (in diesem Fall) ist, dass Sie den Kernindex verwenden können. Sehr leistungsstarkes Tool, das Ihre Geo-Abfragen beschleunigt.

  • st_setsrid - st_makepoint erstellt einen Punkt, aber mit srid=0. Sie müssen POSTGIS mitteilen, in welcher EPSG Ihre Daten gelesen werden sollen. Wenn Sie ihm zum Beispiel sagen, dass er es mit 4326 lesen soll, wird es an den richtigen Stellen auf der Google-Weltkarte sein, aber wenn Sie zum Beispiel 3857 sagen, wird es an einer völlig anderen Stelle sein, da 3857 ein metrisches System ist, kein Grad, also wird es ungefähr 50 sein und 50 Meter von der linken unteren Ecke (oder vielleicht links oben, erinnere mich nicht)

Index auf Geo erstellen

create index on car_wash using gist (geog);

Wir haben eine Tabelle, wir haben Daten darin und einen Index darauf. Jetzt wollen wir prüfen, ob sich Ihr Punkt in der Nähe einer Ihrer Autowaschanlagen befindet.

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

In ST_DInnerhalb dritter Parameter ist die Entfernung in Metern (Geometrie) oder Karteneinheiten (Geometrie). In diesem Fall werden Ihnen also alle Autowaschanlagen angezeigt, die bis zu 1000 Meter von Ihrem Benutzerstandort entfernt sind und nicht gelöscht wurden.