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,但仍然在程度上)谢谢。
答案 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米。