postgis获取最近位置查询

0aydgbwb  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(451)

我试图获得所有的优惠位于附近的用户在100公里的距离。用户共享位置,我在offers表-id,name,text,addressid中查询它(addressid是外键)
地址表-id、地址、位置。

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

当我运行上面的查询时,它抛出了一个语法错误:
“]”附近的postgres语法错误
不然我该怎么给出坐标呢?

8dtrkrch

8dtrkrch1#

你试过组合吗 ST_MakePoint and ST_SetSRID 你的观点是什么?

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

注:功能 ST_MakePoint 参数应为 longitude,latitude ,而不是相反。
另请参见此相关内容 answer .

kxxlusnw

kxxlusnw2#

虽然jimjones的答案涵盖了如何创建一个点,但还有几个其他问题: st_distance 使用crs的单位,即3857的米。您正在搜索上述位置100米范围内的条目
3857,仅用于显示的投影。不要在这个投影中计算距离,它们是高度扭曲的。要么使用合适的局部投影,要么使用 geography 而不是 geometry ,默认情况下使用米
理想情况下,你会有一个关于你的几何/地理索引,然后你可以使用 ST_DWithin 而不是 ST_Distance ,因为前者利用了空间索引
如果您的数据位于印度而不是遥远的北方,则意味着您在创建点时交换了纬度和经度
查询可能类似于

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);

地理索引

CREATE INDEX geogidx ON Address USING GIST((location::geography));

相关问题