Project

[Project/4th] 법정동, μ’Œν‘œκ°’ 데이터 DB에 μ €μž₯ν•˜κΈ°(2)

giraffe_ 2024. 6. 10. 10:22

 μ§€λ‚œ ν¬μŠ€νŒ…μ—μ„œ 법정동 μ—‘μ…€ 데이터λ₯Ό 파이썬으둜 κ°€κ³΅ν•˜μ—¬ DB에 μ €μž₯ν•˜λŠ” 과정에 λŒ€ν•΄ 썼닀. 이번 ν¬μŠ€νŒ…μ—μ„œλŠ” λ²•μ •λ™μ˜ μ’Œν‘œκ°’(μœ„λ„, 경도)λ₯Ό μ €μž₯ν•˜λŠ” 과정에 λŒ€ν•΄ μ“°κ³ μž ν•œλ‹€!

 

 

 

 

 

1. 법정동 μ½”λ“œμ™€ 동이름 μ €μž₯ν•˜κΈ° -> μ§€λ‚œ ν¬μŠ€νŒ…

2. λ²•μ •λ™μ˜ μ’Œν‘œκ°’(μœ„λ„, 경도) μ €μž₯ν•˜κΈ° -> ν˜„μž¬ ν¬μŠ€νŒ…

 

 

 

 

 

 

 

 

 

 

 λ¨Όμ € ν›„κΈ°λ₯Ό λ§ν•˜μžλ©΄, 법정동 정보 데이터λ₯Ό 가곡해 μ €μž₯ν•˜λŠ” 것보닀 μ’Œν‘œκ°’μ„ μ–»μ–΄ μ €μž₯ν•˜λŠ” 과정이 훨씬 μ–΄λ €μ› λ‹€. 법정동 λ°μ΄ν„°μ²˜λŸΌ μžλ£Œκ°€ μ—‘μ…€λ‘œ μ‘΄μž¬ν•˜λŠ” 것이 μ•„λ‹ˆμ—ˆκΈ° λ•Œλ¬Έμ— μ–΄λ–»κ²Œ 데이터λ₯Ό κ°€μ Έμ˜¬μ§€ 정말 많이 찾아보고 고민을 ν•΄μ•Ό λμ—ˆλ‹€.

 

 

μ—¬λŸ¬ μ‹œν–‰μ°©μ˜€ 끝에 κ²°κ΅­ λ‚΄κ°€ μ›ν•˜λŠ” λ°©μ‹μœΌλ‘œ 데이터λ₯Ό μ €μž₯ν•  수 μžˆμ—ˆλ‹€!

 

법정동 별 μ’Œν‘œκ°’ μ €μž₯ κ²°κ³Ό

 

 

 ν•œλ™μ•ˆ μžλ°” μŠ€ν”„λ§μœΌλ‘œλ§Œ κ°œλ°œν•˜λ‹€κ°€ μ˜€λžœλ§Œμ— 파이썬으둜 데이터λ₯Ό λ‹€λ£¨λ‹ˆ μž¬λ―ΈμžˆκΈ°λ„ ν•˜λ‹€.

 κ΅¬κΈ€λ§ν•΄λ„ μžμ„Έν•œ κ΅¬ν˜„ 과정을 μ–»κΈ° μ–΄λ €μ› κΈ° λ•Œλ¬Έμ— λˆ„κ΅°κ°€μ—κ²Œ 도움이 λ˜μ—ˆμœΌλ©΄ μ’‹κ² λ‹€!

 

 

 

 

 

 

 

 

 

 

법정동 μ’Œν‘œ 데이터 μˆ˜μ§‘ν•˜κΈ°


 κ²°λ‘ μ μœΌλ‘œ λ§ν•˜μžλ©΄, 곡곡데이터 포털, ν–‰μ •μ•ˆμ „λΆ€, ꡬ글링.. λ“± 정말 많이 μ°Ύμ•„λ΄€μ§€λ§Œ 각 λ²•μ •λ™μ˜ μ’Œν‘œ(μœ„λ„, 경도)만 λ‚˜μ˜¨ 데이터λ₯Ό μ—‘μ…€κ³Ό 같은 파일둜 얻을 수 μ—†μ—ˆλ‹€. κ·Έλž˜μ„œ λ‹€λ₯Έ 방법을 생각해봐야 ν–ˆλ‹€.

 

 

 

 κ΅¬κΈ€λ§μ„ 톡해 법정동/ν–‰μ •λ™μ˜ 쀑심 μ’Œν‘œλ₯Ό κ³„μ‚°ν•˜κ±°λ‚˜ 얻을 수 μžˆλ‹€λŠ” 방법을 μ•Œκ²Œ λ˜μ—ˆλ‹€. κ°€λŠ₯ν•œ 방법은 크게 2가지이닀.

 

