Ответ 1
С момента написания этого я обнаружил "географический", а не тип "геометрия" в PostGIS, который мог бы делать именно то, что я хочу.
Это, наверное, простой вопрос, но я не очень хорошо разбираюсь в 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.
С момента написания этого я обнаружил "географический", а не тип "геометрия" в PostGIS, который мог бы делать именно то, что я хочу.
Вы можете использовать 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 |