728x90
지도상에서 공중화장실의 위치를 표시하기 위해 데이터를 구해보았는데..
https://www.localdata.go.kr/lif/lifeCtacDataView.do?opnEtcSvcId=12_04_01_E
데이터는 있었으나 경도, 위도가 누락된 곳이 너무 많아서 python을 통해 주소값을 경도, 위도로 변환해 보았다.
import pandas as pd
from geopy.geocoders import Nominatim
from tqdm import tqdm
geo_local = Nominatim(user_agent='South Korea')
# 주소 -> 경도, 위도로 변경
def geocoding(address):
try:
geo = geo_local.geocode(address)
x_y = [geo.latitude, geo.longitude]
return x_y
except:
return [0, 0]
# 데이터 불러오기
df = pd.read_csv('./toilet.csv', encoding='utf8')
address = df['소재지도로명주소']
latitude = []
longitude = []
# tdqm 적용 및 경도, 위도 출력
for i in tqdm(address, desc="Processing address", unit="address"):
lat, lng = geocoding(i)
latitude.append(lat)
longitude.append(lng)
# 결과 저장
address_df = pd.DataFrame({'화장실명': df['화장실명'], '소재지도로명주소': df['소재지도로명주소'], '위도': latitude, '경도': longitude})
address_df.to_csv('경위도_toilet.csv')
데이터 양이 너무 방대하다 보니 파일을 실행시킨 뒤 제대로 실행 중인지를 파악할 수 없어서
tdqm을 함께 적용하였다.
python의 위대함에 감탄하게 되는 것 같다...
# 다음 날 수정본
변환이 오래 걸려 다음 날 확인을 해봤는데 실패건도 굉장히 많았고 데이터 변환이 이상하게 진행된 경우도 꽤 있었기 때문에 코드를 조금 수정해보았다.
import pandas as pd
from geopy.geocoders import Nominatim
from tqdm import tqdm
geo_local = Nominatim(user_agent='South Korea')
def geocoding(address):
# 주소가 유효하지 않은 경우
if not address or pd.isna(address) or len(address.strip()) == 0:
return None
try:
geo = geo_local.geocode(address)
if geo:
return [geo.latitude, geo.longitude]
else:
return None
except:
return None
# 데이터 불러오기
df = pd.read_csv('./toilet.csv', encoding='utf8')
address = df['소재지도로명주소']
results = []
# tdqm 적용 및 경도, 위도 출력
for i in tqdm(address, desc="Processing address", unit="address"):
geocode_result = geocoding(i);
# 주소가 존재하지 않을 경우 WGS84 좌표 사용
if geocode_result:
lat, lng = geocode_result
else:
# WGS84 좌표값 확인
wgs84_lat = df.loc[df['소재지도로명주소'] == i, 'WGS84위도']
wgs84_lng = df.loc[df['소재지도로명주소'] == i, 'WGS84경도']
# 값이 존재하고 NaN이 아닌 경우만 선택
if not wgs84_lat.empty and not pd.isna(wgs84_lat.values[0]):
lat = wgs84_lat.values[0]
else:
lat = 0
if not wgs84_lng.empty and not pd.isna(wgs84_lng.values[0]):
lng = wgs84_lng.values[0]
else:
lng = 0
# 주소와 WGS84 모두 유효하지 않아 [0, 0]이 아닐 때만 결과에 추가
if lat != 0 or lng != 0:
results.append({'화장실명': df.loc[df['소재지도로명주소'] == i, '화장실명'].values[0],'소재지도로명주소': i, '위도': lat, '경도': lng})
# 결과 저장
address_df = pd.DataFrame(results)
address_df.to_csv('경위도_toilet.csv', index=False, encoding='utf-8-sig')
csv 파일이 온전치 않아서 주소값이 유효하지 않은 경우는 csv 파일에 기본적으로 제공 되었던
WGS84 경도, 위도 값을 확인하고 해당 값마저 존재하지 않다면
아무것도 없는 데이터로 산정해 행을 만들지 않도록 코드를 수정하였다. 이렇게 진행하니 작업 속도도 빨라지고
에러 확률도 상당히 줄어든 것 같다.
* python도 만능은 아니군...