1) 폴리곀(ν–‰μ • 경계 μ’Œν‘œκ°’) 데이터λ₯Ό μ΄μš©ν•΄ 쀑심 μ’Œν‘œλ₯Ό 계산

2) μ§€λ„μ—μ„œ ν–‰μ • μ€‘μ‹¬μ§€μ˜ μ’Œν‘œ κ²€μƒ‰ν•˜μ—¬ μ–»κΈ°

 

 

 

 

 

방법1) 폴리곀(ν–‰μ • 경계 μ’Œν‘œκ°’) 데이터λ₯Ό μ΄μš©ν•΄ 쀑심 μ’Œν‘œλ₯Ό 계산

 κ΅¬κΈ€λ§ν•΄μ„œ λ‚˜μ˜¨ λΈ”λ‘œκ·Έ κ²Œμ‹œκΈ€μΈ '[Python] μ „κ΅­ 행정ꡬ역별(법정동) κ°œμˆ˜μ™€ 경계/쀑심 μ’Œν‘œ 데이터 - GeoPandas' μ„ μ°Έκ³ ν–ˆλ‹€. 행정ꡬ역 별 경계 값을 폴리곀으둜 μ €μž₯ν•œ λ°μ΄ν„°μ—μ„œ 쀑점을 κ΅¬ν•˜λŠ” 방식이닀.

 

 κ²°λ‘ μ μœΌλ‘œ λ§ν•˜μžλ©΄, 이 방법을 μ„ νƒν•˜μ§€ μ•Šμ•˜λ‹€.

 

 

 ν΄λ¦¬κ³€ 데이터가 λ‹΄κΈ΄ dbf(λ°μ΄ν„°λ² μ΄μŠ€ 파일)μ΄λ‚˜ shp(GIS 데이터 파일)을 닀뀄야 ν•˜λŠ”λ° μ—΄κΈ° νž˜λ“€κ³ , μ—‘μ…€λ‘œ λ³€ν™˜ν•˜λ”λΌλ„ 인코딩 λ¬Έμ œμΈμ§€ Macμ—μ„œ κΉ¨μ§„λ‹€.. 그리고 폴리곀 λ°μ΄ν„°μ—μ„œ 쀑점 κ΅¬ν•˜κ³  μ’Œν‘œλ‘œ λ³€ν™˜ν•˜λŠ” 것을 파이썬(GeoPandas)둜 κ΅¬ν˜„ν•΄μ•Ό ν•΄μ„œ λ‹€λ₯Έ 방법을 μƒκ°ν•΄λ³΄κ²Œ λ˜μ—ˆλ‹€.

 

 

 

 

 

방법2) μ§€λ„μ—μ„œ ν–‰μ • μ€‘μ‹¬μ§€μ˜ μ’Œν‘œ κ²€μƒ‰ν•˜μ—¬ μ–»κΈ°

 μΉ΄μΉ΄μ˜€λ§΅μ΄λ‚˜ 넀이버맡과 같은 지도 APIλ₯Ό μ‚¬μš©ν•˜μ—¬ μ’Œν‘œκ°’μ„ 얻을 수 μžˆλ‹€. μ§€λ„μ—μ„œ 법정동을 κ²€μƒ‰ν•˜λ©΄, 주둜 κ·Έ λ™λ„€μ˜ μ£Όλ―Όμ„Όν„°λ‚˜ 법정동 κ²½κ³„μ˜ 쀑심 지점이 λ‚˜μ˜¨λ‹€.  

 

 

 

 ν•΄λ‹Ή λ²•μ •λ™μ˜ μ’Œν‘œκ°’μ€ μ£Όμ†Œλ₯Ό μ’Œν‘œλ‘œ λ³€ν™˜ν•˜λŠ” κΈ°λŠ₯을 μ‚¬μš©ν•˜μ—¬ κ°€μ Έμ˜¬ 수 μžˆλ‹€. ꡬ글링을 톡해 파이썬으둜 μΉ΄μΉ΄μ˜€λ§΅μ—μ„œ μ£Όμ†Œλ₯Ό μ’Œν‘œλ‘œ λ³€ν™˜ν•˜λŠ” μ½”λ“œλ₯Ό 찾을 수 μžˆμ—ˆκ³ , 이 방법이 ν˜„μž¬λ‘œμ„œλŠ” κ°€μž₯ κ΅¬ν˜„ν•˜κΈ° μ‰¬μšΈ 것 κ°™μ•„μ„œ μ„ νƒν•˜κ²Œ λ˜μ—ˆλ‹€.

 

 

 

 

 

 

 

 

 

 

카카였맡으둜 μ’Œν‘œ 데이터 μ–»κΈ°


