Primo:presumo che lat_long sia una colonna di tipo georaphy. Se è una colonna di tipo geometrico, dovrai modificare i miei esempi con qualche altro EPSG (probabilmente 3857 EPSG metrico per il mondo intero). È molto importante perché st_dwithin controlla i metri per il tipo di geoprafia e le unità della mappa per la geometria (e per EPSG 4326 l'unità è il grado non il metro)
Inserisci i tuoi dati in questo modo
insert into car_wash values (1,'aaa',st_setsrid(st_makepoint(54.51, 22.54),4326))
Spiego perché usa st_setsrid, st_makepoint e cosa diavolo è 4326.- 4326 è EPSG 4326 - è il sistema di riferimento delle coordinate più noto (dove hai lat e long in gradi).
-
st_makepoint - creerà un punto geografico dalle coordinate lat e long. Sembreranno byte, ma non preoccuparti, se avrai bisogno di lat e long per qualche motivo, puoi ottenerli con le funzioni st_x() e st_y() o st_astext(). La cosa migliore di avere geoms o geog (in questo caso) è che puoi usare gist index. Strumento molto potente che velocizza le tue ricerche geografiche.
-
st_setsrid - st_makepoint creerà un punto ma con srid=0. Devi dire a POSTGIS in quale EPSG dovrebbe leggere i tuoi dati. Ad esempio se gli dici di leggerlo con 4326 sarà nei posti corretti sulla mappa del mondo di google, ma se dici ad esempio 3857 sarà in un posto completamente diverso, poiché 3857 è un sistema metrico non grado quindi sarà circa 50 e 50 metri dall'angolo in basso a sinistra (o forse a sinistra in alto, non ricordo)
Crea indice su geog
create index on car_wash using gist (geog);
Abbiamo una tabella, abbiamo dati in essa e un indice su di essa. Ora vogliamo verificare se il tuo punto è vicino a uno dei tuoi autolavaggi.
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_Dentro il terzo parametro c'è la distanza in metri (geometria) o le unità della mappa (geometria). Quindi in questo caso ti mostrerà tutti gli autolavaggi che si trovano fino a 1000 metri dalla posizione dell'utente e non vengono eliminati.