PostGIS를 사용하여 점에서 선을 작성 하시겠습니까?


10

수많은 차량의 위치 데이터가있는 PostGIS 테이블이 있으며이 지점에서 선을 만들고 싶습니다.

차량 ID별로 데이터를 선택하고 타임 스탬프별로 정렬 할 수 있지만 결과에서 라인을 만드는 방법은 무엇입니까?

기본적으로 필요한 것은 포인트 1에서 포인트 2까지의 한 선 세그먼트입니다. 라인을 마무리 한 다음 다시 포인트 2에서 포인트 3까지입니다. 물론 차량 ID를 고려하는 모든 것.

후자는 차량의 크루즈 방향과 속도를 한 지점에서 다음 지점으로 계산하기 때문에 필요합니다.


1
ST_MakeLine () 함수는 일단 GROUP BY vehicle_id 및 ORDER BY 타임 스탬프가 해결되면이 작업을 수행합니다. 참조 : postgis.refractions.net/docs/ST_MakeLine.html
Micha

좋아, 나는 단순히 그것을 시도하고 다음 진술을 발표했다 : SELECT ais_data.mmsi, ST_MakeLine(ais_data.geom) AS newgeom INTO ais_lines FROM (SELECT * FROM ais_data ORDER BY ais_data.mmsi, ais_data.bs_ts ASC) AS ais_data GROUP BY ais_data.mmsi;그것은 나에게 모든 차량의 트랙을 줄 것이고, 내가 필요한 것이 아니다. ST_MakeLine ()에게 포인트 1에서 포인트 2까지 라인을 생성하도록 지시하는 방법, 라인을 마무리하고 포인트 2에서 포인트 3까지 새로운 라인을 시작하는 방법은 무엇입니까?
Thomas Becker

"포인트 1", "포인트 2", "포인트 3"은 무엇입니까? 그것들을 어떻게 인식합니까?
Micha

타임 스탬프 순서를 통해 인식 할 수 있다고 생각했습니다 ORDER BY ais_data.bs_ts.-가능합니까? 따라서 포인트 1, 포인트 2 등은 기본적으로 Select 문의 결과로 각 줄에 지정된 포인트 정보입니다.
Thomas Becker

메일 링리스트 postgis postgis.17.x6.nabble.com/…의
ThomasG77

답변:


12

자체 조인 또는 상관 된 하위 쿼리를 사용하여 몇 가지 방법으로 수행 할 수 있지만 창 기능을 사용하는 것이 가장 쉬운 방법 일 것입니다.

이 함수 lead()는 주어진 파티션에서 앞선 값을 반환하며 파티션은(PARTITION BY <vehicle_id> ORDER BY <timestamp>)

이 쿼리는 비히클 번호, 파티션에서 해당 포인트의 위치 (이것으로 시작하는 라인의 위치와 동일) 및 라인을 만드는 두 개의 지오메트리를 제공합니다. 물론 마지막 지점에 대해 NULL geom2를 반환하므로 외부 쿼리에서 확인해야합니다.

SELECT mmsi, num, ST_MAKELINE(geom,geom2) FROM (
  SELECT mmsi, row_number() OVER w AS num, geom, lead(geom) OVER w AS geom2
  FROM ais_data WINDOW w AS (PARTITION BY mmsi ORDER BY bs_ts) ) as q
WHERE geom2 IS NOT NULL;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.