Django/응용

[Django] GeoJson 파일 파싱하기 (Json이란 무엇일까?)

민돌v 2021. 5. 10. 01:03

지난번에 도로명주소 전자지도 데이터를 사용하기 위해서 shp -> json 형식의 파일로 변환해 주었다.

thalals.tistory.com/24?category=476043

 

QGIS shp 파일 좌표계 변환, Gson 데이터 변환(직렬화)

도로명 주소 전자지도 데이터를 다운받으면, 해당 지역의 많은 shp파일을 확보할 수 있다. 이 데이터를 활용하기 위해서는 좌표계를 GRS80 UTM-K기준 좌표계에서 WGS 84 / Pseudo-Mercator(EPSG:3857)로 바꿔

thalals.tistory.com

 

이제 이 GeoJson 파일을 파싱하여 원하는 데이터만 사용할려고 한다.

그전에 JSON에 대해서 정리를 해보자

 

 

1. Json이란

Json이란, JavaScript Object Notation으로 데이터를 주고받을 때 사용되는 포맷 중 하나이다.

본래는 자바스크립트 언어로부터 파생되어 자바스크립트의 구문 형식을 따르지만 언어 독립형 데이터 포맷으로,

프로그래밍 언어나 플랫폼에 독립적이어서 C, C++, C#, JAVA, Python 등 여러 프로그래밍 언어에서 사용할 수 있다.

 

json은 key:value 타입으로 데이터를 표현하며, Object와 Array가 있다.

 

1) Object

object는 key/ value로 표현되고 { } 중괄호로 시작과 끝을 나타낸다.

 

{

     "key1": "value1",

      "key2": "value2"

}

 

2) array

array는 [ ]대괄호로 구분되고 각 요소는 기본 자료형이나 배열, 객체가 될 수 있다.

[ "value1", "value2", "value3" ]

 

이런식으로 object와 array를 혼합하여 데이터를 표현하면 프로그래밍 언어와 플랫폼에 독립적이기 때문에

서로 다른 시스템 간에 통신을 하기에 용이합니다.

 

 

3) 직렬화 (Serialization)

이렇게 데이터를 JSON형식으로 만드는것을 직렬화라고도 하는데, 

직렬화란 객체를 직렬화하여 전송 가능한 형태로 만드는 것을 의미한다.

 

객체들의 데이터를 특정한 포맷의 연속적인 데이터로 변형하여 데이터를 읽도록 하는 것이다.

 


2. DJango에서 Json 데이터 파싱하기(Python)

먼저 이용할 json 파일들을 Static 폴더에 저장해 주었습니다.

 

 

1) with문과 json모듈을 이용하여 파싱

woohoo.log blog를 참고하였습니다.

with와 json 모듈을 이용해 Json파일 불러오기

(json 파일은 Static폴더 안에 Json폴더에 위치)

import json

#경기 라인 json 파일 보기
# with를 이용해 파일을 연다.

cordinate_Array = []
def jsonShow_Gline():
    #with와 json 모듈을 이용해 Json파일 불러오기
    with open('static/json/Gyeonggi_line.json', encoding='utf-8') as json_file:
        json_data = json.load(json_file)
        #json의 key로 접근
        #json_line : json 객체를 가지는 Array
        json_line = json_data['features']

        for a in json_line:
            cordinate_Array.append(a['geometry']['coordinates'])

jsonShow_Gline()

print(cordinate_Array[0])
print(len(cordinate_Array))

먼저 json 파일에서 필요한 데이터만을 뽑았습니다.

제가 가진 json파일은 object 안에 Array 형식으로 되어 있기 때문에

위와 같은 방식으로 접근을 하였고 cordinate_Array에 데이터가 정상적으로 들어가는 것을 확일할 수 있었습니다.

 

여기서 저는 추가로 도로구간(TL_SPRD_MANAGE) 데이터중 사람이 다닐 수 있는 길(도보)만 사용하기 위해

1. 고속도로대로를 제거해 주었습니다.

 

import json

#경기 라인 json 파일 보기
# with를 이용해 파일을 연다.

coordinates_Array = [] #전체
coordinates_part = [] # 고속도로와 대로를 제거한 길

def jsonShow_Gline():
    #with와 json 모듈을 이용해 Json파일 불러오기
    with open('static/json/Gline_result_data.geojson', encoding='utf-8') as json_file:
        json_data = json.load(json_file)
        #json의 key로 접근
        #json_line : json 객체를 가지는 Array
        json_line = json_data['features']

        for a in json_line:
            if(a['properties']['ROA_CLS_SE']=='3' or a['properties']['ROA_CLS_SE']=='4' ):     #고속도로와 대로 제거
                coordinates_part.append(a['geometry']['coordinates'])

            coordinates_Array.append(a['geometry']['coordinates'])

        

jsonShow_Gline()

print("경기도 전체 라인\n첫번째 배열 : ",coordinates_Array[0])
print("전체 길이 : ",len(coordinates_Array))

# print("고속도로, 대로 제거 라인\n첫번째 배열 : ",coordinates_part[0])
print("제거 라인 길이 : ",len(coordinates_part))