Apache Superset에서 Custom Map Chart 만들기

Apache Superset에서 GIS 데이터를 활용해 맞춤형 지도를 시각화하는 단계별 가이드를 제공합니다.

개요

Apache Superset에서 GIS 데이터를 활용한 커스텀 맵 차트 생성 방법을 단계별로 설명합니다. 이번 블로그에서는 경기도 부천시의 법정동 SHP 파일을 예제로 하여, Deck.gl Polygon 차트를 통한 지도 시각화 과정을 다룹니다.

목차

  1. Mapbox API 키 생성
  2. Superset 카탈로그 생성
  3. SHP 파일을 GeoJSON으로 변환
  4. PostgreSQL Geometry 데이터 로드
  5. Superset Deck.gl Polygon 차트 생성

1. Mapbox API 키 생성

Superset의 Deck.gl 차트는 Mapbox 기반으로 지도를 렌더링하므로 API 키가 필수입니다.

Mapbox 계정 생성

  • Mapbox 웹사이트에서 계정 생성
  • 무료 사용량이 제공되지만 계정 생성 시 신용카드 정보 입력 필요

API 키 생성

  • 계정 대시보드에서 Access Tokens 섹션 이동
  • Create a token 클릭하여 공개 토큰(pk.*로 시작) 생성
  • 생성된 키 복사 (예시): pk.eyJ1IjoieW91cnVzZXJuYW1lIiwiYSI6ImNrd2V3ZjF0ZTAxMzIycW1wZ3Z3M2Z3c3MifQ.abc123

참고: 무료 키는 사용량 제한이 있으므로, 프로덕션 환경에서는 유료 플랜을 고려하세요.


2. Superset 카탈로그 생성

PaasUp DIP 포털에서 Superset 카탈로그 생성시 MapBox의 API_KEY를 입력하여 카탈로그를 배포합니다.

스크린샷 2025-08-21 132548.png


3. SHP 파일을 GeoJSON으로 변환

공공데이터 포털의 SHP(Shapefile) 형식을 Superset에서 사용 가능한 GeoJSON으로 변환하고, 좌표계를 EPSG:4326(WGS84)으로 맞춥니다.

3.1. 변환 방법

Python geopandas 사용

라이브러리 설치:

pip install geopandas fiona shapely

변환 코드:

import geopandas as gpd

# SHP 파일 로드
gdf = gpd.read_file('BADM.shp')

# GeoJSON으로 저장
gdf.to_file('BADM.geojson', driver='GeoJSON')
print("GeoJSON 변환 완료")

GDAL ogr2ogr 사용

GDAL 설치:

  • Ubuntu/Debian: sudo apt-get install gdal-bin
  • macOS: brew install gdal
  • Windows: OSGeo4W 또는 GDAL 바이너리 설치

변환 명령어:

ogr2ogr -f GeoJSON BADM.geojson BADM.shp

3.2. 좌표계 변환

SHP 파일의 좌표계(EPSG:5186)를 EPSG:4326(WGS84)으로 변환합니다.

geopandas 방법

import geopandas as gpd

# SHP 파일 로드 및 좌표계 확인
gdf = gpd.read_file('BADM.shp')
print(gdf.crs)  # 예: EPSG:5186

# 좌표계 변환
gdf = gdf.to_crs(epsg=4326)

# 변환된 GeoJSON 저장
gdf.to_file('BADM_converted.geojson', driver='GeoJSON')
print("좌표계 변환 및 GeoJSON 저장 완료")

ogr2ogr 방법

ogr2ogr -f GeoJSON -s_srs EPSG:5186 -t_srs EPSG:4326 BADM_converted.geojson BADM.shp

변환 결과 확인

  • GeoJSON.io에서 파일을 업로드하여 지도 표시 확인

스크린샷 2025-08-20 172324.png

  • 좌표계 확인: gdf.crs 출력이 EPSG:4326인지 검증

4. PostgreSQL Geometry 데이터 로드

변환된 GeoJSON 데이터를 PostgreSQL/PostGIS에 로드하여 Superset에서 쿼리할 수 있도록 준비합니다.

4.1. 테이블 생성

PostGIS 확장 활성화:

CREATE EXTENSION postgis;

테이블 생성:

CREATE TABLE BADM (
    OBJECT_ID varchar(10), 
    BJD_NAM varchar(100),  -- 법정동명 
    geom GEOMETRY(Geometry, 4326)  -- WGS84 좌표계
);

4.2. 데이터 로드

Python 방법

import geopandas as gpd
from sqlalchemy import create_engine

# GeoJSON 로드
gdf = gpd.read_file('BADM_converted.geojson')

# PostgreSQL 연결
engine = create_engine('postgresql://username:password@localhost:5432/database_name')

# 데이터 로드
gdf.to_postgis('BADM', engine, if_exists='replace', index=False)
print("데이터 로드 완료")

OGR2OGR 방법

ogr2ogr -f "PostgreSQL" PG:"dbname=database_name user=username password=password" BADM_converted.geojson -nln BADM -nlt GEOMETRY -lco GEOMETRY_NAME=geom -lco SRID=4326

로드 확인

SELECT OBJECT_ID, BJD_NAM, ST_AsGeoJSON(geom) AS geojson
FROM BADM
LIMIT 10;

스크린샷 2025-08-20 172718.png

성능 최적화

CREATE INDEX idx_badm_geom ON BADM USING GIST(geom);

5. Superset Deck.gl Polygon 차트 생성

PostgreSQL 데이터를 사용하여 Deck.gl Polygon 차트를 생성합니다.

차트 생성 단계

1. SQL Lab에서 쿼리 작성

Polygon 데이터를 다음 형식으로 출력하는 쿼리를 작성합니다:

  • Polygon: [[경도1, 위도1], [경도2, 위도2], ..., [경도n, 위도n]]
  • MultiPolygon: [[[경도11, 위도11], ...], [[경도21, 위도21], ...]]

쿼리 예시:

SELECT 
    (ST_AsGeoJSON(geom)::jsonb -> 'coordinates' -> 0) #>> '{}' AS border,
    ROUND((ST_Area(ST_Transform(geom, 32652)) / 1000000)::numeric, 2) AS area_km2,
    BJD_NAM
FROM BADM;

2. 데이터셋 추가

  • 작성된 SQL로 새 데이터셋 생성

3. 차트 설정

  • Charts > Create a new chart에서 Deck.gl Polygon 선택
  • Polygon Column: border 선택
  • Metric: 면적(area_km2) 또는 COUNT(*) 설정
  • Map Style: Streets 선택

스크린샷 2025-08-20 173001.png


결론

이 가이드를 통해 Superset에서 GIS 데이터를 활용한 커스텀 맵 차트를 생성할 수 있습니다.

고려사항

  • Mapbox는 무료 사용량 초과 시 유료 전환
  • 지명이 영어로 표기되는 제약
  • 향후 OpenStreetMap 등 무료 지도 서비스 연동 검토 필요

Subscribe to PAASUP IDEAS

Don’t miss out on the latest issues. Sign up now to get access to the library of members-only issues.
jamie@example.com
Subscribe