18

ST_DWithin文档说,第三个参数(距离)以米为单位但是当我执行一些查询时,它似乎将第三个参数作为“度数”?

这是我的简化表结构:

> \d+ theuser;
                         Table "public.theuser"
  Column  |          Type          | Modifiers | Storage  | Description 
----------+------------------------+-----------+----------+-------------
 id       | bigint                 | not null  | plain    | 
 point    | geometry               |           | main     | 
Indexes:
    "theuser_pkey" PRIMARY KEY, btree (id)
    "point_index" gist (point)
Referenced by:
    ...
Has OIDs: no

所有点都以 SRID=4326 存储。

这是查询:

> select * from theuser where ST_DWithin(point , ST_GeomFromText('POINT(120.9982 24.788)',4326) , 100 );

它将第三个参数 (100) 作为 'degree' ,因此它返回所有数据,我必须缩小到 0.001 才能找到附近的点。

但是我如何直接将米作为第三个参数传递(我不想做米/度转换)?我的查询有什么问题?为什么 postgreSQL 不像文档所说的那样把它当作米?

环境:

> select version();
                                                  version                                                  
-----------------------------------------------------------------------------------------------------------
 PostgreSQL 8.4.9 on i486-pc-linux-gnu, compiled by GCC gcc-4.4.real (Ubuntu 4.4.3-4ubuntu5) 4.4.3, 32-bit

> SELECT postgis_lib_version();
 postgis_lib_version 
---------------------
 1.4.0

如果是SRID导致了这个问题,那么什么SRID直接以“米”为单位呢?(我尝试转换为 SRID=2163 ,但仍在度数)谢谢。

4

5 回答 5

18

文档

对于几何:距离以几何的空间参考系统定义的单位指定。

如果您的数据在 SRID=4326 中,则您指定的距离以度为单位。

您要么必须使用ST_Transform和基于仪表的坐标系,要么使用以下两个功能之一:ST_Distance_Sphere(更快,不太准确)或ST_Distance_Spheroid

于 2011-12-09T12:08:42.413 回答
15

如果您geometry在 WGS84 中,即 srid 4326,您可以将几何图形转换geography为以米为单位

SELECT *
FROM theuser
WHERE ST_DWithin(
  point::geography,
  ST_GeomFromText('POINT(120.9982 24.788)',4326)::geography,
  100 -- DISTANCE IN METERS
);
于 2015-07-14T13:52:04.190 回答
3

我不建议您每次要使用 DWithin 时都转换为米,顺便说一下,如果您想要米,则需要像Albers 投影这样的等面积投影(有很多),为什么不尝试 ST_Buffer(point, degree) , 看看它在谷歌地球上做了什么,测量并找到一个你喜欢的数字,通常你需要预定义的范围,比如非常接近 = 0.00008,接近 = 0.0005,远 = 0.001,非常远 = 0.01,非常非常远 = 0.1 等(均以度为单位)。

在上一个问题中,您要求最快的方式,您的方向是正确的。

于 2011-12-09T17:18:47.450 回答
3

正如这里引用的那样,https: //postgis.net/docs/ST_DWithin.html,ST_DWithin 函数有两种不同的签名。

如果有人想直接使用仪表,则具有布尔标志的第二个签名将起作用。

作为 JPA 示例,我将在下面发布我的查询。

    @Query("select f from Facility as f where dwithin(f.address.coordinates, :center, 10000, true) = TRUE")
    List<Facility> findAllByDistance(@Param("center") Point point);
于 2020-05-20T14:19:14.543 回答
-3

试试下面的查询,它对我来说工作正常。

select * from theuser where ST_DWithin(point , ST_GeomFromText('POINT(120.9982 24.788)',4326) , 0.1/111.325 );

这里,0.1 = 100 米。

于 2014-01-16T09:54:26.227 回答