DE-9IM 공간 관계 판정¶
한 줄 요약: 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 아무거나)", *는 "상관없음"이다.
⚙️ 어떻게 동작하나¶
한 쌍을 판정할 때¶
- 두 도형을 각각 내부·경계·외부로 나눈다.
- 9개 조합마다 교집합을 계산하고, 그 차원(F·0·1·2)을 적는다.
- 9글자 문자열을 술어 패턴과 맞춘다. 맞으면 그 관계다.
많은 도형을 판정할 때: 2단계 정합¶
9칸 계산은 도형의 꼭짓점이 많을수록 무겁다. 서울 건물 70만 동을 침수 구역과 하나하나 비교하면 오래 걸린다. 그래서 둘로 나눈다.
- 대충 거르기: H3(지구를 육각형 격자로 나눈 체계) 칸 번호가 같거나 이웃인 건물만 고른다. 번호 비교라 매우 빠르지만, 칸 단위라 정확하지 않다.
- 정밀 판정: 남은 후보 몇백 동만 실제 도형끼리 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 국제 표준 모델입니다. 격자로 후보를 빠르게 고른 뒤 이 표준으로 정밀 판정해 속도와 정확도를 함께 확보합니다."
🔭 더 깊이 보기¶
- 공간 인덱스(R-tree, GiST)는 어떻게 후보를 거르나 — H3 대신 DB가 직접 하는 1단계 방식이라서.
- 침수 구역에 "걸친" 건물은 면적의 몇 %가 잠겼나(
ST_Intersection+ 면적) — DE-9IM 다음으로 필요한 정량 판정이라서. - 관련 주제: H3 격자 체계와 해상도, 좌표계 변환과 pyproj, 지오코딩과 참조 데이터 매칭, 데이터 원천 간 엔티티 매칭 — 같은 발표자료에서 함께 나온 "원천 간 대응표"
📚 참고 자료¶
- ST_Relate (PostGIS 공식 문서, 영문) — 9글자 행렬과 패턴 매칭 사용법 · 링크
- Dimensionally Extended 9-Intersection Model (PostGIS 입문 워크숍, 영문) — 그림으로 보는 내부·경계·외부와 9칸 · 링크
- DE-9IM (위키백과, 영문) — 술어별 패턴 표 정리 · 링크
🗓️ 이력¶
- 2026-11-12: 발표자료의 DE-9IM이 무엇이고 H3와 어떤 관계인지 물었다 → 일지