рассчитать расстояние между разными записями в одном столбце - PullRequest
0 голосов
/ 29 октября 2018

В моей таблице есть такой столбец:

Table A:

geom_etrs(geometry)
"0101000020E8640000FE2EAF0B3C981C414E499E34DFE65441"
"0101000020E864..."
"0101000020E875..."
"0101000020E867..."

Как я могу рассчитать расстояния между каждой из записей (они уже определены как POINT)?

Я хочу создать новый столбец, в котором отображаются расстояния от 1 до 2, затем от 2 до 3, затем от 3 до 4 и т. Д.

Ответы [ 2 ]

0 голосов
/ 29 октября 2018
    select st_distance(point, lead(point,1) over (partition by rn)) 
 from ( select point, row_number() over (partition by id) as rn
 from table_1)t;


    gis=# \d users
     user_id | bigint    |  
     geog    | geography | 

select st_astext(geog), st_astext(lead(geog,1) over (partition by rn)) from ( select geog, row_number() over (partition by user_id) as rn from users limit 10)t;
                 st_astext                 |                 st_astext                 
-------------------------------------------+-------------------------------------------
 POINT(-70.0777937636872 41.6670617084209) | POINT(-70.0783833464664 41.6675384387944)
 POINT(-70.0783833464664 41.6675384387944) | POINT(-70.0793901822679 41.667476122803)
 POINT(-70.0793901822679 41.667476122803)  | POINT(-70.0787530494335 41.6671461707966)
 POINT(-70.0787530494335 41.6671461707966) | POINT(-70.07908017161 41.6663672501228)
 POINT(-70.07908017161 41.6663672501228)   | POINT(-70.0795407352778 41.6669886861798)
 POINT(-70.0795407352778 41.6669886861798) | POINT(-70.0798881265976 41.6663775240468)
 POINT(-70.0798881265976 41.6663775240468) | POINT(-70.0781470955597 41.6667824284963)
 POINT(-70.0781470955597 41.6667824284963) | POINT(-70.0790447962989 41.6675773546665)
 POINT(-70.0790447962989 41.6675773546665) | POINT(-70.0778760883834 41.6675017901701)
 POINT(-70.0778760883834 41.6675017901701) |

 gis=# select st_distance(geog, lead(geog,1) over (partition by rn)) from ( select geog, row_number() over (partition by user_id) as rn from users limit 10)t;
 st_distance  
--------------
  72.21147623
  84.13511302
  64.48606246
  90.70040367
  78.96272466
  73.78817244
 151.81026032
 115.69092832
  97.69189128

Это должно сработать для вас

0 голосов
/ 29 октября 2018

Использование оконной функции LEAD дает следующее значение в качестве нового столбца рядом с текущим значением: demo: db <> fiddle (только с типом text, потому что скрипка не поддерживает geometry, но она такая же)

SELECT 
    point_column,
    LEAD(point_column) OVER ()
FROM
    table

Теперь вы можете рассчитать расстояние с помощью PostGIS 'st_distance:

SELECT 
    st_distance(
        point_column,
        LEAD(point_column) OVER ()
    )
FROM
    table
...