콘텐츠로 이동

DE-9IM 공간 관계 판정

11/12(목)

한 줄 요약: DE-9IM은 두 도형이 "안에 있나, 겹치나, 맞닿기만 하나, 안 만나나"를 정확히 가리는 국제 표준 판정 방식이다. 정확하지만 무거워서, 실무에선 H3 같은 격자로 후보를 먼저 거른 뒤 남은 것만 DE-9IM으로 판정한다.

📍 만난 상황

  • 2026-11-12 — 재난안전AI 1단계 평가 발표자료 초안을 검토하던 중이었다. 직전에 2페이지(52번) 수정 후보로 "H3 표기", "[지자체 동적] 이름표" 등이 정리됐다는 답을 들었다. 슬라이드에 적힌 "DE-9IM"이 무엇인지 몰라 15:32에 "DE-9IM은 뭐여?"라고 물었다. H3와 어떤 관계인지도 몰랐다. → 그날 일지

🧩 쉽게 말하면

지도 위에 침수 구역과 건물이 있다고 하자. "이 건물이 침수 구역 안이야?"라는 질문은 사람 눈엔 쉽다. 그런데 컴퓨터에겐 애매하다. 담에 붙어만 있으면 안인가, 밖인가?

DE-9IM은 이걸 체크리스트 9칸으로 정리한 것이다. "안쪽끼리 겹치나? 테두리끼리 만나나? …"를 9번 묻고, 답의 모양으로 관계 이름을 붙인다.

이게 없으면 프로그램마다 "안"의 뜻이 달라진다. 같은 데이터로 A 도구는 "포함", B 도구는 "접촉"이라고 답하는 일이 생긴다.

📖 제대로 알기

이름과 표준

  • DE-9IM: Dimensionally Extended 9-Intersection Model(차원 확장 9교차 모델).
  • OGC Simple Features(OGC: 국제 공간정보 표준 기구가 정한 점·선·면 도형 표준)에 들어 있다.
  • PostGIS(PostgreSQL의 공간 확장)의 ST_Relate, ST_Contains, ST_Intersects나 파이썬 Shapely가 모두 이 모델로 판정한다. 특정 회사 기술이 아니다.

도형을 세 부분으로 나눈다

도형 내부(Interior) 경계(Boundary)
점 점 자체 없음
선 양 끝을 뺀 나머지 양 끝점 두 개
면(폴리곤) 테두리 안쪽 테두리 선

외부(Exterior)는 내부와 경계를 뺀 나머지 전부다.

9칸과 차원 값

도형 A의 세 부분 × 도형 B의 세 부분 = 3×3=9칸이다. 칸마다 "둘이 겹치는 부분이 무엇인가"를 적는다. - F: 안 겹침 - 0: 점으로 겹침 - 1: 선으로 겹침 - 2: 면으로 겹침

이 9글자를 한 줄로 이으면 DE-9IM 행렬 문자열이 된다. 예: 212101212. "차원 확장"이란 말은 겹침 여부(예/아니오)만이 아니라 점·선·면 중 무엇으로 겹치는지까지 적는다는 뜻이다.

이름 붙은 관계(술어)

관계 뜻 침수 예
Within / Contains 한쪽이 다른 쪽 안에 완전히 구역 안 건물
Intersects / Overlaps 일부라도 겹침 구역에 걸친 도로
Touches 경계만 닿고 안쪽은 안 겹침 구역 바로 옆 건물
Disjoint 전혀 안 만남 영향 없음

술어(predicate: 참/거짓을 돌려주는 판정 함수)마다 9칸 패턴이 정해져 있다. 예를 들어 Contains는 T*****FF*다. T는 "겹침(0·1·2 아무거나)", *는 "상관없음"이다.

⚙️ 어떻게 동작하나

한 쌍을 판정할 때

  1. 두 도형을 각각 내부·경계·외부로 나눈다.
  2. 9개 조합마다 교집합을 계산하고, 그 차원(F·0·1·2)을 적는다.
  3. 9글자 문자열을 술어 패턴과 맞춘다. 맞으면 그 관계다.

많은 도형을 판정할 때: 2단계 정합

9칸 계산은 도형의 꼭짓점이 많을수록 무겁다. 서울 건물 70만 동을 침수 구역과 하나하나 비교하면 오래 걸린다. 그래서 둘로 나눈다.

  1. 대충 거르기: H3(지구를 육각형 격자로 나눈 체계) 칸 번호가 같거나 이웃인 건물만 고른다. 번호 비교라 매우 빠르지만, 칸 단위라 정확하지 않다.
  2. 정밀 판정: 남은 후보 몇백 동만 실제 도형끼리 DE-9IM으로 판정한다.

flowchart LR
    A["서울 건물<br/>70만 동"] -->|"① H3 격자로 거르기"| B["후보<br/>몇백 동"]
    B -->|"② DE-9IM 판정"| C["구역 안"]
    B --> D["경계에 걸침"]
    B --> E["맞닿기만"]
    B --> F["실제로는 무관"]
격자는 "근처일 수 있는 것"만 남기고, DE-9IM이 진짜 관계를 확정한다. 속도와 정확도를 함께 얻는 구조다.

