본문 바로가기

데이터분석

QGIS 간단하게 사용하기 , 위도경도, 폴리곤데이터 시각화하기

728x90

먼저 QGIS는 무료 오소스 GIS 프로그램으로 지도 만들고 시각화 및 공간 데이터 분석하는 프로그램이다.

 

https://www.youtube.com/watch?v=BPyUl7GSP_4&list=PLjh1hlmDSDkeA7mo5lrtW_A-m8NFThHSq

 

이걸 보고 사용법 간단하게 익혔다

 

 

현재 나는 공모전을 위해 부산에서 지자체별로 사고가 많이 일어나는 상위3군데를 지도에 표시 할 생각이다.

 

 

한국도로교통공단_지자체별 교통사고 다발지역

전국 각 지자체별 교통사고 다발지역 정보(지자체별 top3 지점) - 대상사고 : 1년간 발생한 전체 교통사고 - 다발지역 선정조건 : 반경 150m 내, 대상사고 3건 이상인 지점 중 상위 3개소(TOP3) * 지자체

www.data.go.kr

한국도로교통공단에 - 지자체별 교통사고 다발지역 open api를 사용했다.

사용방법은 

1. 활용신청 누르기

2. 지역 정하기

3. 지자체 선택하기

 

그러면 xml 코드로 나오는데 이걸 DF 형식으로 바꾼 뒤 CSV파일로 저장했다.

 

import xml.etree.ElementTree as ET
import json
import pandas as pd


xml_data = """
<XML 코드 넣기>
"""


root = ET.fromstring(xml_data)


rows = []
for item in root.findall(".//item"):
    row_data = {child.tag: child.text for child in item}
    # geom_json은 JSON 문자열 → dict 변환해줘야 한다
    if "geom_json" in row_data:
        row_data["geom_json"] = json.loads(row_data["geom_json"])
    rows.append(row_data)


df_강서 = pd.DataFrame(rows)

df_강서

 

 

그럼 아래와 같은 위도와 경도가 나오게 된다.

경도 위도
128.9319 35.11126
128.9202 35.09864

 

이제 QGIS에 접속 한다.

 

레어어추가를 누르고

 

위와 같이 설정해준다.

x가 경도 y가 위도

그럼 아래와 같이 점이 생긴다. 이제 지도를 위에 덮어주면 된다.

지도는 왼쪽 탭에 보면 XYZ Tilles라고 있는데 거기서 Open Sheet map 클릭

 

확대해보면 위도 경도가 맞는것을 볼 수 있다

 

 

 

 

이번엔 폴리곤데이터를 QGIS에 나타내는 것을 해보겠다

 

geopandas를 사용하면 되고, 에러가 계속 뜨길래 알아보니 데이터형식이 잘못됐다고 했다

작음따음표가 아닌 큰 따옴표로 바꿔줘야 한다고 함

바꿔주고 진행

GeoJSON 파일 생성

import geopandas as gpd
from shapely.geometry import shape
import json

busan_accident_df['geometry'] = busan_accident_df['다발지역폴리곤'].apply(lambda x: shape(json.loads(x.replace("'", '"'))))

gdf = gpd.GeoDataFrame(busan_accident_df, geometry='geometry', crs="EPSG:4326")

gdf.to_file("busan.geojson", driver="GeoJSON")

 

QGIS에서 레이어 추가 -> 벡터로 추가하기 

 

나오는걸 확인 가능하다

원래는 행정구역처럼 나오게 하고싶었는데 교통사고 데이터라 그런지 중심에서 반경 300M 이런식으로 데이터가 짜여있나보다.

 

 

 

파이썬에서 하는 법

import geopandas as gpd
import folium

gdf = gpd.read_file("busan.geojson")

# zoom_start 레벨은 숫자가 클수록 확대
busan_map = folium.Map(location=[35.1796, 129.0756], zoom_start=10)

folium.GeoJson(
    gdf,
    style_function=lambda feature: {
        'fillColor': 'red',
        'color': 'black',
        'weight': 2,
        'fillOpacity': 0.4  
    }
).add_to(busan_map)

busan_map

 

 

코드에서 바로 볼 수 있었다.

728x90