Untitled

๐Ÿ“ทย CCTV

์Šคํฌ๋ฆฐ์ƒท 2023-11-07 211725.png

๐ŸŒย main.py

from flask import Flask, request, Response, jsonify, make_response
from flask_cors import CORS
import requests
import traceback
import mysql.connector
import json

from distance import point_to_line_distance
from distance import coordinate_to_meter

def isCCTV_near(CCTV, nodes):
    point = [CCTV[12], CCTV[11]]
    for i in range(len(nodes)-1):
        distance_coordinate = point_to_line_distance(point, nodes[i], nodes[i+1])
        distance_meter = coordinate_to_meter(distance_coordinate)
        if distance_meter < 100:
            return True
    return False

app = Flask(__name__)
CORS(app)  
app.config['JSON_AS_ASCII'] = False

@app.route('/find_safe_route', methods=['GET'])
def find_safe_route():
    try:
        # ๋งค๊ฐœ๋ณ€์ˆ˜ ์„ธํŒ… ๋ฐ OSRM์— request
        depart_x = request.args.get('depart_x')
        depart_y = request.args.get('depart_y')
        arrive_x = request.args.get('arrive_x')
        arrive_y = request.args.get('arrive_y')
        OSRM_url = "<http://localhost:5000/route/v1/foot/"+depart_x+","+depart_y+";"+arrive_x+","+arrive_y+"?alternatives=3&steps=true">
        OSRM_response = requests.get(url=OSRM_url)
        if OSRM_response.status_code == 404:
            response = {'code': 404, 'message': 'OSRM response 404'}
            return make_response(json.dumps(response, ensure_ascii=False))
        else:
            # nodes ์ฑ„์šฐ๊ธฐ
            routes = OSRM_response.json()['routes']
            num_route = len(routes)
            nodes = [[] for _ in range(num_route)]
            near_cctv = [{} for _ in range(num_route)]
            for i in range(num_route):
                nodes[i] = [[float(depart_x), float(depart_y)]]
                near_cctv[i] = []
                steps = routes[i]['legs'][0]['steps']
                for step in steps:
                    nodes[i].append(step['maneuver']['location'])
                nodes[i].append([float(arrive_x), float(arrive_y)])
            # near_cctv ์ฑ„์šฐ๊ธฐ
            select_query = "select * from CCTV where (์ดฌ์˜๋ฐฉ๋ฉด not like '%๋„›์ถœ์„ ์ฐฉ์žฅ%' and ์ดฌ์˜๋ฐฉ๋ฉด not like '%๋ฏผ์›์‹ค%' and ์ดฌ์˜๋ฐฉ๋ฉด not like '%๋ณต์ง€์ƒ๋‹ด์‹ค%' and ์ดฌ์˜๋ฐฉ๋ฉด not like '%์„ ์ง„ํฌ๋ฌผ๋Ÿ‰์žฅ%' and ์ดฌ์˜๋ฐฉ๋ฉด not like '%์ฒญ์‚ฌ%')"
            cursor.execute(select_query)
            CCTVs = cursor.fetchall()
            near_cctv_label = ['๋ฒˆํ˜ธ', '๊ด€๋ฆฌ๊ธฐ๊ด€๋ช…', '์†Œ์žฌ์ง€๋„๋กœ๋ช…์ฃผ์†Œ', '์†Œ์žฌ์ง€๋ฒˆ์ฃผ์†Œ', '์„ค์น˜๋ชฉ์ ', '์นด๋ฉ”๋ผ๋Œ€์ˆ˜', '์นด๋ฉ”๋ผํ™”์†Œ', '์ดฌ์˜๋ฐฉ๋ฉด์ •๋ณด', '๋ณด๊ด€์ผ์ˆ˜', '์„ค์น˜์—ฐ์›”', '๊ด€๋ฆฌ๊ธฐ๊ด€์ „ํ™”๋ฒˆํ˜ธ', 'WGS84์œ„๋„', 'WGS84๊ฒฝ๋„', '๋ฐ์ดํ„ฐ๊ธฐ์ค€์ผ์ž']
            for CCTV in CCTVs:
                for i in range(num_route):
                    if isCCTV_near(CCTV, nodes[i]):
                        tmp_cctv = {}
                        for j in range(len(near_cctv_label)):
                            tmp_cctv[near_cctv_label[j]] = CCTV[j]
                        near_cctv[i].append(tmp_cctv)
            # response ๋ณด๋‚ด๊ธฐ
                        response = {'code': 200, 'data': {'OSRM_response': OSRM_response.json(), 'near_cctv': near_cctv}}
            return make_response(json.dumps(response, ensure_ascii=False))
    except Exception as e:
        err = traceback.format_exc()
        response = {'code': 400, 'message': err}
        return make_response(json.dumps(response, ensure_ascii=False))