1) 파이썬 νŒ¨ν‚€μ§€ μ„€μΉ˜ν•˜κΈ°

pip3 install requests

(*주의 : λ§₯μ—μ„œλŠ” pip 말고, pip3라고 λͺ…μ‹œλ₯Ό ν•΄μ€˜μ•Ό 싀행이 λœλ‹€.)

 

  • requests : HTTP μš”μ²­μ„ μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜λŠ” λͺ¨λ“ˆ

카카였맡 APIλ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” HTTP μš”μ²­μ„ 보내야 ν•˜λŠ”λ°, 이λ₯Ό μ²˜λ¦¬ν•˜κΈ° μœ„ν•œ 파이썬 λͺ¨λ“ˆμ„ λ”°λ‘œ μ„€μΉ˜ν•΄μ€˜μ•Ό ν•œλ‹€.

 

 

 

 

2) API와 톡신해 μ£Όμ†Œλ₯Ό μ’Œν‘œκ°’μœΌλ‘œ λ³€ν™˜ν•˜κΈ°

lat, lng = convert_address_to_coordinates(sido + ' ' + sigungu + ' ' + eubmyeondong)

 

 

 μ²˜μŒμ— μ£Όμ†Œλ₯Ό μλ©΄λ™λ§ŒμœΌλ‘œ κ²€μƒ‰ν•˜λ„λ‘ ν–ˆλ‹€κ°€ ArrayIndexOutOfBound μ—λŸ¬κ°€ 났닀. μ‹œκ΅°κ΅¬λŠ” λ‹€λ₯Έλ°, 읍면동이 μ€‘λ³΅λ˜λŠ” κ²½μš°κ°€ μžˆμ–΄μ„œ 검색 κ²°κ³Όκ°€ μ–΄λ € κ°œκ°€ λ˜μ—ˆκΈ° λ•Œλ¬Έμ΄λ‹€. κ·Έλž˜μ„œ 'μ‹œλ„+μ‹œκ΅°κ΅¬+읍면동'을 λ‹€ ν•©μΉœ ν’€λ„€μž„μœΌλ‘œ κ²€μƒ‰ν•˜λ„λ‘ ν–ˆλ‹€.

 

 

 

  • μ£Όμ†Œλ₯Ό λ„£μœΌλ©΄ μœ„λ„μ™€ 경도λ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜
def convert_address_to_coordinates(address):
    KAKAO_REST_API_KEY = 'λ°œκΈ‰λ°›μ€ API KEY'

    url = 'https://dapi.kakao.com/v2/local/search/address.json?query=' + address
    header = {'Authorization': 'KakaoAK ' + KAKAO_REST_API_KEY}

    r = requests.get(url, headers=header)

    if r.status_code == 200:
        lng = float(r.json()["documents"][0]["address"]['x'])
        lat = float(r.json()["documents"][0]["address"]['y'])
    else:
        return None
    
    return lat, lng

 

 

 

 

 

3) μ’Œν‘œ 데이터 μ–»μ–΄μ˜¨ κ²°κ³Ό

 

 

 μ½˜μ†”창에 찍으면 μ΄λ ‡κ²Œ λ‚˜μ˜¨λ‹€. API 톡신을 톡해 데이터λ₯Ό 검색해 μ–»λŠ” κ²ƒμ΄λ‹€λ³΄λ‹ˆ μ‹œκ°„μ΄ κ½€ κ±Έλ¦°λ‹€. 3000κ°œκ°€ λ„˜λŠ” 법정동 λ°μ΄ν„°μ˜ λͺ¨λ“  μ’Œν‘œκ°’μ„ κ΅¬ν•˜λŠ”λ° 3뢄이 λ„˜λŠ” μ‹œκ°„μ΄ κ±Έλ €λ‹€.

 

 

 

 

 

4) DB에 μ €μž₯ν•˜κΈ°

 

DB ν…Œμ΄λΈ” ꡬ쑰

 

 

lat, lng = convert_address_to_coordinates(sido + ' ' + sigungu + ' ' + eubmyeondong)

mydict[fullCode] = [fullCode, sido, sigungu, eubmyeondong, lat, lng]

 

 

def insert_into_mysql():
    conn = pymysql.connect(host='호슀트 μ£Όμ†Œ', user='계정λͺ…', password='λΉ„λ°€λ²ˆν˜Έ', db='DBλͺ…', charset='utf8')
    curs = conn.cursor()

    for key in mydict:
        arr = mydict[key]
        sql = "INSERT INTO address VALUES(\"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\");"\
            % (arr[0], arr[1], arr[2], arr[3], arr[4], arr[5])
        curs.execute(sql)

    conn.commit()
    conn.close()

 

 

 

 

 

5) DB에 μ €μž₯ κ²°κ³Ό