
๐ทย CCTV

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()
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