발행물

Research Note 002 · 시스템

Atlas 공간 측량의 구조와 검증

전력 지도도, 날씨 모델도, 도시 지표도 결국 같은 질문에서 출발합니다. 이 월드에는 무엇이 지어져 있는가. Atlas는 그 질문에 답하는 측량 시스템입니다.

2026.07.16 PLAYCITY Research 18분 읽기

PLAYCITY의 도시는 Minecraft 월드 파일 안에 있습니다. 건물도, 조명도, 논밭도 전부 블록입니다. 그 블록 더미에서 도시에 대해 말할 수 있는 것을 꺼내는 일이 Atlas가 하는 일입니다. 서버에 접속하지 않고, 저장된 월드 파일을 직접 읽습니다.

무엇을 측량하는가

Atlas는 Minecraft 1.18 이후의 Anvil 월드 파일을 입력받아 공간 근거를 계산하는 결정론적 측량 시스템입니다. 학습 모델이 아닙니다. 가중치도, 체크포인트도, 난수 시드도 없습니다. 블록 분류표와 임계값, 집계 규칙만 있습니다. 같은 월드 스냅샷과 같은 설정을 넣으면 언제나 같은 결과가 나옵니다.

Atlas가 답하려는 질문은 네 가지입니다. 어느 구역에 설치된 조명이 얼마나 있는가. 어느 표면이 물이고 숲이고 농경지인가. 날씨 모델에 필요한 고도와 경사와 생물군계는 어떤 값인가. 특정 경계 안에서 인공 피복과 상대 높이는 어느 정도인가.

월드 파일(.mca) → Atlas 측량 → 공간 근거 → 전력 지도 · 날씨 모델 · 개발밀도 · 지도 경계

중요한 것은 Atlas가 하지 않는 일입니다. 실제 전력 소비나 발전량을 계산하지 않습니다. 건물 객체 수, 층수, 연면적, 용적률을 세지 않습니다. 법정 경계를 만들거나 판정하지 않습니다. 경로 탐색이나 교통 네트워크를 다루지 않습니다. 사용자 활동이나 식별자는 아예 입력에 들어오지 않습니다.

월드를 읽는 구조

Minecraft 월드는 계층 구조로 저장됩니다. 리전 파일 하나가 512×512블록이고, 그 안에 청크가 32×32개, 청크 하나는 16×16 기둥, 다시 16블록 높이의 섹션으로 나뉩니다. 섹션은 블록을 그대로 담지 않고 팔레트와 압축된 인덱스로 담습니다.

world → dimension → region (.mca, 512×512블록)
  → chunk (16×16 기둥) → section (16×16×16블록)
    → palette + packed indices + biome palette

전체 월드는 리전 18,445개, 원본 82.16GiB입니다. 이걸 전부 메모리에 풀면 스캔이 끝나지 않습니다. Atlas는 대신 단계마다 다룰 양을 줄입니다. 각 단계를 눌러 무엇이 얼마나 줄어드는지 확인할 수 있습니다.

데이터 분석 파이프라인

월드 근거를 분석 가능한 셀로 바꾸는 흐름

Atlas는 원본 블록을 외부로 펼쳐 놓지 않습니다. 리전 안에서 필요한 표면만 읽고 고정 격자로 축약한 뒤, 분모와 실패 범위를 함께 저장합니다.

  1. 01 스냅샷 식별 월드·차원·리전 파일과 분류 규칙, 표본 간격, 격자 크기를 고정합니다.
  2. 02 리전 분배 독립적인 512블록 리전을 병렬 작업으로 나누고 캐시 식별자를 비교합니다.
  3. 03 선택적 해독 관심 팔레트가 있는 섹션만 풀고 최상단 표면과 발광 상태를 읽습니다.
  4. 04 셀 축약 표본을 청크·128/256블록 환경 셀·16블록 밀도 셀의 누적값으로 줄입니다.
  5. 05 불변식 검사 예상·유효·결측 표본과 표면 합, 좌표 경계, 원천 변경 여부를 확인합니다.
  6. 06 근거 발행 immutable run과 공개 격자를 만들고 날씨·전력·개발밀도 소비자에 전달합니다.
분석 단위 · region → section/palette → sampled column → fixed cell → quality gate → immutable output. 원본 월드, 운영 절대경로와 좌표별 원시 산출물은 공개 범위에서 제외합니다.

월드 파일을 그대로 읽습니다

서버에 접속하지 않고 저장된 리전 파일을 직접 엽니다. 서버를 멈추지도, 청크를 강제로 불러오지도 않습니다. 이 시점의 입력은 월드 전체입니다.

