============================================================================== IRIS Studio - 서울시 공중화장실 분포 지도 ============================================================================== | ----------------- 요약 ----------------- | 데이터는 서울시 열린 데이터 광장에서 제공하는 공공 데이터인 | **서울시 공중화장실 위치정보 (좌표계: WGS1984)** | 입니다. | map 에 표시된 화장실 위치(위/경도) 로부터 적절한 접근성 정도를 파악하기 위해 | 화장실 위치를 중심으로 동,서,남,북으로 각각 50미터와 100 미터 범위의 다각형 도형으로 접근성 range를 표현합니다. | 지도 표현 방식 : 지도 레이어, 마커 레이어, polygon 레이어 | 서울 위도 ( 북위 37.5642135° ) / 경도 ( 동경 127.0016985° ) -------------------- 목차 -------------------- - 데이터 설명 - 데이터 변환 - 위/경도 좌표에 범위를 그리기 위한 GEOM 데이터컬럼 추가하기 - Import Data to IRIS DB - IRIS 데이터 추가 메뉴 이용 - IRIS Studio - 보고서 메뉴를 이용하여 맵 그리기 ( 3레이어, 마커, polygon ) | | ------------------ 데이터 출처 ------------------ **데이터 : 서울열린데이터광장** | .. image:: ../images/map_seoul/seoul_RestRoom_data.png :height: 400 :width: 800 :scale: 100% :alt: 이미지 설명 | | -------------------- 최종 지도 예시 -------------------- **서울시 공중화장실 분포 : 최종 결과 예시** | .. image:: ../images/map_seoul/studio_tutorial_map1.png :height: 450 :width: 800 :scale: 100% :alt: 서울시 공중화장실 분포(100미터 polygon map) | | | | -------------------- 원시 데이터 설명 -------------------- - 형태 - 출처 : 서울시 열린데이터광장 서울시 공중화장실 위치정보 - URL http://data.seoul.go.kr/dataList/datasetView.do?infId=OA-1370&srvType=S&serviceKind=1¤tPageNo=1 | .. image:: ../images/map_seoul/raw_seoul_data.png :height: 450 :width: 800 :scale: 100% :alt: 서울시 공중화장실 위치정보 (좌표계: WGS1984)에 대한 파일 | | ----------------- 데이터 변환 ----------------- - 이번 예제는 변환 프로그래밍(python, geoPandas, R 등) 없이 SQL로 직접 geo_json 을 만드는 예제입니다. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 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 타입 데이터로 만들어야 합니다. .. code:: {"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도 로 계산하면 .. code:: 서울 위도 : 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 좌표를 만드는 쿼리 .. code:: 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 을 위한 데이터 형태 .. code:: 화장실_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 --------------------------------- '''''''''''''''''''''''''''' 데이터 추가 메뉴 '''''''''''''''''''''''''''' - 데이터 추가 메뉴 .. image:: ../images/map_seoul/datamenu.png :height: 450 :width: 800 :scale: 100% :alt: 메뉴 화면 | - 데이터 선택 .. image:: ../images/map_seoul/dataadd_1.png :height: 450 :width: 800 :scale: 100% :alt: 데이터 추가 메뉴 1단계 | - 데이터 가공 .. image:: ../images/map_seoul/dataadd_proc.png :height: 450 :width: 800 :scale: 100% :alt: 데이터 추가 메뉴 2단계 | - 데이터 가공 : GPS 좌표 데이터 유형 변경(Text -> Real) .. image:: ../images/map_seoul/data_type_2.png :height: 350 :width: 400 :scale: 100% :alt: 데이터 추가 메뉴 3-2단계 | - 데이터 입력 설정 : IRIS DB 테이블 설정(파티션 키, 파티션 구분 컬럼 지정) .. image:: ../images/map_seoul/datatable1.png :height: 450 :width: 800 :scale: 100% :alt: 데이터 추가 메뉴 3-2단계 | - 데이터 제출하기 메뉴 .. image:: ../images/map_seoul/datapull_1.png :height: 450 :width: 800 :scale: 100% :alt: 데이터 추가 메뉴 4-1단계 | | 입력이 정상적으로 완료된 경우의 화면입니다. .. image:: ../images/map_seoul/datapull_2.png :height: 450 :width: 800 :scale: 100% :alt: 데이터 추가 메뉴 4-1단계 | - DB브라우저 메뉴에서 입력한 IRIS table 데이터 조회해 봅니다. .. image:: ../images/map_seoul/db_call.png :height: 450 :width: 800 :scale: 100% :alt: 데이터 추가 메뉴 4-1단계 | | ---------------------------------- IRIS Studio ---------------------------------- ''''''''''''''''''''''''''''''''''''''''' 보고서 화면 생성 ''''''''''''''''''''''''''''''''''''''''' ..................... 날짜 박스 생성 ..................... - 날짜 박스를 선택하면 날짜박스의 속성을 설정할 수 있습니다. - 현재 데이터는 1개의 날짜 2019-12-30 데이터만 있습니다. .. image:: ../images/map_seoul/datetime.png :height: 450 :width: 800 :scale: 100% :alt: 날짜 속성 | - 날짜 데이터의 시각화 옵션 .. image:: ../images/map_seoul/dateopt.png :height: 450 :width: 800 :scale: 100% :alt: 날짜 시각화옵션 | - 범위 선택을 위한 콤보 박스 생성 : 50미터, 100미터 범위를 콤보박스에서 선택하게 합니다. .. image:: ../images/map_seoul/com.png :height: 450 :width: 800 :scale: 100% :alt: 콤보박스 | | ''''''''''''''''''''''''''''''''''''''''''' map layer 1 ''''''''''''''''''''''''''''''''''''''''''' - layer map(지도) : open street map 선택합니다. .. image:: ../images/map_seoul/map_1.png :height: 450 :width: 800 :scale: 100% :alt: layer_map_1-1 | - 지도의 기본 위치로 서울이 오도록 한 후 기본값 설정합니다. - 레이어는 3개를 설정합니다. .. image:: ../images/map_seoul/map3_1.png :height: 450 :width: 800 :scale: 100% :alt: layer_map_1-2 | | '''''''''''''''''''''''''''''''''''''''''''' map layer 2 '''''''''''''''''''''''''''''''''''''''''''' - 두번째 point 레이어는 서울시 공중화장실의 위/경도를 마커로 표시하는 레이어입니다. - 데이터 설정하고 - DB 테이블에서 화장실별 위/경도를 select 합니다. .. image:: ../images/map_seoul/map_4.png :height: 450 :width: 800 :scale: 100% :alt: layer_map_2-1 | - point 레이어의 시각화 설정 - 마커의 시각화 옵션 : 위/경도 표시 마커에 대한 색깔, 크기와 툴팁 컬럼 지정합니다. .. image:: ../images/map_seoul/map_5.png :height: 450 :width: 800 :scale: 100% :alt: layer_map_2-2 | | - 설정값에 따라 나온 지도 .. image:: ../images/map_seoul/map_6.png :height: 450 :width: 800 :scale: 100% :alt: layer_map_2-3 | | | ''''''''''''''''''''''''''''''''''''''''''' map layer 3 ''''''''''''''''''''''''''''''''''''''''''' | - 세번째 range 레이어는 콤보박스에서 선택한 50미터, 100미터에 따라서 사각형 범위가 마커 주변으로 그려집니다. - 트리거 실행 : 콤보박스에서 선택된 값을 이벤트로 입력받아 실행되게 합니다. | | - 실행되는 SQL 쿼리 .. code:: /*+ 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 레이어 설정 .. image:: ../images/map_seoul/map7.png :height: 450 :width: 800 :scale: 100% :alt: layer_map_3_1 | | - 100 미터 range 일 때 .. image:: ../images/map_seoul/map8.png :height: 450 :width: 800 :scale: 100% :alt: layer_map_3_2 | | | | - 확대 : 50 미터 .. image:: ../images/map_seoul/map10.png :height: 550 :width: 800 :scale: 100% :alt: layer_map_4 - 확대 : 100 미터 .. image:: ../images/map_seoul/map11.png :height: 550 :width: 800 :scale: 100% :alt: layer_map_5