Först - jag antar att lat_long är kolumn av georafityp. Om det är kolumn av geometrityp måste du ändra mina exempel till någon annan EPSG (troligen 3857 metrisk EPSG för hela världen). Det är mycket viktigt eftersom st_dwithin checkar in meter för geoprafityp och i kartenheter för geometri (och för EPSG 4326 är enheten grad inte meter)
Infoga dina data så här
insert into car_wash values (1,'aaa',st_setsrid(st_makepoint(54.51, 22.54),4326))
Jag förklarar varför man använder st_setsrid, st_makepoint, och vad fan är 4326.- 4326 är EPSG 4326 - det är det mest kända koordinatreferenssystemet (där man har lat och long i grader).
-
st_makepoint - kommer att skapa geografipunkt från dina lat- och långa koordinater. Det kommer att se ut som bytes, men oroa dig inte, om du behöver lat och long av vissa skäl kan du få dem med funktionerna st_x() och st_y() eller st_astext(). Det bästa med att ha geomer eller geogs (i det här fallet) är att du kan använda gistindex. Mycket kraftfullt verktyg som snabbar upp dina geografiska frågor.
-
st_setsrid - st_makepoint skapar punkt men med srid=0. Du måste tala om för POSTGIS i vilken EPSG den ska läsa dina data. Till exempel om du säger åt honom att läsa det med 4326 kommer det att finnas på rätt ställen på Googles världskarta, men om du säger till exempel 3857 kommer det att vara på en helt annan plats, eftersom 3857 är metriskt system inte grad så det kommer att vara runt 50 och 50 meter från vänster ner hörnet (eller kanske vänster upp, minns inte)
Skapa index på geog
create index on car_wash using gist (geog);
Vi har tabell, vi har data i den och index på den. Nu vill vi kontrollera om din punkt är nära någon av dina biltvättar.
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
I ST_DInom tredje parametrar är avstånd i meter (georpahy) eller kartenheter (geometri). Så i det här fallet kommer den att visa dig alla biltvättar som är upp till 1000 meter från din användarplats och som inte raderas.