자료를 수집하는 위치와 사고가 난 위치가 다르기 때문에 이 부분을 해결하기 위한 노력의 결과이다.

나중에 여유가 생기면 이 부분에 대해서 설명을 해보겠다.



=========================== 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 ===========================



























+ Recent posts