명당까치 키코는 한 자리의 산과 물길, 길, 건물을 측정해서 풍수의 기준에 대 보는 서비스입니다. 측정이 정직하려면 자료가 좋아야 하고, 한국에서 좋은 공간 자료는 대부분 공공기관이 갖고 있습니다. 문제는 그 자료가 API 하나로 끝나지 않는다는 점입니다. 신청서를 내고, 승인을 기다리고, 전용 프로그램으로 내려받고, 문서에 없는 형식을 직접 뜯어봐야 합니다.
이 글은 2026년 7월 말부터 9월 초까지 키코의 자료 층을 채우며 내린 결정과, 그 과정에서 틀렸던 것들의 기록입니다. 같은 자료를 쓰려는 개발자에게 지도가 되었으면 합니다.
출발점: 전 지구 30m 지형의 한계
키코는 처음에 누구나 키 없이 쓸 수 있는 전 지구 30m 지형 타일로 시작했습니다. 지금도 이 자료는 모든 곳을 덮는 기본층입니다. 하지만 도시에서는 한계가 뚜렷했습니다. 위성으로 만든 높이 자료라 건물 지붕이 지형처럼 섞여 들어갑니다. 평지인 잠실의 경사가 31.7도로 나오고, 명동의 표고가 47m로 나왔습니다. 풍수의 판단은 “뒤가 높은가, 앞이 트였는가”에서 시작하는데, 건물을 산으로 착각하면 첫 단추부터 틀립니다.
더 정밀한 자료를 찾다가 첫 번째 함정을 만났습니다. 국토정보플랫폼에서 내려받을 수 있는 “공개DEM”은 실제로 받아 보니 셀 크기가 90m였습니다(2026년 7월 29일 확인). 이미 쓰고 있던 30m보다 거친 자료라 쓰지 않기로 했습니다. 이름만 보고 받았다면 정밀도를 오히려 깎을 뻔했습니다.
수치표고모델을 사지 않은 이유
정식 경로는 국토지리정보원의 수치표고모델(DEM)입니다. 포털에서 바로 받는 자료가 아니라 요청해서 받는 자료라 직접 문의했습니다. 답은 이랬습니다. 5m 해상도는 전국 자료가 있고 가격은 최대 36만 원, 1m 해상도는 서울만 있습니다.
결론부터 말하면 둘 다 사지 않았습니다(2026년 8월 6일 결정). 그 사이에 다른 길이 이미 결과를 내고 있었기 때문입니다.
등고선을 보간해 직접 만든 격자
1:5,000 수치지형도는 국토정보플랫폼에서 내려받을 수 있습니다. 여기에는 등고선과 표고점이 들어 있습니다. 공식 수치표고모델도 결국 같은 원천에서 나오되, 거기에 지형 단절선과 항공 레이저 측량 같은 보정이 더해진 것입니다. 그래서 키코는 등고선과 표고점을 모두 하나의 점구름으로 모은 뒤, 거리에 반비례하는 가중 평균(IDW)으로 5m 격자를 채웠습니다.
다만 이 격자를 “실측 5m”라고 부르지 않습니다. 등고선 사이를 저희가 계산으로 채운 것이니까요. 그래서 자료 표기에는 “우리가 기하적으로 파생한 값”이라고 적고, 실효 해상도는 10m, 신뢰도는 0.8로 보수적으로 둡니다. 나중에 실측 자료가 들어오면 해당 범위는 자동으로 실측 표기로 바뀌도록 출처 기록을 따로 남깁니다.
서울 전체를 받는 과정에도 요령이 있었습니다.
- 구 단위 패키지 신청이 가장 빠릅니다. 도엽 하나씩 받는 대신 “패키지 공간정보”에서 시군구 단위로 신청하면 한 구의 모든 도엽이 한 번에 옵니다.
- 같은 도엽이 두 번 들어 있습니다. 구마다 옛 형식(dxf)과 새 형식(shp 묶음)이 함께 오는데, 새 형식만 받으면 구당 약 1.2GB가 70MB 정도로 줄고 이 용도에서는 잃는 것이 없습니다.
- 서울은 1:1,000 도엽이 대부분입니다. 1:1,000 등고선 레이어가 약 3,000개, 1:5,000은 약 270개였습니다. 1:1,000은 등고선 간격이 1~2m라 보간이 훨씬 충실해집니다.
- 도시 전체를 한 번에 돌리면 메모리가 넘칩니다. 그래서 구 단위로 나눠 적재하고, 이미 만든 타일에 새 구를 덧칠하는 방식으로 쌓았습니다. 순서와 상관없이 같은 결과가 나오도록 시험으로 잠가 두었습니다.
결과는 서울 25개 구 전역, 도엽 3,309장, 레이어 6,408개, 보간 점 2,640만 개, z15 타일 993장(63MB)입니다. 건너뛴 도엽은 없었습니다.
효과는 숫자로 확인했습니다.
| 위치 | 30m 기본 자료 | 등고선 보간 |
|---|---|---|
| 잠실(평지) | 경사 31.7° | 경사 0.1° |
| 명동(평지) | 표고 47m | 표고 30m |
| 부암동(골짜기) | 경사 11.6° | 경사 32° |
| 관악산 | 경사 17.1° | 경사 29.3° |
평지에서는 건물 잡음이 사라지고, 실제 지형이 있는 곳은 기복이 살아났습니다. 보정 기준으로 삼는 광화문과 경복궁은 뒷산 방위(각각 20도, 10도)가 그대로 유지됐습니다. 이미 쓸 만한 격자가 있고, 보정 사례들에서 판정이 하나도 나빠지지 않았으니, 유료 자료가 주는 추가 정밀도는 지금의 시험으로는 감지할 수 없는 차이였습니다. 감지할 수 없는 개선에 비용을 쓰지 않기로 했습니다.
30m 자료를 끊지 않은 이유
등고선 격자가 생기자 “서울은 이것만으로 서비스하면 30m 자료 서버가 멈춰도 버틸 수 있지 않을까”라는 생각이 들었습니다. 실제로 구현하고 측정해 본 뒤 기각했습니다. 산줄기를 찾는 계산이 주산(최대 4km)을 기준으로 다시 5km를 훑기 때문에 필요한 반경이 9km였는데, 993장의 타일 중 사방 9km가 빈틈없이 닫히는 곳은 11장(1.1%)뿐이었습니다. 서울 자체가 사방 9km가 안 됩니다. 빈 가장자리를 억지로 채우면 없는 지형을 풍수 판단에 먹이게 되니, 30m 자료를 기본층으로 유지했습니다.
도로명주소 출입구 DB: 신청, 승인, 그리고 19개 열
집이 어느 쪽을 바라보는지는 풍수에서 중요한 질문입니다. 건물 모양만으로는 짐작밖에 할 수 없어서, 행정안전부의 도로명주소 출입구정보를 신청했습니다. 사용 목적 심사를 거치는 자료라 2026년 8월 1일에 신청서를 냈고, 승인을 받아 8월 6일에 전국 17개 시·도 전체분을 내려받아 적재했습니다. 다운로드 창은 30일이었습니다.
내려받기부터 쉽지 않았습니다. 사이트는 파일을 Innorix라는 로컬 전송 프로그램에 넘깁니다. 이 프로그램이 없으면 다운로드 버튼을 누른 탭이 그대로 멈추고 브라우저의 다운로드로 넘어가지 않습니다. 멈춘 화면이 “자료가 없다”는 뜻은 아니라는 점을 기억해 두면 시간을 아낄 수 있습니다.
더 큰 함정은 형식이었습니다. 파서는 16개 열짜리 “위치정보요약DB”를 가정하고 있었는데, 실제로 받은 자료는 19개 열짜리 “출입구정보”였습니다. 좌표 열의 위치가 달라서 그대로 돌렸다면 모든 행이 거절됐을 것입니다. 다행히 거절 비율이 일정 수준을 넘으면 적재를 멈추는 가드가 있었고, 의도대로 멈췄습니다. 추측으로 열을 맞추는 대신 세 개 시·도의 60만 행을 직접 들여다보고 열 구성을 확정한 뒤, 열 개수에 따라 두 형식을 갈라 읽도록 파서를 넓혔습니다.
들여다보며 알게 된 것도 있습니다.
- 출입구정보에는 건물명 열이 아예 없습니다.
- 지하 여부는 0과 1만 있는 줄 알았는데 3도 나옵니다. 그래서 “1이면 지하”가 아니라 “0이 아니면 지하”로 판정합니다. 예전 규칙이었다면 지하 출입구를 지상으로 읽었을 것입니다.
- 좌표계 변환(EPSG:5179 → 경위도)은 우리 구현과 독립된 도구로 다시 계산해 소수점 일곱째 자리까지 일치하는지 확인했고, 시험의 기대값도 우리 코드가 아니라 그 독립 계산값으로 고정했습니다. 시험 데이터 역시 손으로 만든 예시가 아니라 실제 자료의 행을 그대로 넣었습니다. 우리 가정에 동의하도록 손수 만든 예시는 형식이 바뀌어도 통과해 버리기 때문입니다.
결과는 641만 행 중 좌표가 빠진 1.3만 행(0.21%)을 제외한 640만 개 출입구, 타일 4,584장(약 130MB)입니다. 이제 키코는 집의 방향을 건물 모양으로 짐작하지 않고 등록된 출입구 위치로 측정합니다.
건축물대장과 “공유 필지” 버그
3D 지도에 건물을 세우고, 둘레 건물이 터를 누르는지 판단하려면 높이가 필요합니다. 건물 외곽선은 국토교통부의 GIS건물통합정보에서 오는데, 높이가 비어 있는 건물이 많았습니다. 그래서 건축물대장 표제부의 높이와 층수로 빈칸을 채웠습니다.
건축HUB의 대용량 데이터 메뉴에서 전국 표제부를 파일 하나로 받을 수 있습니다. 압축 678MB, 풀면 3.77GB짜리 텍스트입니다. 머리글 행이 없는 파이프 구분 UTF-8인데, 이걸 다른 인코딩으로 잘못 읽으면 에러가 나는 대신 그럴듯하게 깨진 글자가 나옵니다. 틀린 추측이 데이터처럼 보이는 셈이라, 열 위치는 구별 내보내기 파일의 특정 행과 맞춰 보며 검증했습니다.
서울에서 58만 5,896행이 51만 3,036개 필지(PNU)로 묶였고, GIS 자료만으로는 높이를 몰랐던 9만 3,358동의 높이가 채워졌습니다. 서울 건물 69만 5,734동 가운데 높이를 아는 비율이 78.4%에서 89.7%로 올랐습니다. 필지 번호는 결합에만 쓰고 타일에는 기록하지 않습니다.
경복궁의 회랑이 탑이 된 날
9월 7일, 경복궁으로 만든 시연 리딩이 이상한 말을 했습니다. 통로와 행각 같은 낮은 건물들이 터를 짓누르는 덩어리이고, 협곡처럼 좁은 틈을 만들고, 모서리로 찌른다는 것이었습니다.
원인은 결합 방식이었습니다. 건축물대장은 필지 단위라서, 결합할 때 필지의 최대 높이를 그 필지 위의 모든 건물에 붙이고 있었습니다. 경복궁처럼 한 필지에 건물이 여럿 있으면 근정전의 25.3m가 폭 4m짜리 회랑 28곳에 똑같이 번졌습니다. 아파트 단지라면 경비실이 탑 높이를 물려받는 식입니다.
대장에는 필지 번호와 높이, 층수보다 더 세밀한 정보가 없으므로, 쓸 수 있는 신호는 “그 필지에 어떤 외곽선들이 있는가”뿐이었습니다. 그래서 “공유 필지 규칙”을 만들었습니다. 한 필지에 건물이 여럿이면, 대장 높이는 다음 두 조건을 모두 만족하는 건물에만 붙입니다.
- 그 건물의 면적이 필지에서 가장 큰 건물의 40% 이상일 것
- 물려받을 높이가 그 건물의 좁은 폭(면적의 두 배를 둘레로 나눈 값)의 2.5배 이하일 것
나머지 건물은 GIS 자료 자체의 높이와 층수로 돌아갑니다. 서울에서 이 규칙으로 2만 4,600동은 높이를 채우고, 6만 8,800동은 보류했습니다. 담장과 문으로 표시된 지도 객체도 건물 판단에서 따로 빼냈습니다.
다음 날에는 후속 문제를 고쳤습니다. 모서리가 터를 찌른다는 판단(격각살)이 언덕 위에 선 3m짜리 경성전을 칼날로 읽고 있었습니다. “꼭대기가 터보다 얼마나 높은가”만 보다 보니 땅의 높이가 섞인 것입니다. 이제는 건물 자체 높이가 5m 이상이고, 그 꼭대기가 터보다 위에 있을 때만 해당합니다. 전통 문헌은 격각살에 거리만 말하고 높이 문턱은 말하지 않으니 5m는 저희가 정한 숫자입니다. 그래도 이제는 맞는 양을 측정합니다. 이 일에서 얻은 질문 하나를 규칙마다 던지게 됐습니다. 이 규칙은 땅을 포함한 덩어리에 관한 것인가, 건물 자체의 면에 관한 것인가? 뒤가 든든한지, 무언가가 짓누르는지는 지형을 포함해야 하고, 모서리가 찌르는지는 지형을 빼야 합니다.
라이선스 문의 네 건
공공데이터라고 해서 모두 상업 서비스에 마음대로 쓸 수 있는 것은 아닙니다. 공공누리 유형이 다르고, 공공데이터포털에는 “이용 제한 없음”으로 적혀 있어도 실제 다운로드가 다른 기관 사이트로 연결되면 그쪽 약관이 따로 붙기도 합니다. 키코는 확실하지 않은 자료를 쓰기 전에 물어보는 쪽을 택했고, 8월에 네 건을 문의했습니다.
- 용도지역지구(공간정보 다운로드 센터 경유) 저장·가공 범위 — 메일 문의.
- 교통량 자료 — 메일 창구가 없어 전화로 문의했고, 출처를 표시하는 조건으로 이용할 수 있다는 답을 받았습니다. 그런데 서울 교통량의 기준 연도가 2010년이었습니다. 라이선스는 통과했지만 자료가 너무 오래되어 쓰지 않았습니다. 그래서 키코는 차량 통행량을 실측값이 아니라 도로 등급과 차로 수로 짐작하고, 짐작이라고 밝힙니다.
- 연속지적도 상업적 이용 허가 — 공공누리 제4유형(상업적 이용 금지·변경 금지)이라 별도 허가가 필요한지 문의했습니다.
- 수치지형도 등고선의 가공·파생 이용 — 국토지리정보원이 공간정보품질관리원으로 안내해 주었고, 담당자가 서비스를 먼저 보고 싶다고 해서 화면 캡처를 보냈습니다. 이때 3D 지형 화면이 바로 그 등고선 보간 자료로 그려진다는 사실도 먼저 밝혔습니다.
④의 회신은 8월 13일에 왔습니다. 3D 지형 화면은 지도 간행 심사 대상으로 보기 어렵고, 배경 지도에 출처를 확실히 넣어 사용하면 된다는 내용이었습니다. 저희는 이 조건을 코드로 옮겼습니다. 그때까지 자료 출처는 화면 아래쪽 한 줄에만 있었고, 사람들이 캡처해 가는 3D 지도 자체에는 출처가 한 글자도 없었습니다. 이제 지도 위에 지형 출처가 새겨집니다.
이 줄은 손으로 적은 문자열이 아니라, 그 리포트가 실제로 사용한 자료 목록에서 만들어집니다. 이유가 있습니다. 예전에 출처 한 줄을 고정 문자열로 두었더니, 등고선 보간 자료로 만든 서울 리포트에도 “지형: 30m 지형 타일”이라고 적혀 있었습니다. 모든 서술이 근거로 거슬러 올라가야 하는 엔진에서 화면이 실제와 다른 출처를 주장하는 것은 가장 하면 안 되는 일이라, 이 실패를 시험으로 잠가 두었습니다.
받은 답을 과장하지 않으려고 기록도 있는 그대로 남겼습니다. 회신은 비공식적인 짧은 메모였고, 문의한 질문 중 하나에는 답이 없었습니다. 유리한 답을 받았을 때일수록 그 답의 무게를 부풀리지 않는 편이 낫습니다. ①과 ③은 8월 중순 기록 기준으로 회신을 기다리고 있었습니다. 그래서 용도지역과 연속지적도는 적재 파이프라인만 만들어 두었고, 허가가 확인되기 전까지 자료는 서비스에 쓰지 않습니다.
침수 흔적도도 비슷한 이유로 신중하게 다룹니다. 전국을 한 번에 깨끗하게 쓸 수 있는 자료가 없고, 홍수 위험 지도는 상업적 이용이 금지된 유형이라 쓰지 않습니다. 쓰더라도 “기록이 있다”만 말하고, 기록이 없다고 안전하다고 하지 않습니다.
느린 이유를 잘못 짚었던 일
자료를 많이 쓰면 계산이 무거워집니다. 처음 리포트가 느리다고 느꼈을 때는 응답이 6.6MB나 된다는 것을 원인으로 적어 두었습니다. 틀린 판단이었습니다. 그 숫자는 로컬 서버에서 잰 값이었고, 실제 서비스에서는 압축되어 878KB로 전송되고 있었습니다. 첫 응답까지 16~20초 가운데 전송은 0.5초뿐이고 97%가 지형·건물 계산이었습니다.
그래서 같은 자리를 다시 여는 경우는 캐시로 해결했습니다. 무료로 볼 수 있는 지도 응답은 원래 1년간 바뀌지 않는다고 선언해 두었는데, 정작 그 선언을 지키는 캐시가 없었습니다. 캐시를 붙이자 같은 좌표를 다시 여는 시간이 16.5초에서 0.25초가 됐습니다. 결제된 리포트와 생년월일이 들어간 응답은 절대 캐시하지 않습니다. 다만 어떤 자리든 처음 여는 사람은 여전히 12~19초를 기다립니다. 캐시는 계산을 빠르게 하지 않고 두 번째부터 건너뛸 뿐이라, 이것이 다음 과제로 남아 있습니다.
배운 것
- 이름이 아니라 내용을 확인하세요. “공개DEM”은 90m였고, 받은 출입구 자료는 문서의 형식과 달랐습니다.
- 사기 전에 감지할 수 있는지 먼저 물으세요. 더 정밀한 자료가 지금의 시험에서 어떤 판정도 바꾸지 못한다면, 그 돈은 나중에 써도 됩니다.
- 결합 키보다 세밀한 사실을 지어내지 마세요. 필지 단위 자료를 건물 단위로 펼칠 때는 그 필지 안의 구성을 보고 조심스럽게 나눠야 합니다.
- 허가는 쓰기 전에, 출처는 그림 위에. 그리고 받은 답의 무게를 정확히 적어 두세요.
키코가 어떤 자료로 무엇을 측정하는지는 공개 문서 데이터와 한계에 정리되어 있습니다. 서비스는 kiko.jocoding.io에서 써 볼 수 있습니다. 키코는 전통 풍수를 지형 데이터로 다시 읽어 보는 문화·오락 콘텐츠이며, 부동산이나 투자 판단의 근거로 쓰지 않으시길 부탁드립니다.