μ§λ ν¬μ€ν μμ λ²μ λ μμ λ°μ΄ν°λ₯Ό νμ΄μ¬μΌλ‘ κ°κ³΅νμ¬ 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μ μ μ₯νκΈ°
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μ μ μ₯ κ²°κ³Ό