나른한 코딩 생활

[36일차] ABC 부트캠프 프로젝트 - 6 본문

ABC 부트캠프

[36일차] ABC 부트캠프 프로젝트 - 6

GerHerMo 2024. 8. 13. 16:21

오늘은 저번주에 미쳐 완성하지 못했던 디테일들을 완성하는 시간을 가졌다

 

이것으로 프로토타입의 개발은 오늘로서 막을 내렸고, 내일은 발표전 마지막으로 프로토타입의 설계도 및 프로세스를 작성하고 마무리 지을 것이다


오전 / 오후

프로젝트 프로토타입 최종 완성


Mapping_Arive.py

import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager

def create_map_url(latitude, longitude, name=None):
    base_url = "https://map.kakao.com/link/map/"
    if name:
        url = f"{base_url}{name},{latitude},{longitude}"
    else:
        url = f"{base_url}{latitude},{longitude}"
    return url

def create_directions_url(latitude, longitude, name=None):
    base_url = "https://map.kakao.com/link/to/"
    if name:
        url = f"{base_url}{name},{latitude},{longitude}"
    else:
        url = f"{base_url}{latitude},{longitude}"
    return url

# 예시 사용 < - 해당 부분을 여행지로 변경
latitude = 35.1594965345398
longitude = 129.162576586723
name = "해운대해수욕장"

latitude_YeoSu = 34.8377033412796
longitude_YeoSu = 127.892653150096
name_YeoSu = "여수 보물섬 남해군청" # 위치는 남해군청 좌표를 가져옴

# 인터파크 투어 국내여행 1박 기준 2개의 목적지

map_url = create_map_url(latitude, longitude, name)
# directions_url = create_directions_url(latitude, longitude, name)
directions_url_YeoSu = create_directions_url(latitude_YeoSu, longitude_YeoSu, name_YeoSu)

# Selenium을 사용하여 Chrome으로 URL 열기
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))

# 핑찍힌 지도 열기
driver.get(map_url)
driver.implicitly_wait(10)
time.sleep(3)

# 5초 뒤에 여수 표시
# 목적지 URL 열기
driver.get(directions_url_YeoSu)
time.sleep(3)

input("Press Enter to close the browser...")
# Enter를 눌러야 창 닫음
driver.quit()

FuncCountCO2.py

emissions_data = {
    "S_Flight": {
        "emission": 255.0, # gCo2 단위
        "scope": "Scope 1",
        "speed": 850,
        'avg_emission': 0.3 # 이동수단별 km당 평균 탄소 배출량
    },
    "L_Flight": {
        "emission": 150.0,
        "scope": "Scope 1",
        "speed": 925,
        'avg_emission': 0.16
    },
    "Gasoline_Car": {
        "emission": 192.0,
        "scope": "Scope 1",
        "speed": 57, # 고속도로와 일반도로 평균값의 평균
        'avg_emission': 3.37
    },
    "Diesel_Car": {
        "emission": 171.0,
        "scope": "Scope 1",
        "speed": 57,
        'avg_emission': 3.0
    },
    "Bus": {
        "emission": 105.0,
        "scope": "Scope 1",
        "speed": 22,
        'avg_emission': 0.47
    },
    "Subway":{
        "emission": 26.0,
        "scope": "Scope 1",
        "speed": 50,
        'avg_emission': 0.52
    },
    "Electric_Car": {
        "emission": 53.0,
        "scope": "Scope 2",
        "speed": 46, # 출처 : https://www.wltpfacts.eu/from-nedc-to-wltp-change/
        'avg_emission': 1.15
    },
    "Electric_Bicycle": {
        "emission": 12.0,
        "scope": "Scope 2",
        "speed": 17, # 평균 15~20 km/h
        'avg_emission': 0.71
    },
    "Train": {
        "KTX": {
            "emission": 19.92,
            "scope": "Scope 2",
            "speed": 180,
            'avg_emission': 0.11
        },
        "KTX_Sancheon_and_Mugunghwa": {
            "emission": 38.105,
            "scope": "Scope 2",
            "speed": 120, # KTX 산천과 무궁화호의 평균속도
            'avg_emission': 0.32
        },
        "Nuriro_and_ITX_Cheongchun_and_ITX_Saemaeul": {
            "emission": 27.19,
            "scope": "Scope 2",
            "speed": 140, # 누리호, ITX 의 평균속도
            'avg_emission': 0.19
        }
    }
}

