자료를 수집하는 위치와 사고가 난 위치가 다르기 때문에 이 부분을 해결하기 위한 노력의 결과이다.
나중에 여유가 생기면 이 부분에 대해서 설명을 해보겠다.
=========================== Python ===========================
import math
import pandas as pd
# 두 개의 경도 위도를 알 때 두 점 사이의 거리를 구하기
def getDistance(lat1, lon1, lat2, lon2):
a = 6378137.0
b = 6356752.314245
f = 1 / 298.257223563
L = math.radians(lon2 - lon1)
U1 = math.atan((1 - f) * math.tan(math.radians(lat1)));
U2 = math.atan((1 - f) * math.tan(math.radians(lat2)));
sinU1 = math.sin(U1)
cosU1 = math.cos(U1)
sinU2 = math.sin(U2)
cosU2 = math.cos(U2)
cosSqAlpha = float()
sinSigma = float()
cos2SigmaM = float()
cosSigma = float()
sigma = float()
# l == lambda
l = L
lambdaP = float()
iterLimit = 100
while True:
sinLambda = math.sin(l)
cosLambda = math.cos(l)
sinSigma = math.sqrt((cosU2 * sinLambda) * (cosU2 * sinLambda) + (cosU1 * sinU2 - sinU1 * cosU2 * cosLambda) * (
cosU1 * sinU2 - sinU1 * cosU2 * cosLambda))
if (sinSigma == 0):
return 0;
cosSigma = sinU1 * sinU2 + cosU1 * cosU2 * cosLambda
sigma = math.atan2(sinSigma, cosSigma)
sinAlpha = cosU1 * cosU2 * sinLambda / sinSigma
cosSqAlpha = 1 - sinAlpha * sinAlpha
cos2SigmaM = cosSigma - 2 * sinU1 * sinU2 / cosSqAlpha
C = f / 16 * cosSqAlpha * (4 + f * (4 - 3 * cosSqAlpha))
lambdaP = l
l = L + (1 - C) * f * sinAlpha * (
sigma + C * sinSigma * (cos2SigmaM + C * cosSigma * (-1 + 2 * cos2SigmaM * cos2SigmaM)));
if (iterLimit == 0) or ((math.fabs(l - lambdaP) > 1e-12) and (iterLimit > 0)):
break
iterLimit = iterLimit - 1
# end while
if (iterLimit == 0):
return 0
uSq = cosSqAlpha * (a * a - b * b) / (b * b)
A = 1 + uSq / 16384 * (4096 + uSq * (-768 + uSq * (320 - 175 * uSq)))
B = uSq / 1024 * (256 + uSq * (-128 + uSq * (74 - 47 * uSq)))
deltaSigma = B * sinSigma * (cos2SigmaM + B / 4 * (
cosSigma * (-1 + 2 * cos2SigmaM * cos2SigmaM) - B / 6 * cos2SigmaM * (-3 + 4 * sinSigma * sinSigma) * (
-3 + 4 * cos2SigmaM * cos2SigmaM)))
s = b * A * (sigma - deltaSigma)
return s
# 도분초를 경도 위도 값으로 바꾸기
def lat_lng(d, b, c):
return d + (b/60) + (c/3600)
### 경도 위도 자료 DataFrame으로 집어넣기
# df = pd.read_csv("accident.csv", encoding='utf-8')
# d = df['경도(시)']
# b = df['경도(분)']
# c = df['경도(초)']
# lng = []
#
#
# for a in range(len(d)):
# long = lat_lng(d[a], b[a], c[a])
# lng.append(long)
#
# df['longitude'] = lng
#
#
#
#
# d = df['위도(시)']
# b = df['위도(분)']
# c = df['위도(초)']
# lat = []
#
# for a in range(len(d)):
# long = lat_lng(d[a], b[a], c[a])
# lat.append(long)
#
# df['latitude'] = lat
#
#
# print(df)
#
# list = ["Unnamed: 19",'Unnamed: 20','Unnamed: 21','Unnamed: 22','Unnamed: 23']
# for a in list:
# del df[a]
#
#
# df.to_csv("accident1.csv")
import operator
import sys
df1 = pd.read_csv("bui.csv", encoding='utf-8')
df2 = pd.read_csv("accident.csv", encoding='utf-8')
lat1 = df1['latitude'] # 17개
long1 = df1['longitude'] # 17개
lat2 = df2['latitude'] # acci # 9000개
long2 = df2['longitude'] # acci # 9000개
name_list = [name for name in df1.지점]
dist_a_to_b =[]
for a in range(0, len(lat2)): # 9000
for b in range(0, len(lat1)): # 17
if b == 0: # for이 다시 처음부터 돌면 dist={}를 초기화를 시켜서 새로운 accident 지점이 들어갈 수 있게 만든다.
dist = {}
distance = getDistance(lat1[a], long1[a], lat2[b], long2[b])
# print("a:"+str(a)+",b:"+str(b)+",,"+str(distance))
dist[name_list[b]] = distance # dist에 key:value로 저장한다.
if b == 16:
sort = sorted(dist.items(), key=operator.itemgetter(1)) # value값을 비교해서 오름차순으로 정렬한다.
dist_a_to_b.append(sort[0][0]) # key값만 뽑아서 저장한다.
print(dist_a_to_b)
if a == 3:
sys.exit(0)
=========================== Python ===========================