sql >> Base de Datos >  >> RDS >> PostgreSQL

postgresql postgis Si el punto dentro del círculo

Primero, supongo que lat_long es una columna de tipo georaphy. Si es una columna de tipo de geometría, tendrá que modificar mis ejemplos a algún otro EPSG (probablemente 3857 EPSG métrico para todo el mundo). Es muy importante porque st_dwithin comprueba los metros para el tipo de geografía y las unidades de mapa para la geometría (y para EPSG 4326 la unidad es el grado, no el metro)

Inserta tus datos así

insert into car_wash values (1,'aaa',st_setsrid(st_makepoint(54.51, 22.54),4326))

Explico por qué usar st_setsrid, st_makepoint, y qué diablos es 4326.- 4326 es EPSG 4326 - es el sistema de referencia de coordenadas más conocido (donde tienes latitud y longitud en grados).

  • st_makepoint:creará un punto geográfico a partir de sus coordenadas de latitud y longitud. Parecerán bytes, pero no se preocupe, si necesita latitud y longitud por alguna razón, puede obtenerlas con las funciones st_x() y st_y() o st_astext(). Lo mejor de tener geoms o geogs (en este caso) es que puedes usar el índice gist. Herramienta muy poderosa que acelera sus consultas geográficas.

  • st_setsrid - st_makepoint creará un punto pero con srid=0. Debe decirle a POSTGIS en qué EPSG debe leer sus datos. Por ejemplo, si le dices que lo lea con 4326, estará en los lugares correctos en el mapa mundial de Google, pero si dices, por ejemplo, 3857, estará en un lugar completamente diferente, ya que 3857 es un sistema métrico, no un grado, por lo que será alrededor de 50. y 50 metros desde la esquina izquierda hacia abajo (o tal vez hacia la izquierda, no recuerdo)

Crear índice en geog

create index on car_wash using gist (geog);

Tenemos una tabla, tenemos datos en ella y un índice en ella. Ahora queremos comprobar si tu punto está cerca de alguno de tus túneles de lavado.

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

En ST_Ddentro de los terceros parámetros está la distancia en metros (georpaía) o unidades de mapa (geometría). Entonces, en este caso, le mostrará todos los lavados de autos que están hasta 1000 metros de su ubicación de usuario y no se eliminan.