class VehicleCo2:
    global emissions_data

    def __init__(self,bus_time=0.0,subway_time=0.0,s_flight_time=0.0,l_flight_time=0.0,
                 gasoline_car_time=0.0,diesel_car_time=0.0,electric_car_time=0.0,
                 train_time=0.0,electric_bicycle_time=0.0 ):
        self.bus_time = bus_time
        self.subway_time = subway_time
        self.s_flight_time = s_flight_time
        self.l_flight_time = l_flight_time
        self.gasoline_car_time = gasoline_car_time
        self.diesel_car_time = diesel_car_time
        self.train_time = train_time
        self.electric_bicycle_time = electric_bicycle_time
        self.electric_car_time = electric_car_time

        self.using_train = 0
        self.avg_emission = 0.0
        self.avg_em_only_car = 0.0
        self.Bool_trainUsed = False
        self.emission_train = 0.0
        self.list_avg = list(emissions_data.keys())[:-1]
        self.list_vtime = [self.s_flight_time,self.l_flight_time,self.gasoline_car_time,self.diesel_car_time,
                             self.bus_time,self.subway_time,self.electric_car_time,self.electric_bicycle_time]

        self.emission_bus =  self.bus_time / 60.0 * emissions_data["Bus"]["speed"] * emissions_data["Bus"]["emission"]
        self.emission_subway = self.subway_time / 60.0 * emissions_data["Subway"]["speed"] * emissions_data["Subway"]["emission"]
        self.emission_s_flight =  self.s_flight_time / 60.0 * emissions_data["S_Flight"]["speed"] * emissions_data["S_Flight"]["emission"]
        self.emission_l_flight =  self.l_flight_time / 60.0 * emissions_data["L_Flight"]["speed"] * emissions_data["L_Flight"]["emission"]
        self.emission_g_car =  self.gasoline_car_time / 60.0 * emissions_data["Gasoline_Car"]["speed"] * emissions_data["Gasoline_Car"]["emission"]
        self.emission_d_car =  self.diesel_car_time / 60.0 * emissions_data["Diesel_Car"]["speed"] * emissions_data["Diesel_Car"]["emission"]
        self.emission_elec_car = self.electric_car_time / 60.0 * emissions_data["Electric_Car"]["speed"] * emissions_data["Electric_Car"]["emission"]
        self.emission_elec_bicycle = self.electric_bicycle_time / 60.0 * emissions_data["Electric_Bicycle"]["speed"] * emissions_data["Electric_Bicycle"]["emission"]

        self.emissions_co2 = 0.0
        # 초기화시에 각 이동수단별 시간을 가져온다
        if self.train_time== 0.0:
            self.Bool_trainUsed = False
        else:
            self.Bool_trainUsed = True

    def set_train_kind(self,using_train):
        self.using_train = using_train
        if self.train_time != 0.0:
            # using_train = input("이용한 열차 : ")
            match self.using_train:
                case "1":
                    self.emission_train = (self.train_time / 60.0 * emissions_data["Train"]["KTX"]["speed"] *
                                           emissions_data["Train"]["KTX"]["emission"])
                case "2":
                    self.emission_train = (self.train_time / 60.0 * emissions_data["Train"]["KTX_Sancheon_and_Mugunghwa"]["speed"] *
                                           emissions_data["Train"]["KTX_Sancheon_and_Mugunghwa"]["emission"])
                case "3":
                    self.emission_train = (self.train_time / 60.0 * emissions_data["Train"]["Nuriro_and_ITX_Cheongchun_and_ITX_Saemaeul"]["speed"] *
                                           emissions_data["Train"]["Nuriro_and_ITX_Cheongchun_and_ITX_Saemaeul"]["emission"])
                case _:
                    self.emission_train = 0.0
                    print("잘못된 값을 입력하셨습니다, 열차는 계산에서 제외됩니다")
        else:
            print("입력된 기차가 없습니다")

    def calculate_co2(self):
        # move_bus = (25.0/60.0 * emissions_data["Bus"]["speed"])*emissions_data["Bus"]["emission"]
        self.emissions_co2 = (self.emission_bus + self.emission_subway + self.emission_s_flight +
                              self.emission_l_flight + self.emission_g_car + self.emission_d_car +
                              self.emission_elec_car + self.emission_elec_bicycle + self.emission_train)

        return round(self.emissions_co2,2)

    def calculate_avg_emission(self): # 비교 대조용으로 사용, 실질적으로 사용되진 않음 ( 검증용 )
        for index in range(len(self.list_avg)):
            self.avg_emission += emissions_data[self.list_avg[index]]['avg_emission'] * ( self.list_vtime[index] )

        if self.using_train == 1 :
            self.avg_emission += emissions_data["Train"]["KTX"]['avg_emission'] * self.train_time
        elif self.using_train == 2:
            self.avg_emission += emissions_data["Train"]["KTX_Sancheon_and_Mugunghwa"]['avg_emission'] * self.train_time
        elif self.using_train == 3:
            self.avg_emission += emissions_data["Train"]["Nuriro_and_ITX_Cheongchun_and_ITX_Saemaeul"]['avg_emission'] * self.train_time

            # emissions_data[self.list_avg[index]]['avg_emission'] => km 당 평균 배출량
        return self.avg_emission

    def calculate_only_car(self):
        total_car_emission = 0.0
        # 비행기를 제외한 나머지 이동수단의 시간을 모두 차량 이동으로 가정하고 배출량 계산
        for time in self.list_vtime:
            total_car_emission += (time / 60.0) * emissions_data["Gasoline_Car"]["speed"] * emissions_data["Gasoline_Car"]["emission"]

        # 비행기 배출량
        total_car_emission += self.emission_s_flight
        total_car_emission += self.emission_l_flight

        # 최종 배출량을 kg 단위로 변환
        return round(total_car_emission / 1000.0, 2)

