반응형
자전거 도로에 관하여 정보를 받으면 shp, sbn 등을 받게 되는데, 이 아이들을 불러오고 좌표체계를 바꿔주는 코드이다.
자전거 도로 현황에 관한 정보는 자전거 도로에 관하여 (3)에 가면 있다.(3을 먼저 작성해서 ㅎㅎ...)
In [30]:
import shapefile
import pandas as pd
from pyproj import Proj, transform
1. shp파일열기¶
In [2]:
shp_path = './data/자전거도로/2018년/Bicycle_Lane_Seoul.shp'
shp_file = shapefile.Reader(shp_path)
fields = [x[0] for x in shp_file.fields][1:]
records= shp_file.records()
shps = [s.points for s in shp_file.shapes()]
shp_dataframe = pd.DataFrame(columns=fields, data=records)
shp_dataframe = shp_dataframe.assign(coords=shps)
shp_dataframe.head(3)
Out[2]:
1-1. sbn 파일열기¶
In [3]:
sbn_path = './data/자전거도로/2018년/Bicycle_Lane_Seoul.sbn'
sbn_file = shapefile.Reader(sbn_path)
sbn_fields = [x[0] for x in sbn_file.fields][1:]
sbn_records= sbn_file.records()
sbns = [s.points for s in sbn_file.shapes()]
sbn_dataframe = pd.DataFrame(columns=sbn_fields, data=sbn_records)
sbn_dataframe = sbn_dataframe.assign(coords=sbns)
sbn_dataframe.head(3)
Out[3]:
2. 한글 인코딩¶
In [4]:
shp_dataframe['ROAD_NAME'] = shp_dataframe['ROAD_NAME'].str.decode('cp949')
shp_dataframe['NAME'] = shp_dataframe['NAME'].str.decode('cp949')
shp_dataframe['ROAD_TYPE'] = shp_dataframe['ROAD_TYPE'].str.decode('cp949')
shp_dataframe['SEP_FAC'] = shp_dataframe['SEP_FAC'].str.decode('cp949')
shp_dataframe['LANE_COLOR'] = shp_dataframe['LANE_COLOR'].str.decode('cp949')
shp_dataframe['PAVE_TYPE'] = shp_dataframe['PAVE_TYPE'].str.decode('cp949')
shp_dataframe['PAVE_COLOR'] = shp_dataframe['PAVE_COLOR'].str.decode('cp949')
shp_dataframe['NOTES'] = shp_dataframe['NOTES'].str.decode('cp949')
shp_dataframe.head(3)
Out[4]:
2-1. sbn도¶
In [5]:
sbn_dataframe['ROAD_NAME'] = sbn_dataframe['ROAD_NAME'].str.decode('cp949')
sbn_dataframe['NAME'] = sbn_dataframe['NAME'].str.decode('cp949')
sbn_dataframe['ROAD_TYPE'] = sbn_dataframe['ROAD_TYPE'].str.decode('cp949')
sbn_dataframe['PAVE_TYPE'] = sbn_dataframe['PAVE_TYPE'].str.decode('cp949')
sbn_dataframe['PAVE_COLOR'] = sbn_dataframe['PAVE_COLOR'].str.decode('cp949')
sbn_dataframe['NOTES'] = sbn_dataframe['NOTES'].str.decode('cp949')
sbn_dataframe['SEP_FAC'] = sbn_dataframe['SEP_FAC'].str.decode('cp949')
sbn_dataframe['LANE_COLOR'] = sbn_dataframe['LANE_COLOR'].str.decode('cp949')
print(sbn_dataframe.shape, shp_dataframe.shape)
sbn_dataframe.head(3)
Out[5]:
3. 위도 경도로 바꿔주기¶
In [6]:
import requests
import json
In [7]:
def change_latlon(x, y):
inProj = Proj(init = 'epsg:5186')
outProj= Proj(init = 'epsg:4326')
lon = transform(inProj, outProj, x, y)[0]
lat = transform(inProj, outProj, x, y)[1]
return lat, lon
In [8]:
x = shp_dataframe['coords'].iloc[0][1][0]
y = shp_dataframe['coords'].iloc[0][1][1]
change_latlon(x, y)
Out[8]:
shp파일이나, sbn 파일이나 결과가 똑같아서 하나만 하기로 함!
몇개의 위도경도 값이 있는지 확인¶
In [9]:
sample = []
for idx, row in shp_dataframe.iterrows():
tmp = row['coords']
count = len(tmp)
sample.append(count)
len(sample), shp_dataframe.shape[0]
Out[9]:
In [10]:
shp_dataframe['coords_number'] = sample
result = shp_dataframe[['ROAD_NAME', 'NAME', 'coords', "coords_number"]]
coord_numbers = list(result['coords_number'].unique())
print(coord_numbers)
0 이 존재하기 때문에 제거해주자
In [11]:
result = result[result['coords_number']!=0]
coord_numbers = list(result['coords_number'].unique())
print(coord_numbers)
In [12]:
result[result['coords_number']==109]
Out[12]:
In [13]:
result_sample = result.set_index(["NAME"])
In [14]:
result_sample.head(10)
Out[14]:
In [15]:
result_sample.pivot_table(index='NAME', columns='ROAD_NAME', aggfunc='count')
Out[15]:
In [18]:
result_sample.reset_index(inplace=True)
In [20]:
latlon = []
for idx, row in result_sample.iterrows():
if idx%1000 == 0:
print(row['ROAD_NAME'])
tmp = []
for i in row['coords']:
x = i[0]
y = i[1]
lat, lon = change_latlon(x, y)
tmp.append((lat, lon))
latlon.append(tmp)
In [21]:
result_sample['coords2'] = latlon
In [22]:
result_sample.head(3)
Out[22]:
In [25]:
#result_sample.to_csv('./data/자전거도로/2018년/bicycle_road(18).csv', index=False, encoding='utf-8')
In [29]:
from IPython.core.display import display, HTML
display(HTML("<style>.container {width:90% !important;}</style>"))
In [ ]:
반응형
'Project > 따릉이 및 자전거 데이터 분석' 카테고리의 다른 글
[따릉이] 따릉이 데이터에 관하여 (2) - 자전거 혼잡 지역 (0) | 2018.10.14 |
---|---|
[따릉이] 자전거 사고에 관하여 - 자전거 사고 다발지역 (0) | 2018.10.14 |
[따릉이] 자전거 도로에 관하여 (3) - 자전거 도로 시각화 (3) | 2018.09.16 |
[따릉이] 자전거 도로에 관하여 (1) - 자전거 도로와 만족도 (0) | 2018.09.16 |
[따릉이] 따릉이 데이터에 관하여 (1) - 따릉이 데이터를 이용하게 된 이유 (0) | 2018.09.14 |
댓글