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

时间:2011-12-09 11:23:22

标签: postgresql gis postgis srid

ST_DWithin文件说,第三个参数(距离)以米为单位。但是当我执行一些查询时,它似乎将第3个参数作为'degree'?

这是我简化的表格结构:

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

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

但是如何直接将米作为第3个参数传递(我不想做米/度转换)?我的查询有什么问题?为什么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,但仍然在程度上)谢谢。

5 个答案:

答案 0 :(得分:12)

来自docs

  

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

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

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

答案 1 :(得分:5)

如果你的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
);

答案 2 :(得分:2)

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

在之前的一个问题中,您要求采用最快的方式,您的方向正确。

答案 3 :(得分:2)

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

答案 4 :(得分:-2)

尝试以下查询,它对我来说很好。

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

这里,0.1 = 100米。