IRIS Studio - 서울시 공중화장실 분포 지도
데이터는 서울시 열린 데이터 광장에서 제공하는 공공 데이터인 서울시 공중화장실 위치정보(WGS1984) 입니다.
서울시 지도에 표시된 화장실 위치(위/경도) 외에 접근성 정도를 파악하기 위해 화장실 위치를 중심으로 동,서,남,북으로 각각 50미터와 100 미터 범위로 접근성 range를 표현합니다.
보고서 작성을 위해 IRIS Analyzer 와 IRIS Studio 를 활용합니다.
- IRIS-Analyzer
데이터 추가
- IRIS-Studio
map
콤보박스
Contents
데이터 변환
- 이번 예제는 변환 프로그래밍(python, geoPandas, R 등) 없이 SQL로 직접 geo_json 을 만드는 예제입니다.(보고서 생성일2019년 12월)
추후 Geo Data 변환을 위한 기능을 추가할 예정입니다.
map 을 그리기 위한 데이터로 변환하기
- 원시데이터에 있는 위도, 경도 컬럼으로 부터 map 의 polygon layer 에 필요한 GEOM 데이터를 생성합니다.
화장실의 위/경도 좌표를 사각형 도형의 센터로 두고, 50미터 거리, 100미터 거리의 사각형을 범위로 하는 지도를 그리고자 합니다.
컬럼 GEOM_50M, GEOM_100M 컬럼을 생성합니다.
GEOM_50M 컬럼은 화장실의 위도, 경도를 기준으로 동,서,남,북 4방향으로 각각 50미터씩 떨어진 선으로 이루어진 사각형(polygon)의 꼭지점 GPS좌표입니다.
GEOM_100M 은 100미터 떨어진 선으로 이루어진 사각형의 꼭지점 좌표입니다.
map 을 그리기 위해 GEOM_50M, GEOM_100M 은 다음과 같은 text 타입 데이터로 만들어야 합니다.
{"type": "Polygon", "coordinates": [[[37.5565729005,126.860792131], [37.5574738995,126.860792131], [37.5574738995,126.861924069],
[37.5565729005,126.861924069], [37.5565729005,126.860792131]]]}
위도 0도인 적도에서 위도, 경도 1도의 거리는 111km 입니다.
그러나 위도가 상승할 수록, 경선 간의 거리는 감소합니다.
- 서울의 위도를 북위 37도로 하면 위선 1초의 간격은 31m, 경선 1초의 간격은 24.7m
1도는 60분, 1분은 60초. 즉 1도는 3600초
(표) 위도별 위도와 경도 1도의 길이
위도(도) |
위도 1도의 길이(km) |
경도 1도의 길이(km) |
0 |
110.569 |
111.322 |
5 |
110.578 |
110.902 |
10 |
110.603 |
109.643 |
15 |
110.644 |
117.553 |
20 |
110.701 |
114.650 |
25 |
110.770 |
100.953 |
30 |
110.850 |
96.490 |
35 |
110.941 |
91.290 |
40 |
110.034 |
85.397 |
45 |
111.132 |
78.850 |
50 |
111.230 |
71.700 |
서울의 위도를 37.5도, 경도 127.0도 로 계산하면
서울 위도 : 37.5 경도 : 127.0
(110.941 + 111.034) / 2 = 110.988 km -> 서울 위도 37.5 도 기준 위도 1도에 해당하는 거리
(91.290 + 85.397) / 2 = 88.344 km -> 서울 경도 127.0 도 기준 경도 1도에 해당하는 거리
서울 기준 위도 1도 = 110.988km : 위도 X = 0.05km X = 0.0004504995306159225
0.1km 0.0009009983061231845
서울 기준 경도 1도 = 88.344 km : 경도 Y = 0.05km Y = 0.0005659693923752604
0.1km 0.0011319387847505207
위도, 경도 정보가 있는 원시데이터 테이블에서 동,서,남,북 4개 방향으로 50M, 100M 좌표를 만드는 쿼리
select *,
(LATITUDE - 0.0004504995306) as LAT_S_50M,
(LATITUDE + 0.0004504995306) as LAT_N_50M,
(LONGITUDE + 0.000565969392375) as LNT_E_50M,
(LONGITUDE - 0.000565969392375) as LNT_W_50M,
(LATITUDE - 0.000900998306) as LAT_S_100M,
(LATITUDE + 0.000900998306) as LAT_N_100M,
(LONGITUDE + 0.001131938784751) as LNT_E_100M,
(LONGITUDE - 0.001131938784751) as LNT_W_100M,
'{"type": "Polygon", "coordinates": [[[' ||
LAT_S_50M || ',' || LNT_W_50M || '], [' ||
LAT_N_50M || ',' || LNT_W_50M || '], [' ||
LAT_N_50M || ',' || LNT_E_50M || '], [' ||
LAT_S_50M || ',' || LNT_E_50M || '], [' ||
LAT_S_50M || ',' || LNT_W_50M || ']]]}' as GEOM_50M ,
'{"type": "Polygon", "coordinates": [[[' ||
LAT_S_100M || ',' || LNT_W_100M || '], [' ||
LAT_N_100M || ',' || LNT_W_100M || '], [' ||
LAT_N_100M || ',' || LNT_E_100M || '], [' ||
LAT_S_100M || ',' || LNT_E_100M || '], [' ||
LAT_S_100M || ',' || LNT_W_100M || ']]]}' as GEOM_100M
map 을 위한 데이터 형태
화장실_ID 1
LATITUDE 37.545122 위도
LONGITUDE 127.1197902 경도
LAT_S_50M 37.5446715005 50미터 남쪽방향 위선
LAT_N_50M 37.5455724995 50미터 북쪽방향 위선
LNT_E_50M 127.120356169 50미터 동쪽방향 위선
LNT_W_50M 127.119224231 50미터 서쪽방향 위선
LAT_S_100M 37.5442210017 100미터 남쪽방향 경선
LAT_N_100M 37.5460229983 100미터 북쪽방향 경선
LNT_E_100M 127.120922139 100미터 동쪽방향 경선
LNT_W_100M 127.118658261 100미터 서쪽방향 경선
GEOM_50M {"type": "Polygon", "coordinates":
[[[37.5446715005,127.119224231], polygon 1번쩨 꼭지점
[37.5455724995,127.119224231], polygon 2번쩨 꼭지점
[37.5455724995,127.120356169], polygon 3번쩨 꼭지점
[37.5446715005,127.120356169], polygon 4번쩨 꼭지점
[37.5446715005,127.119224231]]]} polygon 1번쩨 꼭지점(다시 첫번째꼭지점으로 연결해야 4각형이 나옴)
GEOM_100M {"type": "Polygon", "coordinates":
[[[37.5442210017,127.118658261],
[37.5460229983,127.118658261],
[37.5460229983,127.120922139],
[37.5442210017,127.120922139],
[37.5442210017,127.118658261]]]}
1개의 컬럼 데이터 안에 콤마가 있으므로 데이터 구분자를 탭(tab) 으로 저장합니다.
IMPORT Data to IRIS DB
데이터 추가 메뉴
데이터 추가 메뉴

