Подтвердить что ты не робот

Расстояние между 2 точками в Postgis в srid 4326 в метрах

Это, наверное, простой вопрос, но я не очень хорошо разбираюсь в PostGIS и не полностью понимаю все это.

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

create index nodes__points on nodes using gist (point)

Столбец был создан с помощью

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

Я использую srid 4326, потому что добавляю данные, которые в форме (широта, долгота). (т.е. система координат, в которой позиция Дублина, Ирландия, равна lat = 53.353 lon = -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;. Это не должно быть точным, всего лишь грубой фигурой в стиле hueristic., кружок в 1 км в порядке. Он не должен быть точно в 1 км, только на порядок.

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

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

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

UPDATE. Это на PostgreSQL 9.1 и PostGIS 2.0 svn build.

4b9b3361

Ответ 1

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

Ответ 2

Вы можете использовать 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  |