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

sma*_*ufo 15 gis postgresql 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
Run Code Online (Sandbox Code Playgroud)

所有点都以SRID = 4326存储.

这是查询:

> select * from theuser where ST_DWithin(point , ST_GeomFromText('POINT(120.9982 24.788)',4326) , 100 );
Run Code Online (Sandbox Code Playgroud)

它将第3个参数(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
Run Code Online (Sandbox Code Playgroud)

如果SRID导致此问题,SRID直接使用'meter'作为单位?(我尝试转换为SRID = 2163,但仍然在程度上)谢谢.

rad*_*dek 14

来自文档:

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

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

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

  • 看一下[了解地图投影]的前两章(http://kartoweb.itc.nl/geometrics/Map%20projections/Understanding%20Map%20Projections.pdf),熟悉地理坐标系和投影坐标系之间的区别.选择预计的协调系统取决于几个因素,主要是数据的地理区域,以及您计划用它来衡量的内容.另请参阅GIS SE上的选择坐标系](http://gis.stackexchange.com/questions/2769/choosing-coordinate-systems). (2认同)
  • +1虽然没有第三种选择吗?只需以弧度传递距离(最快,如果可以接受的话) (2认同)

sal*_*sal 7

如果您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
);
Run Code Online (Sandbox Code Playgroud)