【问题标题】:Postgis query ST_DWithin against lat/long valuesPostgis 针对 lat/long 值查询 ST_DWithin
【发布时间】:2017-04-26 13:04:27
【问题描述】:

我有一个名为locations 的表格,其中包含以下列:

  • latitude
  • longitude

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

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

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

有什么想法吗?

【问题讨论】:

  • 您的实际问题是什么? -- 一个点被认为是另一个点,如果它们是完全相同的点。您可以使用阈值,但恕我直言,使用ST_Distance 会更直接。
  • 问题是上面的查询返回表中的所有条目,而不仅仅是输入长/纬度坐标的100m 半径内的条目。 ST_Distance 只返回 2 点之间的距离,我想要实现的是从一个点返回特定半径内的所有位置
  • 是的,这通常是带有WHERE ST_Distance(point_in_table, queried_point) < queried_max_distance的查询
  • ST_DistanceST_DWithin 都试过了,结果是一样的。尽管距离/半径设置为 1m,但有些行比这远得多。
  • 请提供表格定义和示例数据以及预期输出,以便我们能够重现您的发现。

标签: postgresql postgis


【解决方案1】:

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

【讨论】:

  • 对于ST_DWithin 的大型数据集,转换为地理似乎需要很长时间。如何找到空间参考系统定义的距离单位?例如:4326
猜你喜欢
  • 1970-01-01
  • 2019-02-23
  • 1970-01-01
  • 1970-01-01
  • 2021-04-18
  • 1970-01-01
  • 1970-01-01
  • 2021-05-05
  • 1970-01-01
相关资源
最近更新 更多