82.16GiB 원본 18,445리전

정리하면 세 가지입니다. 리전을 병렬로 읽고, 볼 필요 없는 섹션은 풀지 않고, 바뀌지 않은 파일은 다시 계산하지 않습니다.

리전 18,445개, 원본 82.16GiB를 372.6초에 훑습니다.

네 가지 측량

조명

청크마다 발광 블록의 밝기 값을 더합니다. 랜턴은 15, 횃불은 14, 바다 랜턴은 15입니다. 화로는 불이 켜져 있을 때만 13이고 꺼져 있으면 0입니다. 자연 지형의 광원은 기본적으로 세지 않으며, 명시적으로 포함하도록 설정해야만 들어옵니다.

emission(block, state) = override → natural exclusion → state rule → fixed table → 0
total_light(chunk) = sum_block emission(block, state)
mean_emission = total_light / emitting_block_count

명시한 override가 가장 먼저 적용됩니다. 그다음 자연 광원을 제외하고, 화로·촛불·리스폰 정박기처럼 상태에 따라 달라지는 규칙, 고정 발광표 순서로 값을 찾습니다. 어느 표에도 없는 블록은 0입니다. 단위는 emission points이지 와트가 아닙니다. 이 구분이 중요한 이유는 뒤에서 다시 설명합니다.

지표

각 기둥의 최상단 블록을 겹칠 수 있는 비트 플래그로 분류합니다. 물 1, 농경 2, 수중 교량 4, 나무 8, 풀 16, 눈 32입니다. 물에 잠긴 블록은 물 근거를 함께 가질 수 있습니다. 결과는 1픽셀이 1블록인 흑백 PNG로도 나옵니다.

evidence_mask(column) = bit_or(flags(top_non_air_block))
primary_surface = first(ice_snow, water, agriculture, tree, low_vegetation, bare, rock, built, other)
coverage(cell) = valid_surface_samples / expected_surface_samples

환경

128 또는 256블록 셀마다 고도의 최소·최대·평균·표준편차와 10·50·90분위수, 피복 근거, 서로 배타적인 대표 표면, 농경지와 작물 수, 생물군계 히스토그램을 계산합니다. 모든 리전을 합친 뒤 이웃 셀의 중앙값 차이로 경사를 만듭니다.

gradient_x = (elevation_p50[east] - elevation_p50[west]) / horizontal_distance
gradient_z = (elevation_p50[south] - elevation_p50[north]) / horizontal_distance
slope_degrees = atan(sqrt(gx² + gz²)) × 180/π
biome_entropy = -sum_b p_b * ln(p_b)

양쪽 이웃이 있으면 중앙 차분을 쓰고, 한쪽만 있으면 단측 차분을 씁니다. 생물군계 엔트로피는 자연로그 단위인 nat이며, 한 생물군계가 지배하면 0에 가까워지고 여러 종류가 고르게 섞이면 커집니다. 대표 표면 개수는 반드시 water + ice_snow + tree + agriculture + low_vegetation + bare + rock + built + other = valid_samples를 만족해야 합니다. 이 항등식이 깨지면 집계가 잘못된 것입니다. 이 조건은 자동 검사로 강제됩니다.

개발밀도

원이나 다각형 경계를 블록 중심 기준으로 래스터화하고, 최상단 표면을 물 → 녹지 → 인공 → 기타 우선순위로 한 번만 분류합니다.

coverage = valid_columns / expected_columns
gross_built_fraction = built / valid_columns
net_built_density = built / (built + other)
built_height = max(0, built_top_y − local_ground_p50)
net_built_height_density = sum(built_height) / height_eligible_columns
gross_built_height_density = sum(built_height) / height_valid_columns
built_height_coverage = height_samples / built_columns

기준 지면은 농경·낮은 식생·맨땅·암반의 중앙값이고, 표본이 모자라면 주변으로 반경을 넓혀 가며 찾습니다. 끝내 못 찾으면 높이를 0으로 만들지 않고 null로 둡니다. 0과 "모름"은 다른 값이기 때문입니다.

검증된 것

Atlas가 지금까지 확인한 것은 내부 정합성과 처리 성능입니다. 전달된 소스의 검증 기록에는 전체 테스트 76건 통과가 보존되어 있습니다. 음수 좌표, 리전 경계를 가로지르는 경사, 정확한 원·다각형 래스터화, 대표 표면의 배타성, 손상된 팔레트, 0바이트 리전, 밀도 높이와 커버리지가 모두 검사 대상입니다.

동일 범위 성능 비교

100리전 환경 스캔 내부 처리시간