'''
# test
vehicle = VehicleCo2(bus_time=30, subway_time=50, electric_car_time=50,train_time=43)
vehicle.set_train_kind('1')
print(vehicle.calculate_co2())
print(vehicle.calculate_only_car())
'''

Random_OBJ_Image.py

import tkinter as tk
from PIL import Image, ImageTk
import random
import os

emission_co2 = 1.0
dif_emission_co2 = 0.0
customer = '신세계'

def set_emission_co2(value):
    global emission_co2
    emission_co2 = value

def set_dif_emission_co2(value):
    global dif_emission_co2
    dif_emission_co2 = value

def Dp_Random_Img(image_folder):
    # 이미지 폴더의 모든 파일을 가져옴

    image_files = [f for f in os.listdir(image_folder) if f.endswith(('png', 'jpg', 'jpeg', 'gif'))]

    # 이미지와 관련된 데이터를 리스트로 관리
    image_data = {
        'tree.jpg': (int(dif_emission_co2/9.2), '그루', '나무'),
        'bee.png': (int(dif_emission_co2*500), '마리', '벌'),
        'sunflower.jpg': (int(dif_emission_co2/1.5), '송이', '해바라기')
    }

    # 랜덤으로 이미지 파일 선택
    # selected_image = random.choice(image_files)

    if dif_emission_co2 >= 9.2:
        selected_image = random.choice(['tree.jpg', 'sunflower.jpg'])
    else:
        selected_image = 'bee.png'

    kg = 'kg'

    # 이미지 파일 경로
    image_path = os.path.join(image_folder, selected_image)

    # 선택된 이미지에 따른 변수 설정
    if selected_image in image_data:
        n, unit, random_obj = image_data[selected_image]
        if selected_image == 'bee.png':
            kg = 'g'
            emission_co2_converted = emission_co2 * 1000  # g 단위로 변환
            dif_emission_co2_converted = dif_emission_co2 * 1000  # g 단위로 변환
        else:
            emission_co2_converted = emission_co2  # kg 단위 그대로 사용
            dif_emission_co2_converted = dif_emission_co2  # kg 단위 그대로 사용
    else:
        n, unit, random_obj = (1, '개', '알 수 없는 객체')
        emission_co2_converted = emission_co2
        dif_emission_co2_converted = dif_emission_co2

    # 최상단에 표시할 텍스트와 폰트
    top_text = f"고마워요! {customer}님!\n 덕분에 {n}{unit}의 {random_obj}들을 지켰어요!"
    top_text_font = ("NanumGothic", 20, "bold")

    mileage = random.randint(100, 1000)
    # 출력할 텍스트 라인과 폰트
    text_lines = [
        f"총 {emission_co2_converted}{kg}의 탄소배출량이 발생했고,",
        f"평균 여행보다 {dif_emission_co2_converted}{kg} 만큼의 탄소배출량이 줄었어요!",
        f"현재까지 {mileage} 그린마일리지 적립!"
    ]
    text_font = ("NanumGothic", 14)

    # Tkinter 창 생성
    root = tk.Tk()
    root.title("G-SOK Map")

    # 최상단 텍스트 라벨 추가
    top_text_label = tk.Label(root, text=top_text, font=top_text_font)
    top_text_label.pack(pady=10)

    # 이미지를 로드하고 표시
    img = Image.open(image_path)
    img = img.resize((600, 500),Image.Resampling.LANCZOS)
    # Image.Resampling.LANCZOS : 이미지 리사이즈시 화질 저하를 완화해주는 코드 
    # // pillow 10.0.0 버전 이후 함수명 바뀜
    img = ImageTk.PhotoImage(img)

    panel = tk.Label(root, image=img)
    panel.pack(side="top", fill="both", expand="yes")

    # 텍스트 라벨 추가
    for line in text_lines:
        text_label = tk.Label(root, text=line, font=text_font)
        text_label.pack()

    # Tkinter 이벤트 루프 시작
    root.mainloop()

