Расстояние между 2 точками в Постгисе в сриде 4326 в метрах - PullRequest
19 голосов
/ 11 декабря 2011

Это, вероятно, простой вопрос, но я не очень хорош в PostGIS и не до конца понимаю все это.

В основном у меня есть таблица (nodes) со столбцом POINT (point). Я создал индекс для этого столбца

create index nodes__points on nodes using gist (point)

Столбец был создан с

select addgeometrycolumn('nodes', 'points', 'POINT', 4326, 2)

Я использую srid 4326, потому что я добавляю данные в форме (широта, долгота). (то есть система координат, в которой позиция Дублина, Ирландия, широта = 53,353 лон = -6,264 (который я добавил с GeomFromText('POINT(-6.264 53.535)'))).

Для каждой точки я хочу найти все точки, которые находятся примерно в пределах 1-километрового прямоугольника с центром в этой точке (поэтому selcet a.id, count(*) from nodes as a, nodes as b where SOME_DISTANCE_FUNCTION_HERE(a.point, b.point, 1000) group by a.id;. Это не обязательно должно быть точно, просто грубая цифра. 1-километровый bbox хорош , круг в 1 км - это хорошо. Он не должен быть точно 1 км, просто такого порядка.

ST_Distance / ST_DWithin / и т. Д. все используют единицы измерения SRID, который для 4326 / WGS64 равен градусам (поэтому 1 = 1 градус широты / долготы). Но я хочу использовать метры.

Я пробовал ST_distance_sphere и st_dwithin, которые могут использовать счетчики, но если я это сделаю, explain показывает, что индекс не используется.

Как я могу получить примерно то, что хочу, и использовать географический индекс?

ОБНОВЛЕНИЕ : Это в PostgreSQL 9.1 и PostGIS 2.0 svn build.

Ответы [ 3 ]

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

Вы можете использовать ST_Transform для использования счетчиков, также помните, что не все функции доступны с типами географии, но если вам действительно нужна скорость, используйте ST_DWithin, это самый быстрый способ. Вот примерное соотношение между градусами и градусами:

| places | degrees    | distance |
| ------ | ---------- | -------- |
| 0      | 1.0        | 111 km   |
| 1      | 0.1        | 11.1 km  |
| 2      | 0.01       | 1.11 km  |
| 3      | 0.001      | 111 m    |
| 4      | 0.0001     | 11.1 m   |
| 5      | 0.00001    | 1.11 m   |
| 6      | 0.000001   | 0.111 m  |
| 7      | 0.0000001  | 1.11 cm  |
| 8      | 0.00000001 | 1.11 mm  |
5 голосов
/ 12 декабря 2011

С тех пор, как я написал это, я обнаружил «географический» в отличие от типа «геометрия» в PostGIS, который может делать именно то, что я хочу.

1 голос
/ 26 декабря 2018

Старый вопрос, но вы просто должны разыграть его так: ST_Distance(p.geom::geography, u.geom::geography), где p и u - псевдоним для двух таблиц

...