🧪 예시

  • 예시 1 · 일상에 빗대어: 학교 운동장(침수 구역)에 학생 1,000명이 있는지 확인한다고 하자. 1,000명 모두에게 줄자를 대면 하루가 걸린다. 먼저 "운동장이 있는 블록 번호"에 사는 학생 40명만 고른다(격자). 그다음 40명만 줄자로 재서 "운동장 안 12명, 담에 붙은 3명, 실제론 밖 25명"으로 나눈다(DE-9IM).

  • 예시 2 · 실제로는: PostGIS에서 2단계 정합을 SQL로 쓰면 이런 모양이다.

    SELECT b.id,
           ST_Relate(b.geom, z.geom)  AS de9im,
           ST_Within(b.geom, z.geom)  AS inside,
           ST_Touches(b.geom, z.geom) AS touch
    FROM building b
    JOIN flood_zone_cell c ON c.h3 = b.h3_r9
    JOIN flood_zone z      ON z.id = c.zone_id
    WHERE ST_Intersects(b.geom, z.geom);
    
    ① JOIN ... c.h3 = b.h3_r9: 건물과 침수 구역이 같은 H3 칸에 있는지로 후보를 고른다(1단계). ② ST_Intersects: 조금이라도 만나는 것만 남긴다. ③ ST_Relate: 9글자 행렬을 그대로 돌려준다. 겹치는 두 면이면 212101212가 나온다. ④ ST_Within, ST_Touches: 패턴을 미리 정해 둔 술어다. 참/거짓으로 답한다.

Shapely에서는 a.relate(b)가 행렬 문자열을, a.relate_pattern(b, "T*****FF*")가 패턴 일치 여부를 돌려준다.

⚖️ 비교 · 흔한 오해

구분 H3 격자 DE-9IM
정체 지구를 칸으로 나눈 번호 체계 두 도형 관계를 정하는 판정 규칙
속도 매우 빠름(번호 비교) 느림(도형 계산)
정확도 칸 크기만큼 오차 정확
  • 오늘 헷갈린 점: "H3와 DE-9IM은 같은 종류의 기술인가?" 아니다. H3는 위치에 번호를 붙이는 방법이고, DE-9IM은 관계를 판정하는 규칙이다. 발표자료에 둘이 나란히 적혀 있어 경쟁 기술처럼 보이기 쉽다. 실제로는 앞뒤로 이어지는 단계다.
  • 오해: DE-9IM은 빠르게 하려는 기술이다. 반대다. 정확하게 하려는 규칙이고, 빠르게 하는 건 격자(또는 공간 인덱스)의 몫이다.
  • 오해: Contains와 Covers는 같다. 점이 면의 테두리 위에 있으면 Contains는 거짓, Covers는 참이다. Contains는 "내부끼리 반드시 겹침"을 요구하기 때문이다.
  • 오해: Within과 Contains는 같다. 방향만 반대다. A Within B이면 B Contains A다.
  • 오해: 격자에서 빠지면 무관하다. 건물을 중심점 한 칸에만 넣으면, 칸 경계에 걸친 건물을 놓친다. 그래서 이웃 칸까지 후보에 넣는다.

🛠️ 실무에서는

  • 대상이 수천 개를 넘으면 무조건 거르기 → 판정 2단계로 간다. 거르기는 H3 격자, 바운딩 박스(도형을 감싸는 사각형), 공간 인덱스(GiST 등) 중 하나를 쓴다.
  • PostGIS의 ST_Intersects·ST_Contains는 인덱스가 있으면 내부에서 바운딩 박스로 먼저 거른다. 같은 2단계 아이디어다.
  • 체크리스트
  • 두 도형의 좌표계(SRID)가 같은가? 다르면 판정이 엉뚱하게 나온다.
  • "안"의 정의가 Within인가 Covers인가? 경계 위 처리 방침을 먼저 정한다.
  • 격자 해상도가 대상 크기에 맞는가? 너무 크면 후보가 많고, 너무 작으면 이웃 칸이 많아진다.
  • 결과가 이상하면 ST_Relate로 9글자 행렬을 직접 찍어 본다. 어느 칸이 예상과 다른지 바로 보인다.
  • 발표·문서에서는 "구현됨"과 "설계만"을 구분한다. 오늘 확인한 바로는 DE-9IM·H3 정합은 설계 단계이고 D.Hub 파이프라인엔 아직 없다.

❓ 자주 묻는 질문

  • Q. 9칸을 다 외워야 하나? A. 아니다. 보통은 ST_Within 같은 이름 붙은 술어만 쓴다. 9칸은 술어로 표현이 안 되는 특수한 관계를 정할 때나 디버깅할 때 본다.
  • Q. H3 없이 DE-9IM만 쓰면 안 되나? A. 대상이 적으면 된다. 많으면 느려서 실무에서 못 쓴다.
  • Q. 발표에서 질문받으면 어떻게 답하나? A. "두 공간 객체의 포함·교차·접촉 관계를 판정하는 OGC 국제 표준 모델입니다. 격자로 후보를 빠르게 고른 뒤 이 표준으로 정밀 판정해 속도와 정확도를 함께 확보합니다."

🔭 더 깊이 보기

📚 참고 자료

  • ST_Relate (PostGIS 공식 문서, 영문) — 9글자 행렬과 패턴 매칭 사용법 · 링크
  • Dimensionally Extended 9-Intersection Model (PostGIS 입문 워크숍, 영문) — 그림으로 보는 내부·경계·외부와 9칸 · 링크
  • DE-9IM (위키백과, 영문) — 술어별 패턴 표 정리 · 링크

🗓️ 이력

  • 2026-11-12: 발표자료의 DE-9IM이 무엇이고 H3와 어떤 관계인지 물었다 → 일지

🕸️ 연결된 주제