Za prvé - předpokládám, že lat_long je sloupec typu georaphy. Pokud se jedná o sloupec typu geometrie, budete muset mé příklady upravit na nějaké jiné EPSG (pravděpodobně 3857 metrický EPSG pro celý svět). Je to velmi důležité, protože st_dwithin kontroluje v metrech pro geopraphy typ a v mapových jednotkách pro geometrii (a pro EPSG 4326 jednotka je stupeň ne metr)
Vložte svá data takto
insert into car_wash values (1,'aaa',st_setsrid(st_makepoint(54.51, 22.54),4326))
Vysvětlím, proč používat st_setsrid, st_makepoint a co to sakra je 4326.- 4326 je EPSG 4326 - je to nejznámější souřadnicový referenční systém (kde máte zeměpisnou šířku a délku ve stupních).
-
st_makepoint - vytvoří zeměpisný bod z vašich souřadnic zeměpisné šířky a délky. Bude to vypadat jako bajty, ale nebojte se, pokud budete z nějakých důvodů potřebovat lat a long, můžete je získat pomocí funkcí st_x() a st_y() nebo st_astext(). Nejlepší na tom mít geomy nebo geogy (v tomto případě) je, že můžete použít gist index. Velmi výkonný nástroj, který urychlí vaše geografické dotazy.
-
st_setsrid - st_makepoint vytvoří bod, ale se srid=0. Musíte říct POSTGIS, v jakém EPSG má číst vaše data. Například když mu řeknete, aby to přečetl pomocí 4326, bude to na správných místech na mapě světa google, ale když řeknete například 3857, bude to na úplně jiném místě, protože 3857 je metrický systém, ne stupeň, takže to bude kolem 50 a 50 metrů od levého dolního rohu (nebo možná vlevo nahoře, to si nepamatuji)
Vytvořte index na geog
create index on car_wash using gist (geog);
Máme tabulku, máme v ní data a index na ní. Nyní chceme zkontrolovat, zda je váš bod blízko některé z vašich myček aut.
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
V ST_DWithin třetím parametrem je vzdálenost v metrech (georpahy) nebo mapové jednotky (geometrie). V tomto případě vám tedy zobrazí všechny myčky aut, které jsou do 1000 metrů od vaší uživatelské polohy a nejsou smazány.