리그캣의 개발놀이터

[Follium] 사용하여 주소를 맵에 표시 본문

개발 공부/Python(웹)

[Follium] 사용하여 주소를 맵에 표시

리그캣 2018. 5. 16. 12:19

Chicken_Map-1.py

import folium


map_osm = folium.Map(location = [37.614776, 127.013337])

map_osm.save('d:/temp/map1.html')


map_osm = folium.Map(location=[37.614776, 127.013337], zoom_start=17)

map_osm.save('d:/temp/map2.html')

라이브러리 추가하고 코드 테스팅

제대로 생성됐는지 확인해보는 작업

map_osm = folium.Map(location=[37.614776, 127.013337], zoom_start=17, tiles='Stamen Toner')

map_osm.save('d:/temp/map_StamenToner.html')


map_osm = folium.Map(location=[37.614776, 127.013337], zoom_start=17, tiles='Stamen Terrain')

map_osm.save('d:/temp/map_StamenTerrain.html')

이것도 parameter 적용하여 확인작업.

map_osm = folium.Map(location=[37.614776, 127.013337], zoom_start=17)

folium.Marker([37.614776, 127.013337], popup='서경대학교').add_to(map_osm)

folium.Marker([37.615970, 127.011834], popup='북악관').add_to(map_osm)

map_osm.save('d:/temp/map_SKu1.html')

다음식으로 좌표가져와서 마커와 팝업을 설정해 줄 수 있음.

소스코드 파악했으니 Chicken_Map을 만들어 볼 차례

import folium

import json

import urllib.request

import datetime

import pandas as pd

import webbrowser

필요 라이브러리 추가

#code1

def get_request_url(url):


  req = urllib.request.Request(url)

  req.add_header("X-Naver-Client-Id","Ch0vdY0HM6SPOidkt02i")

  req.add_header("X-Naver-Client-Secret","ANmaZHqA8m")

  try:

      response = urllib.request.urlopen(req)

      if response.getcode() == 200:

          print("[%s] Url Request Success"%datetime.datetime.now())

          return response.read().decode('utf-8')

  except Exception as e:

      print(e)

      print("[%s] Error for URL : %s" %(datetime.datetime.now(),url))

      return None

NAVER API 연동하기위한 URL REQUEST

#code2

def getGeoData(address):


  base = "https://openapi.naver.com/v1/map/geocode"

  node = ""

  parameters = "?query=%s" % urllib.parse.quote(address)

  url = base + node + parameters


  retData = get_request_url(url)


  if (retData == None):

      return None

  else:

      return json.loads(retData)

해당 API연동하여 정보가져오기


def main():

  #code3

  map = folium.Map(location=[37.5103, 126.982], zoom_start=12)


  #code4

  filename = 'pericana_modify.csv'

  df = pd.read_csv(filename, encoding='CP949', index_col=0, header=0)

  geoData = []

  for index, row in df.iterrows():

      if row['sido'] == '서울특별시':

          geoData = getGeoData(row['store_address'])

          if geoData != None:

              print(geoData)

              folium.Marker(geoData, popup=row['store'], icon=folium.Icon(color='blue')).add_to(map)


  #code5

  svFilename = 'Chicken_Map-1.html'

  map.save(svFilename)

  webbrowser.open(svFilename)



if __name__ == '__main__':

  main()

서울특별시에 한정되어 pericana_modify.csv에 있는 주소 표시하기 위한 코드

실행시켰더니 에러가나서 보니

print(geoData)

를 실행하여 데이터를 확인해보니getGeoData(address)가  json 형식 그대로 가져오는 것을 확인할 수 있었음

