ST_D с параметром в градусах, а не в метрах, почему? - PullRequest
14 голосов
/ 09 декабря 2011

В документе 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 напрямую использует «метр» какЕдиница ?(Я попытался преобразовать в SRID = 2163, но все еще в степени) Спасибо.

Ответы [ 4 ]

12 голосов
/ 09 декабря 2011

Из документов :

Для геометрий: расстояние указывается в единицах, определяемых системой пространственной привязки геометрий.

Если ваши данные имеют значение SRID = 4326, то указанное вами расстояние указывается в градусах.

Вы должны использовать ST_Transform и систему координат на основе метра или одну из двух функций: ST_Distance_Sphere (быстрее, менее точно) или ST_Distance_Spheroid .

6 голосов
/ 14 июля 2015

Если ваш 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 голосов
/ 09 декабря 2011

Я бы не рекомендовал вам преобразовывать в метры каждый раз, когда вы хотите использовать DWithin. Кстати, если вам нужны метры, вам нужна проекция равной площади, например Проекция Альберса (их много), почемуЕсли вы не попробуете ST_Buffer (точка, градусы) и посмотрите, что он делает на Google Планета Земля, произведите измерения и найдите число, которое вам нравится, обычно вам нужны предопределенные диапазоны, например, очень близко = 0,00008, около = 0,0005, далеко = 0,001,действительно далеко = 0,01, действительно очень далеко = 0,1 и т. д. (все в градусах).

В предыдущем вопросе, который вы задавали для быстрого пути, вы находитесь в правильном направлении.

0 голосов
/ 16 января 2014

Попробуйте запрос ниже, он работает нормально для меня.

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

Здесь 0,1 = 100 м

...