같은 100개 리전을 대상으로 기록한 internal_seconds입니다. 막대는 0초에서 시작하며 캐시 미적중 시간을 100%로 두었습니다.

178.6배 기록상 속도 비 · 소요시간 99.44% 감소
출처 · 보존된 environment 100-region 운영 기록. wall time은 미적중 1.460초, 적중 0.038초로 별도입니다. 원시 timing log와 하드웨어 정보가 없어 다른 환경의 절대 성능으로 일반화할 수 없습니다.
측량 규모와 처리 성능
항목 성격
리전 수18,445조명 캐시 집계
발광 블록22,841,044조명 캐시 집계
emission points 합341,982,274조명 캐시 집계
발광 블록당 평균14.97재계산
전체 월드 원본82.16 GiB보존된 운영 기록
전체 월드 스캔372.6초보존된 운영 기록
100리전 캐시 미적중1.429초보존된 운영 기록
100리전 캐시 적중0.008초보존된 운영 기록
환경 셀66,719보존된 문서 기록

캐시가 하는 일이 숫자로 드러납니다. 같은 100개 리전의 내부 처리시간은 캐시 미적중 1.429초, 적중 0.008초입니다. 이 기준에서 178.6배 차이입니다. 전체 월드 82GiB의 372.6초는 wall time 기록이며, 서로 다른 시간 기준을 한 비율로 섞지 않습니다.

경계 기반 개발밀도는 55개 지역에서 23억 개가 넘는 기둥을 훑었고, 그중 유효한 기둥의 비율은 전체 합산 기준 99.96%입니다. 다만 지역별로 보면 가장 낮은 곳이 98.6%입니다. 전체 평균과 최저값을 섞어 쓰면 안 됩니다.

한계와 사용 범위

가장 먼저 밝혀야 할 한계가 있습니다. Atlas에는 사람이 검증한 공간 정답셋이 없습니다. 그래서 위치 오차, 면적 오차, 누락률, 정밀도와 재현율을 주장할 수 없습니다. 이 보고서가 인용한 숫자가 전부 내부 불변식과 커버리지인 이유입니다. 외부 정확도는 아직 측정된 적이 없습니다.

조명 측량에는 구조적인 한계가 있습니다.

  • emission 합은 전력 소비가 아닙니다. 꺼져 있는 레드스톤 램프도 15로 셉니다. 설치된 조명 용량에 가깝지 사용량이 아닙니다.
  • 분류표에 없는 커스텀 발광 블록은 0으로 처리됩니다. 즉 과소계상 방향으로 틀립니다.
  • 조명 캐시는 초 단위 수정시각에 의존해 환경 캐시보다 변경 감지가 약합니다.

표면과 환경 측량도 마찬가지입니다.

  • 표면 비트마스크의 0은 아무 분류도 안 붙은 정상 지면과 데이터 누락을 구분하지 못합니다.
  • 기본 4블록 간격 표본은 16개 기둥 중 1개만 봅니다. 좁은 수로나 작은 시설은 놓칠 수 있습니다.
  • 경사는 128·256블록 셀의 중앙값 차이라 미세한 산사면을 잃습니다.
  • valid_samples = 0은 근거가 없다는 뜻이지 빈 땅이라는 뜻이 아닙니다.

개발밀도는 이름 때문에 가장 오해받기 쉽습니다.

  • 인공 피복은 도로와 광장과 지붕을 구분하지 않습니다.
  • 녹화 지붕은 녹지로 분류되어 실제 인공 피복을 낮춥니다. 교량과 고가는 반대로 높이를 키웁니다.
  • 높이 proxy는 층수도, 건물별 높이도, 지하도, 용적률도 아닙니다.

쓸 수 있는 것 → 조명 설치 분포, 표면·피복 근거, 고도·경사·생물군계, 경계별 인공 피복 비율
쓸 수 없는 것 → 전력 소비량, 건물 수·층수·연면적, 법정 경계 판정, 위치·면적 정확도

마지막으로 이 보고서 자체의 한계입니다. Atlas의 계산 규칙은 코드로 고정되어 있고 이 문서의 수식은 그 코드와 대조했지만, 원본 월드 파일이 연구 패키지에 포함되어 있지 않아 제3자가 전체 경로를 처음부터 재현할 수는 없습니다. 재배포 가능한 월드 표본과 사람이 검증한 대표 도시 정답셋을 만드는 것이 다음 과제입니다. 그 두 가지가 갖춰지기 전까지 Atlas의 결과는 근거이지 정답이 아닙니다.

전력 지도 살펴보기 BLOCK LAB · 새 창 공통 연구 절차 읽기 Research Note 001