# 이미지 폴더 경로
# image_folder = "C:/ABCBootCamp/G_SOK_MAP_Project/ImgFolder"
#
# Dp_Random_Img(image_folder)

G_Sok_Main.py

from Func_CountCO2 import VehicleCo2
from Random_OBJ_Image import Dp_Random_Img, set_emission_co2, set_dif_emission_co2

# 이동 수단 입력
em_vehicle = VehicleCo2(bus_time=30, subway_time=50, electric_car_time=50,train_time=43)

if em_vehicle.Bool_trainUsed == True:
    using_train = input('KTX면 1, KTX Sancheon 또는 Mugunghwa면 2, Nuriho 또는 ITX 일 경우 3번을 입력해주세요 : ')
    em_vehicle.set_train_kind(using_train=using_train)
# em_vehicle.set_train_kind('3')
emission_co2_value = round(em_vehicle.calculate_co2()/1000.0,2) # kg 단위

# 결과를 Random_OBJ_Image의 emission_co2 변수에 설정
set_emission_co2(emission_co2_value)
set_dif_emission_co2(round(em_vehicle.calculate_only_car()-emission_co2_value,1))

image_folder = "C:/ABCBootCamp/G_SOK_MAP_Project/ImgFolder"
# 해당 이미지 경로에 이름과 맞는 이미지가 있어야 작동
Dp_Random_Img(image_folder)

동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.