Расстояние между 2 точками в Постгисе в сриде 4326 в метрах
Это, вероятно, простой вопрос, но я не очень хорош в PostGIS и не до конца понимаю все это.
В основном у меня есть стол (nodes
) со столбцом ТОЧКА (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.
2 ответа
С тех пор, как я написал это, я обнаружил "географический" в отличие от типа "геометрия" в 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 |
Старый вопрос, но вы просто должны бросить так: ST_Distance(p.geom::geography, u.geom::geography)
где p и u - псевдоним для двух таблиц