ST_DWithin将参数作为度,而不是米,为什么



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)作为'度',因此它返回所有数据,我必须缩小到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直接使用'meter'作为单位?(我尝试转换为SRID=2163,但仍然在程度)谢谢。

From the docs:

对于Geometries:距离以单位指定,单位由几何图形的空间参照系。

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

您必须使用ST_Transform和基于仪表的坐标系统,或两个函数之一:ST_Distance_Sphere(更快,更不准确)或ST_Distance_Spheroid。

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

SELECT *
FROM theuser
WHERE ST_DWithin(
  point::geography,
  ST_GeomFromText('POINT(120.9982 24.788)',4326)::geography,
  100 -- DISTANCE IN METERS
);

我不推荐你把米每次你想使用DWithin,顺便说一下,如果你想米你需要一个等面积投影像阿伯斯投影(有很多),为什么不试试ST_Buffer(点度),看看它在谷歌地球上,使措施,找到一个你喜欢的数字,通常你需要预定义的范围,非常接近= 0.00008,= 0.001,= 0.0005附近真的= 0.01,真的远= 0.1,

在前面的问题中,你问的是最快的路,你问对了方向。

正如这里所引用的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);

试试下面的查询,它对我来说工作得很好。

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

这里,0.1 = 100米

最新更新