Ten eerste - ik neem aan dat lat_long een kolom van het type georaphy is. Als het een kolom van het geometrietype is, moet u mijn voorbeelden wijzigen in een andere EPSG (waarschijnlijk 3857 metrische EPSG voor de hele wereld). Het is erg belangrijk omdat st_dwithin meters incheckt voor geoprafietype en in kaarteenheden voor geometrie (en voor EPSG 4326 is de eenheid graad niet meter)
Voer uw gegevens op deze manier in
insert into car_wash values (1,'aaa',st_setsrid(st_makepoint(54.51, 22.54),4326))
Ik leg uit waarom gebruik st_setsrid, st_makepoint, en wat de hel is 4326.- 4326 is EPSG 4326 - het is het meest bekende referentiesysteem voor coördinaten (waar je lat en lang in graden hebt).
-
st_makepoint - maakt een geografisch punt van uw lat- en longcoördinaten. Het ziet eruit als bytes, maar maak je geen zorgen, als je om de een of andere reden lat en long nodig hebt, kun je ze krijgen met de functies st_x() en st_y() of st_astext(). Het beste van geoms of geogs (in dit geval) is dat je de gist-index kunt gebruiken. Zeer krachtige tool die uw geografische zoekopdrachten versnelt.
-
st_setsrid - st_makepoint zal een punt maken maar met srid=0. U moet aan POSTGIS vertellen in welke EPSG het uw gegevens moet lezen. Als je hem bijvoorbeeld vertelt om het met 4326 te lezen, staat het op de juiste plaatsen op de Google-wereldkaart, maar als je bijvoorbeeld 3857 zegt, staat het op een heel andere plaats, aangezien 3857 een metrisch systeem is en geen graad, dus het zal rond de 50 zijn en 50 meter van de linker benedenhoek (of misschien linksboven, weet het niet meer)
Index maken op geog
create index on car_wash using gist (geog);
We hebben een tabel, we hebben er gegevens in en een index erop. Nu willen we controleren of uw punt in de buurt van een van uw wasstraten ligt.
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_Dwithin is de derde parameter afstand in meters (georpahy) of kaarteenheden (geometrie). In dit geval toont het u dus alle wasstraten die zich tot 1000 meter van uw gebruikerslocatie bevinden en niet worden verwijderd.