PostGIS의 시간과 관련하여 포인트 클러스터를 식별하고 단순화하는 방법은 무엇입니까?


11

방금 공간 데이터베이스 작업을 시작했으며 원시 GPS 트랙의 자동 일반화 (고정 추적 빈도)를위한 SQL (PostGIS) 쿼리를 작성하려고합니다. 내가 먼저 고민하고있는 것은 "y 미터 거리 내의 x 포인트"와 같은 쿼리 형태로 정지 포인트를 식별하여 대규모 포인트 클라우드를 대표 포인트로 대체하는 쿼리입니다. 나는 이미 특정 거리 내에서 점을 찍고 스냅 된 것을 세는 것을 깨달았습니다. 아래 그림에서 원시 예제 트랙 (작은 검은 점)과 스냅 된 점의 중심을 컬러 원 (크기 = 스냅 된 점 수)으로 볼 수 있습니다.

여기에 이미지 설명을 입력하십시오

CREATE table simplified AS 
 SELECT count(raw.geom)::integer AS count, st_centroid(st_collect(raw.geom)) AS center
   FROM raw
  GROUP BY st_snaptogrid(raw.geom, 500, 0.5)
  ORDER BY count(raw.geom) DESC;

이 솔루션에 대해 만족할 것 같지만 시간 문제가 있습니다. 도시에서 하루 종일 트랙으로 트랙을 이미징하면 이미 방문한 장소로 돌아갈 수 있습니다. 내 예에서 진한 파란색 원은 두 번 방문한 사람의 집을 나타내지 만 물론 내 쿼리는이를 무시합니다.

이 경우 정교한 쿼리는 연속 타임 스탬프 (또는 id)가있는 포인트 만 수집하므로 여기에 두 개의 대표적인 포인트가 생성됩니다. 내 첫 번째 아이디어는 내 쿼리를 3 차원 버전 (3 차원 시간)으로 수정하는 것이었지만 작동하지 않는 것 같습니다.

아무도 나에게 조언이 있습니까? 내 질문이 명확하기를 바랍니다.


라인 아이디어에 감사드립니다. 아래 스크린 샷에서 볼 수 있듯이 선 스트링을 만들고 단순화하는 것을 깨달았습니다 (점은 원래 점입니다). 여기에 이미지 설명을 입력하십시오 여전히 필요한 것은 휴식 시간 (<x 미터 반경의 x 지점)을 도착 시간과 휴가 시간이있는 한 지점으로 결정하는 것입니다. 다른 아이디어는 무엇입니까?


2
실제로 다른 목적으로 포인트가 필요합니까? 그렇지 않으면 점에서 선을 만든 다음 해당 선을 단순화 / 일반화하는 것이 목적에 도움이 될 것입니다.
Anthony -GISCOE-

2
매혹적인 문제입니다. Mathematica 사이트 mathematica.stackexchange.com/questions/2711 에서 요청한 것과 동일한 질문에서 일부 아이디어를 얻을 수 있습니다 . 모든 답변이 데이터의 시간적 차원을 활용하는 것은 아닙니다 (그러나 내 것은 :-).
whuber

@ Anthony-GISCOE- 그것은 흥미로운 접근법입니다. 포인트 피처가 필요한 경우 일반화 된 선의 정점 또는 gis.stackexchange.com/questions/27102/… 와 같은 선을 따라 새로운 피처를 작성할 수 있습니다 . 나는 아직도 그것들이 원래의 포인트가 아니라는 것을 안다!
andytilia

@ Anthony : 나는 스틸 스탠드와 최소한 시작 및 종료 시간의 "표현"포인트가 절대적으로 필요합니다 ...
Berlin_J

1
postgis-solution을 갖는 것이 정말 유용합니다 :)
Berlin_J

답변:


4

시각화에 필요한 모든 포인트가 실제로 필요한 경우 선을 만들 수 있고 st_simplify (Douglas Peucker 구현)가 작업을 훌륭하게 수행 할 수 있습니다.

경우에 따라 모든 포인트를 저장할 필요가 없으므로 포인트 데이터를 저장하기 전에 필터링 할 수 있습니다 (예 : 피사체가 움직이지 않는 경우). 포인트를 DB에 추가하기 전에 DouglasPeucker 또는 다른 기본 필터를 적용 할 수 있습니다. 또한 Android 위치 API와 같은 일부 GPS 제공 업체는 시간 및 최소 거리를 기반으로 초기 필터링을 자동으로 수행 할 수 있습니다. 경우에 따라 중복 데이터를 유지합니다. 빠른 시각화를 위해 사전 필터링하고 아카이브를위한 전체 로그를 저장합니다. 평범한 스토리지는 요즘 꽤 저렴합니다.


3

그동안 내 문제에 대한 해결책을 찾았습니다.

먼저, 나는 모든 지점에 대해 "거리 유형"을 결정했습니다. 포인트가 다음 포인트에 x 미터 가까이 있으면 "정지"로, 그렇지 않으면 "이동"으로 결정됩니다. 그런 다음 다음과 같은 창 기능을 시작했습니다.

     SELECT t1.id, t1.dist_type, t1."time", t1.the_geom, t1.group_flag, sum(t1.group_flag) OVER (ORDER BY t1.id) AS group_nr
FROM ( SELECT distances.id, distances.the_geom, distances."time", distances.dist_type, 
                CASE
                    WHEN lag(distances.dist_type) OVER (ORDER BY distances.id) = distances.dist_type THEN NULL::integer
                    ELSE 1
                END AS group_flag
           FROM distances) t1;

결과 테이블은 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

간단한 다음 단계는 "중지"포인트를 그룹화하고이 포인트 그룹의 중심을 식별하며 도착 및 출발 시간으로 최소 및 최대 타임 스탬프를 사용합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.