Reputation: 235
I am trying to get all offers located near a user within a distance of 100kms. The user shares the location and I query it in Offers Table - id, name, text, addressId (addressId is the foreign key)
Address Table - id, address, location.
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.addressId
When I run the above query, it's throwing a syntax error:
Postgres syntax error near "]"
How else should I give the coordinates?
Upvotes: 1
Views: 1752
Reputation: 17906
While JimJones answers covers how to create a point, there are several other issues:
st_distance
uses the unit of the CRS, which is meters for 3857. You are searching for entries within 100m of the said locationgeography
instead of geometry
, which uses meters by defaultST_DWithin
instead of ST_Distance
, as the former makes uses of the spatial indexThe query could become similar to
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);
with an index on the geography
CREATE INDEX geogidx ON Address USING GIST((location::geography));
Upvotes: 4
Reputation: 19653
Have you tried combining ST_MakePoint and ST_SetSRID
to create your point?
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
Note: The function ST_MakePoint
expects the parameters as longitude,latitude
, not the other way around.
See also this related answer
.
Upvotes: 1