PostGIS에서 형상별로 그룹화해도 되나요?


17

지오메트리별로 그룹화해도 괜찮습니까?

우리는 학생들의 실사를 계산하기 위해 데이터를 먼저 교차시키는 다각형 기하학으로 많은 계산 포인트를 수행합니다. 학교 경계, 블록 그룹 등으로 :

SELECT
  n.nbhd_id
  , count(*) AS count_burglaries
FROM denver.crime AS c
  JOIN denver.neighborhoods AS n
    ON ST_Intersects(c.geom, n.geom)

WHERE c.offense_ty LIKE 'BURG%'
GROUP BY n.nbhd_id

두 번째 단계는 형상을 폴리곤 테이블에서 카운트 쿼리로 다시 조인하기 위해 하위 쿼리를 래핑하는 것입니다.

SELECT

count.*
, n.nbhd_name
, n.geom
FROM (
SELECT
n.nbhd_id
, count(*) AS count_burglaries
FROM denver.crime AS c
JOIN denver.neighborhoods AS n
ON ST_Intersects(c.geom, n.geom)

WHERE c.offense_ty LIKE 'BURG%'
GROUP BY n.nbhd_id

) AS count

JOIN denver.neighborhoods AS n
ON count.nbhd_id = n.nbhd_id

그러나 GROUP BY에서 지오메트리를 사용할 수도 있습니다.

SELECT
n.nbhd_id
, n.nbhd_name
, n.geom

, count(*) AS count_burglaries
FROM denver.crime AS c
JOIN denver.neighborhoods AS n
ON ST_Intersects(c.geom, n.geom)

WHERE c.offense_ty LIKE 'BURG%'
GROUP BY n.nbhd_id, nbhd_name, n.geom

GROUP BY에 형상을 포함시키는 것이 올바른 방법입니까?


당신은 무엇 GROUP BY을 얻는가? 고유 키로 가입 할 수 nbhd_id없습니까? 정렬 범위를 넓히면 후속 조인보다 런타임이 늘어날 수 있습니다.
Vince

1
nbhd_id에서 조인하기 위해 카운트 쿼리를 하위 쿼리로 래핑 할 필요가 없습니다. 지오메트리별로 그룹화하기 위해 런타임을 늘리면이를 수행하지 않을 수 있습니다. 그렇지 않습니까?
DPSSpatial

답변:


18

이미 고유 ID ( nbhd_id)로 그룹화했기 때문에이 경우 형상을 기준으로 그룹화하는 데 거의 아무런 문제가 없습니다 . 또한 지적한대로 조인을 저장하고 쿼리를 더 깨끗하게 만듭니다.

GROUP BY geomPostGIS 2.3 및 이전 버전 의 절은 실제로 기하학적 평등이 아닌 경계 상자 평등을 기준으로 행을 그룹화 한다는 점을 알아야합니다 . 해석되지 않은 실제 데이터를 사용하면 기하 급수적으로 그룹화하는 것과 같은 효과를 낼 수 있지만 훨씬 빠릅니다. 그러나 여러 개의 개별 다각형에 동일한 경계 상자가있는 경우 예상되는 결과를 얻지 못할 수 있습니다. PostGIS 2.4부터는 GROUP BY지오메트리의 시작점과 방향을 고려하여 기하학적 평등의 엄격한 정의로 작동합니다.

이미 그룹화 중이므로 nbhd_id두 개의 서로 다른 이웃 다각형이 경계 상자를 공유하더라도 여전히 별도의 행이 표시됩니다.


바울의이 기사는이 대답에 어떤 변화가 있습니까? blog.cleverelephant.ca/2017/09/postgis-operators.html
DPSSpatial
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.