PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

postgresql postgis Se ponto dentro do círculo


Primeiro - suponho que lat_long seja uma coluna do tipo georafia. Se for uma coluna do tipo geometria, você terá que modificar meus exemplos para algum outro EPSG (provavelmente 3857 EPSG métrico para todo o mundo). É muito importante porque st_dwithin verifica metros para tipo de geoprafia e em unidades de mapa para geometria (e para EPSG 4326 a unidade é grau e não metro)

Insira seus dados assim
insert into car_wash values (1,'aaa',st_setsrid(st_makepoint(54.51, 22.54),4326))

Eu explico por que usar st_setsrid, st_makepoint, e o que diabos é 4326.- 4326 é EPSG 4326 - é o sistema de referência de coordenadas mais conhecido (onde você tem lat e long em graus).

  • st_makepoint - criará um ponto geográfico de suas coordenadas lat e long. Parecerá bytes, mas não se preocupe, se você precisar de lat e long por algum motivo, você pode obtê-los com as funções st_x() e st_y() ou st_astext(). A melhor coisa de ter geoms ou geogs (neste caso) é que você pode usar o índice gist. Ferramenta muito poderosa que agiliza suas consultas geográficas.

  • st_setsrid - st_makepoint criará ponto, mas com srid=0. Você tem que dizer ao POSTGIS em qual EPSG ele deve ler seus dados. Por exemplo, se você disser a ele para ler com 4326, ele estará em lugares corretos no mapa do mundo do Google, mas se você disser, por exemplo, 3857, estará em um lugar completamente diferente, pois 3857 é um sistema métrico e não um grau, então será em torno de 50 e 50 metros do canto esquerdo para baixo (ou talvez para cima, não me lembro)

Criar índice no geog
create index on car_wash using gist (geog);

Temos tabela, temos dados nela e índice nela. Agora queremos verificar se o seu ponto está próximo de alguma das suas lavagens.
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

Em ST_DWithin o terceiro parâmetro é a distância em metros (georpahy) ou unidades de mapa (geometria). Portanto, neste caso, ele mostrará todas as lavagens de carros que estão a até 1000 metros da localização do seu usuário e não são excluídas.