if __name__ == '__main__':
    db_connection = mysql.connector.connect(
        host="localhost",
        user="",
        password="",
        database="safety_route"
    )
    cursor = db_connection.cursor()
    app.run(host='0.0.0.0', port=5001)
    cursor.close()
    db_connection.close()

๐Ÿ“ย distance.py

import math

# ๋‘ ์  ๊ฐ„์˜ ์œ ํด๋ฆฌ๋“œ ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ
def euclidean_distance(point1, point2):
    x1, y1 = point1
    x2, y2 = point2
    return math.sqrt((x2 - x1)**2 + (y2 - y1)**2)

# ์ ๊ณผ ์„ ๋ถ„ ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ
def point_to_line_distance(point, line_start, line_end):
    x, y = point
    x1, y1 = line_start
    x2, y2 = line_end

    # ์„ ๋ถ„์˜ ๊ธธ์ด ๊ณ„์‚ฐ
    line_length = euclidean_distance(line_start, line_end)

    # ์„ ๋ถ„์ด ์ˆ˜์ง์ธ ๊ฒฝ์šฐ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ
    if line_length == 0:
        return euclidean_distance(point, line_start)

    # ์„ ๋ถ„์˜ ๋ฐฉํ–ฅ ๋ฒกํ„ฐ ๊ณ„์‚ฐ
    dx = (x2 - x1) / line_length
    dy = (y2 - y1) / line_length

    # ์ ๊ณผ ์„ ๋ถ„์˜ ์‹œ์ž‘์ ๊ณผ์˜ ์ƒ๋Œ€์  ์œ„์น˜ ๋ฒกํ„ฐ ๊ณ„์‚ฐ
    relative_x = x - x1
    relative_y = y - y1

    # ์ ๊ณผ ์„ ๋ถ„ ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ
    dot_product = relative_x * dx + relative_y * dy

    if dot_product < 0:
        # ์ ์ด ์„ ๋ถ„์˜ ์‹œ์ž‘์  ์•ž์— ์žˆ๋Š” ๊ฒฝ์šฐ
        return euclidean_distance(point, line_start)
    elif dot_product > line_length:
        # ์ ์ด ์„ ๋ถ„์˜ ๋์  ๋’ค์— ์žˆ๋Š” ๊ฒฝ์šฐ
        return euclidean_distance(point, line_end)
    else:
        # ์ ์ด ์„ ๋ถ„ ์œ„์— ์žˆ๋Š” ๊ฒฝ์šฐ
        perpendicular_distance = abs(relative_x * dy - relative_y * dx)
        return perpendicular_distance
    
def coordinate_to_meter(c):
    # ์œ„๋„ 36๋„ ๊ธฐ์ค€ : ๊ฒฝ๋„1๋„=90180m ์œ„๋„1๋„=110940m
    # ์–ด๋ฆผ์žก์•„ 1๋„ ์ฐจ์ด = 100000m ๋กœ ์„ค์ •
    return c * 100000