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.