Apache Superset에서 Custom Map Chart 만들기
Apache Superset에서 GIS 데이터를 활용해 맞춤형 지도를 시각화하는 단계별 가이드를 제공합니다.
개요
Apache Superset에서 GIS 데이터를 활용한 커스텀 맵 차트 생성 방법을 단계별로 설명합니다. 이번 블로그에서는 경기도 부천시의 법정동 SHP 파일을 예제로 하여, Deck.gl Polygon 차트를 통한 지도 시각화 과정을 다룹니다.
목차
- Mapbox API 키 생성
- Superset 카탈로그 생성
- SHP 파일을 GeoJSON으로 변환
- PostgreSQL Geometry 데이터 로드
- 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를 입력하여 카탈로그를 배포합니다.
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에서 파일을 업로드하여 지도 표시 확인
- 좌표계 확인:
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;
성능 최적화
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
선택
결론
이 가이드를 통해 Superset에서 GIS 데이터를 활용한 커스텀 맵 차트를 생성할 수 있습니다.
고려사항
- Mapbox는 무료 사용량 초과 시 유료 전환
- 지명이 영어로 표기되는 제약
- 향후 OpenStreetMap 등 무료 지도 서비스 연동 검토 필요