데이터 선택

tab 으로 분리하여 읽어 들인 sample 데이터 모습

데이터 가공 : GPS 좌표 데이터 유형 변경(Text -> Real)

- 데이터 입력 설정IRIS DB 테이블 설정(파티션 키, 파티션 구분 컬럼 지정)
IRIS 에 테이블 생성하는 법 참조하세요.

- 데이터 제출
테이블 생성 및 로딩이 완료되면 작업현황 에 체크가 표시됩니다.


- DB브라우저 메뉴에서 입력한 IRIS table 데이터를 조회해 봅니다.
참고로 일부 사용자 계정에서는 DB브라우저 메뉴에 접근이 되지 않습니다.

IRIS Studio
- 날짜 박스를 선택하면 날짜박스의 속성을 설정할 수 있습니다.
현재 데이터에는 1개의 날짜 2019-12-30 데이터만 있습니다.

날짜 데이터의 시각화 옵션

범위 선택을 위한 콤보 박스 생성 : 50미터, 100미터 범위를 콤보박스에서 선택하게 합니다.

map layer 1
layer map(지도) : open street map 선택합니다.

지도의 기본 위치로 서울이 오도록 한 후 기본값 설정합니다.
레이어는 3개를 설정합니다.

map layer 2
- 두번째 point 레이어는 서울시 공중화장실의 위/경도를 마커로 표시하는 레이어입니다.
데이터 설정하고
DB 테이블에서 화장실별 위/경도를 select 합니다.

- point 레이어의 시각화 설정
마커의 시각화 옵션 : 위/경도 표시 마커에 대한 색깔, 크기와 툴팁 컬럼 지정합니다.

설정값에 따라 나온 지도

map layer 3
- 세번째 range 레이어는 콤보박스에서 선택한 50미터, 100미터에 따라서 사각형 범위가 마커 주변으로 그려집니다.
트리거 실행 : 콤보박스에서 선택된 값을 이벤트로 입력받아 실행되게 합니다.
실행되는 SQL 쿼리
/*+ LOCATION ( PARTITION = '20191230000000' ) */
SELECT
K, UP_DATE, NUM as ID, LATITUDE, LOGITUDE, GEOM_${combo_1}M as GEOM
FROM
ROOT.TEST1_REST_SEOUL_GEOM
;
range 레이어 설정

100 미터 range 일 때

확대 : 50 미터

확대 : 100 미터
