2017-04-26 837 views
0

我有以下的表称为locations有以下栏目:POSTGIS查询ST_DWithin对经/纬度值

  • latitude
  • longitude

现在我想查询中所有条目在给定纬度/长点的特定半径内。

SELECT * FROM locations 
WHERE ST_DWithin(
    ST_MakePoint(longitude, latitude), 
    ST_MakePoint(-0.63098, 51.18291), 
    100 
); 

上面的查询解释了我有哪些数据作为输入和我必须查询的数据。

有什么想法?

+0

你是什么实际问题? - 如果他们是完全相同的点,则认为*在另一点内*。你可以玩阈值,但使用['ST_Distance'](https://postgis.net/docs/ST_Distance.html)会更直接恕我直言。 – pozs

+0

问题是,上面的查询返回表中的所有条目,而不仅仅是从输入长/纬度坐标的'100m'半径内的条目。 'ST_Distance'只返回2个点之间的距离,我想实现的是从点 –

+0

返回一个特定半径内的所有位置,这通常是一个WHERE ST_Distance(point_in_table,queried_point)查询 pozs

回答

2

ST_DWithin可以同时处理地理和几何类型。 ST_MakePoint返回一个几何类型。当使用ST_DWithin时,它将使用由空间参考系统定义的距离单位。

当您想以米为单位进行比较时,您首先必须将值转换为地理类型。查询就变成了:

SELECT * FROM locations 
WHERE ST_DWithin(
    ST_MakePoint(longitude, latitude)::geography, 
    ST_MakePoint(-0.63098, 51.18291)::geography, 
    100 
); 

的回答解释更多关于地理和几何形状之间的区别就在这里:https://gis.stackexchange.com/questions/6681/what-are-the-pros-and-cons-of-postgis-geography-and-geometry-types

+0

这个伎俩。谢谢。 –