{'result': {'total': 1, 'userquery': '서울특별시 강서구 양천로51길 11, 1층 102호(가양동,신환빌딩)', 'items': [{'address': '서울특별시 강서구 양천로51길 11 신환빌딩', 'addrdetail': {'country': '대한민국', 'sido': '서울특별시', 'sigugun': '강서구', 'dongmyun': '양천로51길', 'ri': '', 'rest': '11 신환빌딩'}, 'isRoadAddress': Tru



{'result':

{'total': 1, 'userquery': '서울특별시 강서구 양천로51길 11, 1층 102호(가양동,신환빌딩)',

'items': [{'address': '서울특별시 강서구 양천로51길 11 신환빌딩', 'addrdetail': {'country': '대한민국', 'sido': '서울특별시', 'sigugun': '강서구', 'dongmyun': '양천로51길', 'ri': '', 'rest': '11 신환빌딩'},

'isRoadAddress': True, 'point': {'x': 126.8428764, 'y': 37.5682634}}]}}

이때 json형식을 보면 다음과같이 x,y좌표를 확인할 수 있었음.

이것을 뽑아내보자는 생각이 들어 다음과 같이 실행함


for index, row in df.iterrows():

  if row['sido'] == '서울특별시':

      geoData = getGeoData(row['store_address'])

      if geoData != None:

          print(geoData['result']['items'][0]['point']['x'])

          print(geoData['result']['items'][0]['point']['y'])

Traceback (most recent call last):

126.8428764

37.5682634

다음과 같이 출력되는것을 확인

folium.Marker([geoData['result']['items'][0]['point']['x'],geoData['result']['items'][0]['point']['y']], popup=row['store'], icon=folium.Icon(color='blue')).add_to(map)

을 사용하기로 함.

??


왜 북극에 가잇냥..

이 좌표가 아닌가..;;

x, y 좌표를 바꾸어보자는 생각이 들어서 바꾸어 보았음.

오 정상 출력되는 것을 확인 가능.

같은 방식으로 굽네치킨 주소도 표시해 보겠음

전체소스코드

import folium

import json

import urllib.request

import datetime

import pandas as pd

import webbrowser


#code1

def get_request_url(url):


  req = urllib.request.Request(url)

  req.add_header("X-Naver-Client-Id","Ch0vdY0HM6SPOidkt02i")

  req.add_header("X-Naver-Client-Secret","ANmaZHqA8m")

  try:

      response = urllib.request.urlopen(req)

      if response.getcode() == 200:

          print("[%s] Url Request Success"%datetime.datetime.now())

          return response.read().decode('utf-8')

  except Exception as e:

      print(e)

      print("[%s] Error for URL : %s" %(datetime.datetime.now(),url))

      return None


#code2

def getGeoData(address):


  base = "https://openapi.naver.com/v1/map/geocode"

  node = ""

  parameters = "?query=%s" % urllib.parse.quote(address)

  url = base + node + parameters


  retData = get_request_url(url)


  if (retData == None):

      return None

  else:

      return json.loads(retData)


def main():

  #code3

  map = folium.Map(location=[37.5103, 126.982], zoom_start=12)


  #code4

  filename = 'pericana_modify.csv'

  df = pd.read_csv(filename, encoding='CP949', index_col=0, header=0)

  geoData = []

  for index, row in df.iterrows():

      if row['sido'] == '서울특별시':

          geoData = getGeoData(row['store_address'])

          if geoData != None:

              print(geoData['result']['items'][0]['point']['x'])

              print(geoData['result']['items'][0]['point']['y'])

              folium.Marker([geoData['result']['items'][0]['point']['y'],geoData['result']['items'][0]['point']['x']], popup=row['store'], icon=folium.Icon(color='blue')).add_to(map)


  filename2 = 'goobne_modify.csv'

  df2 = pd.read_csv(filename2, encoding='CP949', index_col=0, header=0)

  geoData2 = []

  for index, row in df2.iterrows():

      if row['sido'] == '서울특별시':

          geoData2 = getGeoData(row['store_address'])

          if geoData2 != None:

              print(geoData2['result']['items'][0]['point']['x'])

              print(geoData2['result']['items'][0]['point']['y'])

              folium.Marker([geoData2['result']['items'][0]['point']['y'],geoData2['result']['items'][0]['point']['x']], popup=row['store'], icon=folium.Icon(color='red')).add_to(map)



  #code5

  svFilename = 'Chicken_Map-1.html'

  map.save(svFilename)

  webbrowser.open(svFilename)



if __name__ == '__main__':

  main()



표시화면

다음과 같이 표시가 가능하다



Comments