Estoy tratando de ubicar todas las ofertas cerca de un usuario dentro de una distancia de 100 km. El usuario comparte la ubicación y la consulto en la tabla de ofertas: id, nombre, texto, addressId (addressId es la clave externa)
Tabla de direcciones: id, dirección, ubicación.
Select Offers.id, Address.id from Offers, Address where ST_Distance( ST_Transform( [12.9406589,77.6185572] ]::Geometry, 3857), ST_Transform( Address.location::Geometry, 3857) < 100 and Address.id = Offers.addressIdCuando ejecuto la consulta anterior, arroja un error de sintaxis:
Error de sintaxis de Postgres cerca de "]"
¿De qué otra manera debo dar las coordenadas?
Si bien las respuestas de JimJones cubren cómo crear un punto, hay varios otros problemas:
st_distance usa la unidad del CRS, que es metros para 3857. Está buscando entradas dentro de los 100 m de dicha ubicacióngeography en lugar de la geometry , que utiliza metros de forma predeterminadaST_DWithin en lugar de ST_Distance , ya que el primero utiliza el índice espacialLa consulta podría volverse similar a
SELECT Offers.id, Address.id FROM Offers JOIN Address ON Address.id = Offers.addressId WHERE ST_DWithin(ST_MakePoint(77.6185572, 12.9406589)::geography, Address.location::Geography, 100000);con un índice sobre la geografía
CREATE INDEX geogidx ON Address USING GIST((location::geography));¿Ha intentado combinar ST_MakePoint and ST_SetSRID para crear su punto?
SELECT Offers.id, Address.id FROM Offers, Address WHERE ST_Distance( ST_SetSRID(ST_MakePoint(12.9406589,77.6185572),3857), ST_Transform( Address.location::Geometry, 3857)) < 100 AND Address.id = Offers.addressId Nota : la función ST_MakePoint espera los parámetros como longitude,latitude , no al revés.
Ver también esta answer relacionada.