전체 목차 열기 · 10부 35장

PART 04 / CHAPTER 13

13 · 자료 취득·인코딩·품질·라이선스

파일을 읽은 뒤 중복·누락·좌표·라이선스를 검토하는 절차를 배웁니다.

이 페이지에서

학습 목표: 파일을 읽은 뒤 중복·누락·좌표·라이선스를 검토하는 절차를 배웁니다.

준비: 실행 환경 · 도구와 용어. 예제 자료는 별도 표시가 없는 한 합성 자료입니다.

개념

자료 품질은 geometry가 존재하는지뿐 아니라 속성의 의미와 기록 시점까지 포함합니다. 중복 ID는 갱신 이력 또는 여러 도형 조각일 수 있고, 빈 높이는 0m와 다릅니다. 인코딩은 문자와 바이트를 연결하는 규칙입니다. 오래된 SHP/CSV 한글이 깨지면 원본의 CP949·UTF-8 같은 인코딩 정보를 확인해야 합니다.

라이선스는 데이터 사용과 배포의 조건입니다. 코드의 라이선스와 입력 자료의 라이선스는 별개이며, 분석 결과를 게시할 때도 원자료 조건을 확인합니다.

왜 필요한가

누락 높이를 0으로 바꾸면 저층 지역으로 잘못 분류할 수 있습니다. 중복 건물을 그대로 집계하면 밀도가 과장됩니다. 검사 결과는 수정 전에 기록해야 합니다.

핵심 API

isna(), duplicated(..., keep=False), geometry.is_valid, geometry.is_empty, crs, total_bounds를 확인합니다. 삭제·대체 규칙을 적용하기 전에 원본 행 수와 문제 행을 별도 보관합니다.

최소 실행 예제

import geopandas as gpd
from shapely.geometry import box

data = gpd.GeoDataFrame(
    {"id": ["A", "A", "B"], "height_m": [9.0, 9.0, None]},
    geometry=[box(0,0,10,10), box(0,0,10,10), box(20,0,30,10)],
    crs=5179
)
report = {
    "rows": len(data),
    "duplicate_id_rows": int(data["id"].duplicated(keep=False).sum()),
    "missing_height_rows": int(data["height_m"].isna().sum()),
    "invalid_geometry_rows": int((~data.geometry.is_valid).sum()),
}
assert report["duplicate_id_rows"] == 2
assert report["missing_height_rows"] == 1
print(report)
print("검사만 수행했으며 자동 삭제·0 대체는 하지 않았습니다.")

조경·도시 실무 예제

같은 ID가 건물 동별 조각인지 완전 중복인지 확인하고, 중복 제거 기준을 집필 노트에 적습니다. 출처 기록에는 제공기관·제품명·취득일·관측일·CRS·라이선스·가공 절차를 포함합니다.

시각화와 결과 읽기

문제 행만 지도에 강조하면 누락이 특정 지역에 집중되는지 알 수 있습니다. 높이 없음과 높이 0은 서로 다른 범례로 표시합니다.

흔한 오류

자료 전체를 dropna() 하면 중요 지역이 사라질 수 있습니다. 유효하지 않은 폴리곤을 복구하면 GeometryCollection이 나올 수 있습니다. 같은 포털의 다른 제품 라이선스를 복사하지 않습니다.

연습문제

ID가 같은데 높이가 다른 행을 추가하고, 최신 날짜를 기준으로 선택하는 규칙이 가능한지 필요한 추가 속성을 적으세요.

전체 예제 내려받기 · 실행: python chapter13.py

다음 단계

14 · 건물·도로·필지·녹지의 관계로 이어집니다.

출처

GeoPandas missing geometry, 공공누리 이용조건. 확인 2026-09-30.