{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import os\n",
"import pandas as pd\n",
"import numpy as np\n",
"import sys\n",
"sys.path.append('../../Scripts')\n",
"from preprocess_daily import DailyPreprocessor\n",
"from generate_signals import SignalGenerator"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"비보호좌회전, 신호우회전, 유턴\n",
"\n",
"줄임말 목록\n",
"- `i` : 교차로번호, `inter_no`\n",
"- `f` : 진입, from, `inc_edge_id`\n",
"- `t` : 진출, to, `out_edge_id`\n",
"- `vec` : 방향벡터, unit vector (`np.array([0.6, 0.8])`)\n",
"- `dire` : 방위, direction (동, 서, 남, 북, 북동, 북서, 남동, 남서)\n",
"- `rvec` : 정방향 방향벡터, unit vector to the right direction (`np.array([0,1])`)\n",
"\n",
"필요한 객체들 목록\n",
"\n",
"- `inter2dire2rvec` : `inter_no` $\\mapsto$ `dire2rvec`\n",
" - `dire2rvec` : `dire` $\\mapsto$ `rvec`\n",
"- `inter2incs` : `inter_no` $\\mapsto$ `inc_edge_ids`\n",
"- `inter2outs` : `inter_no` $\\mapsto$ `out_edge_ids`\n",
"- `inter2inc2dire` : `inter_no` $\\mapsto$ `int2dire`\n",
" - `inc2dire` : `out_edge_id` $\\mapsto$ `dire`\n",
"- `inter2out2dire` : `inter_no` $\\mapsto$ `out2dire`\n",
" - `out2dire` : `inc_edge_id` $\\mapsto$ `dire`\n",
"- `inter2inc2vec` : `inter_no` $\\mapsto$ `int2vec`\n",
" - `inc2vec` : `out_edge_id` $\\mapsto$ `vec`\n",
"- `inter2out2vec` : `inter_no` $\\mapsto$ `out2vec`\n",
" - `out2vec` : `inc_edge_id` $\\mapsto$ `vec`\n",
"\n",
"좌회전 판단\n",
"\n",
"Given `inter_no`, `inc_edge_id` and `out_edge_id`, we have `inc_vec = inter2inc2vec[inter_no][inc_edge_id]` and `out_vec = inter2out2vec[inter_no][out_edge_id]`.\n",
"Rotate `inc_vec` by 90, 180 and 270 degrees clockwise, to define \n",
"`out_vec_left`, `out_vec_straight` and `out_vec_right`.\n",
"Define `out_vecs={'right':out_vec_left, 'straight':out_vec_straight, 'right':out_vec_right}`.\n",
"Select the key that maximize the similarity of the corresponding value of the key and `inc_vec`."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1. 데이터를 로드합니다.\n",
"1-1. 네트워크가 로드되었습니다.\n",
"1-2. 테이블들이 로드되었습니다.\n",
"1-3. 네트워크의 모든 clean state requirement들을 체크했습니다.\n",
"1-4. 테이블들의 무결성 검사를 완료했습니다.\n",
"1-5. 주요 객체 (리스트, 딕셔너리)들을 저장했습니다.\n"
]
},
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" parent_id | \n",
" child_id | \n",
" adj_from_edge_id | \n",
" adj_to_edge_id | \n",
" from_edge_id | \n",
" to_edge_id | \n",
" condition | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" i0 | \n",
" u00 | \n",
" -571500487_01 | \n",
" 571500487_01 | \n",
" 571500487_02 | \n",
" 571500487_01.32 | \n",
" 좌회전시 | \n",
"
\n",
" \n",
" 1 | \n",
" i2 | \n",
" u20 | \n",
" 571542811_02 | \n",
" 571542811_01 | \n",
" 571542810_01.51 | \n",
" 571542810_02 | \n",
" 보행신호시 | \n",
"
\n",
" \n",
" 2 | \n",
" i3 | \n",
" u30 | \n",
" 571556450_02 | \n",
" 571556450_01 | \n",
" 571556452_01 | \n",
" 571556452_02 | \n",
" 보행신호시 | \n",
"
\n",
" \n",
" 3 | \n",
" i3 | \n",
" u31 | \n",
" -571500475_01 | \n",
" 571500475_01 | \n",
" 571500475_02 | \n",
" 571500475_01.26 | \n",
" 보행신호시 | \n",
"
\n",
" \n",
" 4 | \n",
" i3 | \n",
" u32 | \n",
" 571540303_02.21 | \n",
" 571540303_01 | \n",
" 571540303_02 | \n",
" -571540303_02 | \n",
" 보행신호시 | \n",
"
\n",
" \n",
" 5 | \n",
" i6 | \n",
" u60 | \n",
" 571500535_02.18 | \n",
" 571500535_01 | \n",
" 571500535_02 | \n",
" -571500535_02 | \n",
" 좌회전시 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" parent_id child_id adj_from_edge_id adj_to_edge_id from_edge_id \\\n",
"0 i0 u00 -571500487_01 571500487_01 571500487_02 \n",
"1 i2 u20 571542811_02 571542811_01 571542810_01.51 \n",
"2 i3 u30 571556450_02 571556450_01 571556452_01 \n",
"3 i3 u31 -571500475_01 571500475_01 571500475_02 \n",
"4 i3 u32 571540303_02.21 571540303_01 571540303_02 \n",
"5 i6 u60 571500535_02.18 571500535_01 571500535_02 \n",
"\n",
" to_edge_id condition \n",
"0 571500487_01.32 좌회전시 \n",
"1 571542810_02 보행신호시 \n",
"2 571556452_02 보행신호시 \n",
"3 571500475_01.26 보행신호시 \n",
"4 -571540303_02 보행신호시 \n",
"5 -571500535_02 좌회전시 "
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"self = DailyPreprocessor()\n",
"self.load_data()\n",
"self.make_match1()\n",
"self.make_match2()\n",
"self.make_match3()\n",
"self.make_match4()\n",
"self.make_match5()\n",
"self.u_turn = pd.merge(self.u_turn, self.u_condition, on='child_id')\n",
"display(self.u_turn)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" parent_id | \n",
" child_id | \n",
" adj_from_edge_id | \n",
" adj_to_edge_id | \n",
" from_edge_id | \n",
" to_edge_id | \n",
" condition | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" i0 | \n",
" u00 | \n",
" -571500487_01 | \n",
" 571500487_01 | \n",
" 571500487_02 | \n",
" 571500487_01.32 | \n",
" 좌회전시 | \n",
"
\n",
" \n",
" 1 | \n",
" i2 | \n",
" u20 | \n",
" 571542811_02 | \n",
" 571542811_01 | \n",
" 571542810_01.51 | \n",
" 571542810_02 | \n",
" 보행신호시 | \n",
"
\n",
" \n",
" 2 | \n",
" i3 | \n",
" u30 | \n",
" 571556450_02 | \n",
" 571556450_01 | \n",
" 571556452_01 | \n",
" 571556452_02 | \n",
" 보행신호시 | \n",
"
\n",
" \n",
" 3 | \n",
" i3 | \n",
" u31 | \n",
" -571500475_01 | \n",
" 571500475_01 | \n",
" 571500475_02 | \n",
" 571500475_01.26 | \n",
" 보행신호시 | \n",
"
\n",
" \n",
" 4 | \n",
" i3 | \n",
" u32 | \n",
" 571540303_02.21 | \n",
" 571540303_01 | \n",
" 571540303_02 | \n",
" -571540303_02 | \n",
" 보행신호시 | \n",
"
\n",
" \n",
" 5 | \n",
" i6 | \n",
" u60 | \n",
" 571500535_02.18 | \n",
" 571500535_01 | \n",
" 571500535_02 | \n",
" -571500535_02 | \n",
" 좌회전시 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" parent_id child_id adj_from_edge_id adj_to_edge_id from_edge_id \\\n",
"0 i0 u00 -571500487_01 571500487_01 571500487_02 \n",
"1 i2 u20 571542811_02 571542811_01 571542810_01.51 \n",
"2 i3 u30 571556450_02 571556450_01 571556452_01 \n",
"3 i3 u31 -571500475_01 571500475_01 571500475_02 \n",
"4 i3 u32 571540303_02.21 571540303_01 571540303_02 \n",
"5 i6 u60 571500535_02.18 571500535_01 571500535_02 \n",
"\n",
" to_edge_id condition \n",
"0 571500487_01.32 좌회전시 \n",
"1 571542810_02 보행신호시 \n",
"2 571556452_02 보행신호시 \n",
"3 571500475_01.26 보행신호시 \n",
"4 -571540303_02 보행신호시 \n",
"5 -571500535_02 좌회전시 "
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"self.u_turn"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"# p2inc_edge2angle : node_id to inc_edge2angle\n",
"p2inc_edge2angle = dict()\n",
"# p2out_edge2angle : node_id to out_edge2angle\n",
"p2out_edge2angle = dict()\n",
"# p2inc_angle2edge : node_id to inc_angle2edge\n",
"p2inc_angle2edge = dict()\n",
"# p2out_angle2edge : node_id to out_angle2edge\n",
"p2out_angle2edge = dict()\n",
"for node_id in self.parent_ids:\n",
" m5 = self.match5[self.match5.node_id==node_id]\n",
" m5 = m5.dropna(subset=['inc_edge_id', 'out_edge_id'])\n",
" # inc_edge2angle : inc_edge_id to inc_angle\n",
" inc_edge2angle = dict(zip(m5.inc_edge_id, m5.inc_angle.astype(int)))\n",
" p2inc_edge2angle[node_id] = inc_edge2angle\n",
" # out_edge2angle : out_edge_id to out_angle\n",
" out_edge2angle = dict(zip(m5.out_edge_id, m5.out_angle.astype(int)))\n",
" p2out_edge2angle[node_id] = out_edge2angle\n",
" # inc_angle2edge : inc_angle to inc_edge_id\n",
" inc_angle2edge = dict(zip(m5.inc_angle.astype(int), m5.inc_edge_id))\n",
" p2inc_angle2edge[node_id] = inc_angle2edge\n",
" # out_angle2edge : out_angle to out_edge_id\n",
" out_angle2edge = dict(zip(m5.out_angle.astype(int), m5.out_edge_id))\n",
" p2out_angle2edge[node_id] = out_angle2edge"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"['i0', 'i1', 'i2', 'i3', 'i6', 'i7', 'i8', 'i9']\n"
]
}
],
"source": [
"print(self.parent_ids)"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" parent_id | \n",
" child_id | \n",
" adj_from_edge_id | \n",
" adj_to_edge_id | \n",
" from_edge_id | \n",
" to_edge_id | \n",
" condition | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" i0 | \n",
" u00 | \n",
" -571500487_01 | \n",
" 571500487_01 | \n",
" 571500487_02 | \n",
" 571500487_01.32 | \n",
" 좌회전시 | \n",
"
\n",
" \n",
" 1 | \n",
" i2 | \n",
" u20 | \n",
" 571542811_02 | \n",
" 571542811_01 | \n",
" 571542810_01.51 | \n",
" 571542810_02 | \n",
" 보행신호시 | \n",
"
\n",
" \n",
" 2 | \n",
" i3 | \n",
" u30 | \n",
" 571556450_02 | \n",
" 571556450_01 | \n",
" 571556452_01 | \n",
" 571556452_02 | \n",
" 보행신호시 | \n",
"
\n",
" \n",
" 3 | \n",
" i3 | \n",
" u31 | \n",
" -571500475_01 | \n",
" 571500475_01 | \n",
" 571500475_02 | \n",
" 571500475_01.26 | \n",
" 보행신호시 | \n",
"
\n",
" \n",
" 4 | \n",
" i3 | \n",
" u32 | \n",
" 571540303_02.21 | \n",
" 571540303_01 | \n",
" 571540303_02 | \n",
" -571540303_02 | \n",
" 보행신호시 | \n",
"
\n",
" \n",
" 5 | \n",
" i6 | \n",
" u60 | \n",
" 571500535_02.18 | \n",
" 571500535_01 | \n",
" 571500535_02 | \n",
" -571500535_02 | \n",
" 좌회전시 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" parent_id child_id adj_from_edge_id adj_to_edge_id from_edge_id \\\n",
"0 i0 u00 -571500487_01 571500487_01 571500487_02 \n",
"1 i2 u20 571542811_02 571542811_01 571542810_01.51 \n",
"2 i3 u30 571556450_02 571556450_01 571556452_01 \n",
"3 i3 u31 -571500475_01 571500475_01 571500475_02 \n",
"4 i3 u32 571540303_02.21 571540303_01 571540303_02 \n",
"5 i6 u60 571500535_02.18 571500535_01 571500535_02 \n",
"\n",
" to_edge_id condition \n",
"0 571500487_01.32 좌회전시 \n",
"1 571542810_02 보행신호시 \n",
"2 571556452_02 보행신호시 \n",
"3 571500475_01.26 보행신호시 \n",
"4 -571540303_02 보행신호시 \n",
"5 -571500535_02 좌회전시 "
]
},
"execution_count": 37,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"self.u_turn"
]
},
{
"cell_type": "code",
"execution_count": 52,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" inter_no | \n",
" node_id | \n",
" inter_type | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 175 | \n",
" i0 | \n",
" parent | \n",
"
\n",
" \n",
" 1 | \n",
" 175 | \n",
" u00 | \n",
" child | \n",
"
\n",
" \n",
" 2 | \n",
" 176 | \n",
" i1 | \n",
" parent | \n",
"
\n",
" \n",
" 3 | \n",
" 177 | \n",
" i2 | \n",
" parent | \n",
"
\n",
" \n",
" 4 | \n",
" 177 | \n",
" u20 | \n",
" child | \n",
"
\n",
" \n",
" 5 | \n",
" 178 | \n",
" i3 | \n",
" parent | \n",
"
\n",
" \n",
" 6 | \n",
" 178 | \n",
" u30 | \n",
" child | \n",
"
\n",
" \n",
" 7 | \n",
" 178 | \n",
" u31 | \n",
" child | \n",
"
\n",
" \n",
" 8 | \n",
" 178 | \n",
" u32 | \n",
" child | \n",
"
\n",
" \n",
" 9 | \n",
" 201 | \n",
" i8 | \n",
" parent | \n",
"
\n",
" \n",
" 10 | \n",
" 202 | \n",
" i9 | \n",
" parent | \n",
"
\n",
" \n",
" 11 | \n",
" 206 | \n",
" i7 | \n",
" parent | \n",
"
\n",
" \n",
" 12 | \n",
" 210 | \n",
" i6 | \n",
" parent | \n",
"
\n",
" \n",
" 13 | \n",
" 210 | \n",
" u60 | \n",
" child | \n",
"
\n",
" \n",
" 14 | \n",
" 178 | \n",
" c30 | \n",
" child | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" inter_no node_id inter_type\n",
"0 175 i0 parent\n",
"1 175 u00 child\n",
"2 176 i1 parent\n",
"3 177 i2 parent\n",
"4 177 u20 child\n",
"5 178 i3 parent\n",
"6 178 u30 child\n",
"7 178 u31 child\n",
"8 178 u32 child\n",
"9 201 i8 parent\n",
"10 202 i9 parent\n",
"11 206 i7 parent\n",
"12 210 i6 parent\n",
"13 210 u60 child\n",
"14 178 c30 child"
]
},
"execution_count": 52,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"self.inter_node"
]
},
{
"cell_type": "code",
"execution_count": 51,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" inter_no | \n",
" phase_no | \n",
" ring_type | \n",
" move_no | \n",
" inc_dire | \n",
" out_dire | \n",
" inc_angle | \n",
" out_angle | \n",
" inc_edge_id | \n",
" out_edge_id | \n",
" node_id | \n",
" turn_type | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 175 | \n",
" 1 | \n",
" A | \n",
" 8 | \n",
" 남 | \n",
" 북 | \n",
" 179 | \n",
" 000 | \n",
" -571542797_02 | \n",
" 571500487_01 | \n",
" i0 | \n",
" straight | \n",
"
\n",
" \n",
" 1 | \n",
" 175 | \n",
" 1 | \n",
" B | \n",
" 4 | \n",
" 북 | \n",
" 남 | \n",
" 001 | \n",
" 180 | \n",
" -571500487_01 | \n",
" 571542797_02 | \n",
" i0 | \n",
" straight | \n",
"
\n",
" \n",
" 2 | \n",
" 175 | \n",
" 2 | \n",
" A | \n",
" 7 | \n",
" 북 | \n",
" 동 | \n",
" 001 | \n",
" 090 | \n",
" -571500487_01 | \n",
" 571545870_01 | \n",
" i0 | \n",
" left | \n",
"
\n",
" \n",
" 3 | \n",
" 175 | \n",
" 2 | \n",
" B | \n",
" 3 | \n",
" 남 | \n",
" 서 | \n",
" 179 | \n",
" 270 | \n",
" -571542797_02 | \n",
" 571510153_01 | \n",
" i0 | \n",
" left | \n",
"
\n",
" \n",
" 4 | \n",
" 175 | \n",
" 3 | \n",
" A | \n",
" 6 | \n",
" 동 | \n",
" 서 | \n",
" 090 | \n",
" 270 | \n",
" 571545870_02 | \n",
" 571510153_01 | \n",
" i0 | \n",
" straight | \n",
"
\n",
" \n",
" 5 | \n",
" 175 | \n",
" 3 | \n",
" B | \n",
" 1 | \n",
" 동 | \n",
" 남 | \n",
" 090 | \n",
" 180 | \n",
" 571545870_02 | \n",
" 571542797_02 | \n",
" i0 | \n",
" left | \n",
"
\n",
" \n",
" 6 | \n",
" 175 | \n",
" 4 | \n",
" A | \n",
" 5 | \n",
" 서 | \n",
" 북 | \n",
" 270 | \n",
" 000 | \n",
" 571510153_02 | \n",
" 571500487_01 | \n",
" i0 | \n",
" left | \n",
"
\n",
" \n",
" 7 | \n",
" 175 | \n",
" 4 | \n",
" B | \n",
" 2 | \n",
" 서 | \n",
" 동 | \n",
" 270 | \n",
" 090 | \n",
" 571510153_02 | \n",
" 571545870_01 | \n",
" i0 | \n",
" straight | \n",
"
\n",
" \n",
" 14 | \n",
" 177 | \n",
" 1 | \n",
" A | \n",
" 8 | \n",
" 남 | \n",
" 북 | \n",
" 179 | \n",
" 000 | \n",
" -571542809_01 | \n",
" 571542811_01 | \n",
" i2 | \n",
" straight | \n",
"
\n",
" \n",
" 15 | \n",
" 177 | \n",
" 1 | \n",
" B | \n",
" 4 | \n",
" 북 | \n",
" 남 | \n",
" 000 | \n",
" 180 | \n",
" 571542811_02 | \n",
" 571542809_01 | \n",
" i2 | \n",
" straight | \n",
"
\n",
" \n",
" 16 | \n",
" 177 | \n",
" 2 | \n",
" A | \n",
" 17 | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" i2 | \n",
" NaN | \n",
"
\n",
" \n",
" 17 | \n",
" 177 | \n",
" 2 | \n",
" B | \n",
" 18 | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" i2 | \n",
" NaN | \n",
"
\n",
" \n",
" 18 | \n",
" 178 | \n",
" 1 | \n",
" A | \n",
" 8 | \n",
" 남 | \n",
" 북 | \n",
" 180 | \n",
" 000 | \n",
" 571540304_02 | \n",
" 571556450_01 | \n",
" i3 | \n",
" straight | \n",
"
\n",
" \n",
" 19 | \n",
" 178 | \n",
" 1 | \n",
" B | \n",
" 4 | \n",
" 북 | \n",
" 남 | \n",
" 000 | \n",
" 180 | \n",
" 571556450_02 | \n",
" 571540304_01 | \n",
" i3 | \n",
" straight | \n",
"
\n",
" \n",
" 20 | \n",
" 178 | \n",
" 2 | \n",
" A | \n",
" 7 | \n",
" 북 | \n",
" 동 | \n",
" 000 | \n",
" 090 | \n",
" 571556450_02 | \n",
" 571500475_01 | \n",
" i3 | \n",
" left | \n",
"
\n",
" \n",
" 21 | \n",
" 178 | \n",
" 2 | \n",
" B | \n",
" 3 | \n",
" 남 | \n",
" 서 | \n",
" 180 | \n",
" 270 | \n",
" 571540304_02 | \n",
" 571540303_01 | \n",
" i3 | \n",
" left | \n",
"
\n",
" \n",
" 22 | \n",
" 178 | \n",
" 3 | \n",
" A | \n",
" 5 | \n",
" 서 | \n",
" 북 | \n",
" 270 | \n",
" 000 | \n",
" 571540303_02.21 | \n",
" 571556450_01 | \n",
" i3 | \n",
" left | \n",
"
\n",
" \n",
" 23 | \n",
" 178 | \n",
" 3 | \n",
" B | \n",
" 2 | \n",
" 서 | \n",
" 동 | \n",
" 270 | \n",
" 090 | \n",
" 571540303_02.21 | \n",
" 571500475_01 | \n",
" i3 | \n",
" straight | \n",
"
\n",
" \n",
" 24 | \n",
" 178 | \n",
" 4 | \n",
" A | \n",
" 6 | \n",
" 동 | \n",
" 서 | \n",
" 090 | \n",
" 270 | \n",
" -571500475_01 | \n",
" 571540303_01 | \n",
" i3 | \n",
" straight | \n",
"
\n",
" \n",
" 25 | \n",
" 178 | \n",
" 4 | \n",
" B | \n",
" 1 | \n",
" 동 | \n",
" 남 | \n",
" 090 | \n",
" 180 | \n",
" -571500475_01 | \n",
" 571540304_01 | \n",
" i3 | \n",
" left | \n",
"
\n",
" \n",
" 48 | \n",
" 210 | \n",
" 1 | \n",
" A | \n",
" 6 | \n",
" 동 | \n",
" 서 | \n",
" 090 | \n",
" 270 | \n",
" -571542115_01 | \n",
" 571500535_01 | \n",
" i6 | \n",
" straight | \n",
"
\n",
" \n",
" 49 | \n",
" 210 | \n",
" 1 | \n",
" B | \n",
" 18 | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" i6 | \n",
" NaN | \n",
"
\n",
" \n",
" 50 | \n",
" 210 | \n",
" 2 | \n",
" A | \n",
" 5 | \n",
" 서 | \n",
" 북 | \n",
" 270 | \n",
" 000 | \n",
" 571500535_02.18 | \n",
" 571511538_01 | \n",
" i6 | \n",
" left | \n",
"
\n",
" \n",
" 51 | \n",
" 210 | \n",
" 2 | \n",
" B | \n",
" 2 | \n",
" 서 | \n",
" 동 | \n",
" 270 | \n",
" 090 | \n",
" 571500535_02.18 | \n",
" 571542115_01 | \n",
" i6 | \n",
" straight | \n",
"
\n",
" \n",
" 52 | \n",
" 210 | \n",
" 3 | \n",
" A | \n",
" 7 | \n",
" 북 | \n",
" 동 | \n",
" 000 | \n",
" 090 | \n",
" 571511538_02.121 | \n",
" 571542115_01 | \n",
" i6 | \n",
" left | \n",
"
\n",
" \n",
" 53 | \n",
" 210 | \n",
" 3 | \n",
" B | \n",
" 4 | \n",
" 북 | \n",
" 남 | \n",
" 000 | \n",
" 180 | \n",
" 571511538_02.121 | \n",
" 571500585_01 | \n",
" i6 | \n",
" straight | \n",
"
\n",
" \n",
" 54 | \n",
" 210 | \n",
" 4 | \n",
" A | \n",
" 8 | \n",
" 남 | \n",
" 북 | \n",
" 180 | \n",
" 000 | \n",
" 571500585_02 | \n",
" 571511538_01 | \n",
" i6 | \n",
" straight | \n",
"
\n",
" \n",
" 55 | \n",
" 210 | \n",
" 4 | \n",
" B | \n",
" 3 | \n",
" 남 | \n",
" 서 | \n",
" 180 | \n",
" 270 | \n",
" 571500585_02 | \n",
" 571500535_01 | \n",
" i6 | \n",
" left | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" inter_no phase_no ring_type move_no inc_dire out_dire inc_angle \\\n",
"0 175 1 A 8 남 북 179 \n",
"1 175 1 B 4 북 남 001 \n",
"2 175 2 A 7 북 동 001 \n",
"3 175 2 B 3 남 서 179 \n",
"4 175 3 A 6 동 서 090 \n",
"5 175 3 B 1 동 남 090 \n",
"6 175 4 A 5 서 북 270 \n",
"7 175 4 B 2 서 동 270 \n",
"14 177 1 A 8 남 북 179 \n",
"15 177 1 B 4 북 남 000 \n",
"16 177 2 A 17 NaN NaN NaN \n",
"17 177 2 B 18 NaN NaN NaN \n",
"18 178 1 A 8 남 북 180 \n",
"19 178 1 B 4 북 남 000 \n",
"20 178 2 A 7 북 동 000 \n",
"21 178 2 B 3 남 서 180 \n",
"22 178 3 A 5 서 북 270 \n",
"23 178 3 B 2 서 동 270 \n",
"24 178 4 A 6 동 서 090 \n",
"25 178 4 B 1 동 남 090 \n",
"48 210 1 A 6 동 서 090 \n",
"49 210 1 B 18 NaN NaN NaN \n",
"50 210 2 A 5 서 북 270 \n",
"51 210 2 B 2 서 동 270 \n",
"52 210 3 A 7 북 동 000 \n",
"53 210 3 B 4 북 남 000 \n",
"54 210 4 A 8 남 북 180 \n",
"55 210 4 B 3 남 서 180 \n",
"\n",
" out_angle inc_edge_id out_edge_id node_id turn_type \n",
"0 000 -571542797_02 571500487_01 i0 straight \n",
"1 180 -571500487_01 571542797_02 i0 straight \n",
"2 090 -571500487_01 571545870_01 i0 left \n",
"3 270 -571542797_02 571510153_01 i0 left \n",
"4 270 571545870_02 571510153_01 i0 straight \n",
"5 180 571545870_02 571542797_02 i0 left \n",
"6 000 571510153_02 571500487_01 i0 left \n",
"7 090 571510153_02 571545870_01 i0 straight \n",
"14 000 -571542809_01 571542811_01 i2 straight \n",
"15 180 571542811_02 571542809_01 i2 straight \n",
"16 NaN NaN NaN i2 NaN \n",
"17 NaN NaN NaN i2 NaN \n",
"18 000 571540304_02 571556450_01 i3 straight \n",
"19 180 571556450_02 571540304_01 i3 straight \n",
"20 090 571556450_02 571500475_01 i3 left \n",
"21 270 571540304_02 571540303_01 i3 left \n",
"22 000 571540303_02.21 571556450_01 i3 left \n",
"23 090 571540303_02.21 571500475_01 i3 straight \n",
"24 270 -571500475_01 571540303_01 i3 straight \n",
"25 180 -571500475_01 571540304_01 i3 left \n",
"48 270 -571542115_01 571500535_01 i6 straight \n",
"49 NaN NaN NaN i6 NaN \n",
"50 000 571500535_02.18 571511538_01 i6 left \n",
"51 090 571500535_02.18 571542115_01 i6 straight \n",
"52 090 571511538_02.121 571542115_01 i6 left \n",
"53 180 571511538_02.121 571500585_01 i6 straight \n",
"54 000 571500585_02 571511538_01 i6 straight \n",
"55 270 571500585_02 571500535_01 i6 left "
]
},
"execution_count": 51,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"self.match5[self.match5.node_id.isin(self.u_turn.parent_id)]"
]
},
{
"cell_type": "code",
"execution_count": 109,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"i2 u20 보행신호시\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" inter_no | \n",
" phase_no | \n",
" ring_type | \n",
" move_no | \n",
" inc_dire | \n",
" out_dire | \n",
" inc_angle | \n",
" out_angle | \n",
" inc_edge_id | \n",
" out_edge_id | \n",
" node_id | \n",
" turn_type | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 177 | \n",
" 1 | \n",
" A | \n",
" 8 | \n",
" 남 | \n",
" 북 | \n",
" 179 | \n",
" 000 | \n",
" -571542809_01 | \n",
" 571542811_01 | \n",
" u20 | \n",
" straight | \n",
"
\n",
" \n",
" 1 | \n",
" 177 | \n",
" 1 | \n",
" B | \n",
" 4 | \n",
" 북 | \n",
" 남 | \n",
" 000 | \n",
" 180 | \n",
" 571542811_02 | \n",
" 571542809_01 | \n",
" u20 | \n",
" straight | \n",
"
\n",
" \n",
" 2 | \n",
" 177 | \n",
" 2 | \n",
" A | \n",
" 17 | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" u20 | \n",
" NaN | \n",
"
\n",
" \n",
" 3 | \n",
" 177 | \n",
" 2 | \n",
" B | \n",
" 18 | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" u20 | \n",
" NaN | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" inter_no phase_no ring_type move_no inc_dire out_dire inc_angle \\\n",
"0 177 1 A 8 남 북 179 \n",
"1 177 1 B 4 북 남 000 \n",
"2 177 2 A 17 NaN NaN NaN \n",
"3 177 2 B 18 NaN NaN NaN \n",
"\n",
" out_angle inc_edge_id out_edge_id node_id turn_type \n",
"0 000 -571542809_01 571542811_01 u20 straight \n",
"1 180 571542811_02 571542809_01 u20 straight \n",
"2 NaN NaN NaN u20 NaN \n",
"3 NaN NaN NaN u20 NaN "
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"0\n",
"[-360 -181 0 179 360 539]\n",
"[179 360 539]\n",
"179\n",
"-571542809_01\n",
"[-360 -180 0 180 360 540]\n",
"[-360 -180]\n",
"180\n",
"571542809_01\n",
"True\n",
"0 False\n",
"1 False\n",
"2 True\n",
"3 False\n",
"dtype: bool\n",
"0 True\n",
"1 False\n",
"2 False\n",
"3 False\n",
"Name: out_edge_id, dtype: bool\n",
"17\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" inter_no | \n",
" phase_no | \n",
" ring_type | \n",
" move_no | \n",
" inc_dire | \n",
" out_dire | \n",
" inc_angle | \n",
" out_angle | \n",
" inc_edge_id | \n",
" out_edge_id | \n",
" node_id | \n",
" turn_type | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 177 | \n",
" 1 | \n",
" A | \n",
" 8 | \n",
" 남 | \n",
" 북 | \n",
" 179 | \n",
" 000 | \n",
" NaN | \n",
" NaN | \n",
" u20 | \n",
" straight | \n",
"
\n",
" \n",
" 1 | \n",
" 177 | \n",
" 1 | \n",
" B | \n",
" 4 | \n",
" 북 | \n",
" 남 | \n",
" 000 | \n",
" 180 | \n",
" NaN | \n",
" NaN | \n",
" u20 | \n",
" straight | \n",
"
\n",
" \n",
" 2 | \n",
" 177 | \n",
" 2 | \n",
" A | \n",
" 17 | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" 571542810_01.51 | \n",
" 571542810_02 | \n",
" u20 | \n",
" NaN | \n",
"
\n",
" \n",
" 3 | \n",
" 177 | \n",
" 2 | \n",
" B | \n",
" 18 | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" u20 | \n",
" NaN | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" inter_no phase_no ring_type move_no inc_dire out_dire inc_angle \\\n",
"0 177 1 A 8 남 북 179 \n",
"1 177 1 B 4 북 남 000 \n",
"2 177 2 A 17 NaN NaN NaN \n",
"3 177 2 B 18 NaN NaN NaN \n",
"\n",
" out_angle inc_edge_id out_edge_id node_id turn_type \n",
"0 000 NaN NaN u20 straight \n",
"1 180 NaN NaN u20 straight \n",
"2 NaN 571542810_01.51 571542810_02 u20 NaN \n",
"3 NaN NaN NaN u20 NaN "
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"row = self.u_turn.iloc[1]\n",
"\n",
"parent_id = row.parent_id\n",
"child_id = row.child_id\n",
"condition = row.condition\n",
"inc_edge_id = row.from_edge_id\n",
"out_edge_id = row.to_edge_id\n",
"adj_inc_edge_id = row.adj_from_edge_id\n",
"adj_out_edge_id = row.adj_to_edge_id\n",
"\n",
"# match5에서 부모노드id에 해당하는 행들을 가져옴 (cmatch)\n",
"cmatch = self.match5.copy()[self.match5.node_id==parent_id] # match dataframe for a child node\n",
"cmatch = cmatch.sort_values(by=['phase_no', 'ring_type']).reset_index(drop=True)\n",
"cmatch['node_id'] = child_id\n",
"print(parent_id, child_id, condition)\n",
"display(cmatch)\n",
"\n",
"# 진입엣지 각도\n",
"inc_angle = p2inc_edge2angle[parent_id][adj_inc_edge_id]\n",
"print(inc_angle)\n",
"\n",
"# 이격각도\n",
"self.angle_separation = 10\n",
"\n",
"# 진입로 각도 목록\n",
"inc_angles = cmatch.dropna(subset=['inc_angle', 'out_angle']).inc_angle.astype(int).unique()\n",
"inc_angles = np.sort(inc_angles)\n",
"inc_angles = list(inc_angles - 360) + list(inc_angles) + list(inc_angles + 360)\n",
"inc_angles = np.array(inc_angles)\n",
"print(inc_angles)\n",
"\n",
"# 보행신호시의 진입로 각도\n",
"inc_angles_left = inc_angles[inc_angles >= inc_angle + self.angle_separation]\n",
"inc_angle_pedes = np.sort(inc_angles_left)[0] % 360\n",
"print(inc_angles_left)\n",
"print(inc_angle_pedes)\n",
"\n",
"# 보행신호시의 진입로 엣지id\n",
"inc_angle2edge = p2inc_angle2edge[parent_id]\n",
"inc_edge_id_pedes = inc_angle2edge[inc_angle_pedes]\n",
"print(inc_edge_id_pedes)\n",
"\n",
"# 진출로 각도 목록\n",
"out_angles = cmatch.dropna(subset=['inc_angle', 'out_angle']).out_angle.astype(int).unique()\n",
"out_angles = np.sort(out_angles)\n",
"out_angles = list(out_angles - 360) + list(out_angles) + list(out_angles + 360)\n",
"out_angles = np.array(out_angles)\n",
"print(out_angles)\n",
"\n",
"# 보행신호시의 진입로 각도\n",
"out_angles_right = out_angles[out_angles <= inc_angle - self.angle_separation]\n",
"out_angle_pedes = np.sort(out_angles_right)[-1] % 360\n",
"print(out_angles_right)\n",
"\n",
"print(out_angle_pedes)\n",
"\n",
"# 보행신호시의 진입로 엣지id\n",
"out_angle2edge = p2out_angle2edge[parent_id]\n",
"out_edge_id_pedes = out_angle2edge[out_angle_pedes]\n",
"print(out_edge_id_pedes)\n",
"\n",
"# 진입엣지/진출엣지 포함 조건\n",
"inc_true = (cmatch.inc_edge_id==adj_inc_edge_id)\n",
"out_true = (cmatch.out_edge_id==adj_out_edge_id)\n",
"\n",
"# 보행신호시 조건\n",
"pedes_flag = (cmatch.inc_edge_id==inc_edge_id_pedes) & (cmatch.out_edge_id==out_edge_id_pedes)\n",
"\n",
"# 좌회전시 조건\n",
"right_flag = inc_true & (cmatch.turn_type=='left')\n",
"\n",
"# 보행신호이동류(17) 조건\n",
"crosswalk_on = (cmatch.move_no==17) & ~ out_true\n",
"\n",
"# 신호없음이동류(18) 조건\n",
"all_redsigns = (cmatch.move_no==18) & ~ out_true\n",
"\n",
"# 보행신호시/좌회전시 진입/진출 엣지id 배정\n",
"cmatch[['inc_edge_id', 'out_edge_id']] = np.nan\n",
"if condition == \"보행신호시\":\n",
" cmatch.loc[pedes_flag, ['inc_edge_id', 'out_edge_id']] = [inc_edge_id, out_edge_id]\n",
"elif condition == \"좌회전시\":\n",
" cmatch.loc[right_flag, ['inc_edge_id', 'out_edge_id']] = [inc_edge_id, out_edge_id]\n",
"\n",
"uturn_not_assigned = cmatch[['inc_edge_id','out_edge_id']].isna().any(axis=1).all()\n",
"print(uturn_not_assigned)\n",
"print(crosswalk_on)\n",
"print(out_true)\n",
"\n",
"if uturn_not_assigned:\n",
" # 보행신호시\n",
" if pedes_flag.any():\n",
" print('보행신호시')\n",
" cmatch.loc[pedes_flag, ['inc_edge_id', 'out_edge_id']] = [inc_edge_id, out_edge_id]\n",
" # 좌회전시\n",
" elif right_flag.any():\n",
" print('좌회전시')\n",
" cmatch.loc[right_flag, ['inc_edge_id', 'out_edge_id']] = [inc_edge_id, out_edge_id]\n",
" # 보행신호이동류(17) 발생시\n",
" elif crosswalk_on.any():\n",
" print('17')\n",
" cmatch.loc[crosswalk_on, ['inc_edge_id', 'out_edge_id']] = [inc_edge_id, out_edge_id]\n",
" # 신호없음이동류(18) 발생시\n",
" elif all_redsigns.any():\n",
" print('18')\n",
" cmatch.loc[all_redsigns, ['inc_edge_id', 'out_edge_id']] = [inc_edge_id, out_edge_id]\n",
" # 진출엣지 미포함시\n",
" elif out_true.any():\n",
" print('et cetera')\n",
" cmatch.loc[~ out_true, ['inc_edge_id', 'out_edge_id']] = [inc_edge_id, out_edge_id]\n",
"display(cmatch)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"'''Given `inter_no`, `inc_edge_id` and `out_edge_id`, we have `inc_vec = inter2inc2vec[inter_no][inc_edge_id]` and `out_vec = inter2out2vec[inter_no][out_edge_id]`.\n",
"Rotate `inc_vec` by 90, 180 and 270 degrees clockwise, to define \n",
"`out_vec_left`, `out_vec_straight` and `out_vec_right`.\n",
"Define `out_vecs={'right':out_vec_left, 'straight':out_vec_straight, 'right':out_vec_right}`.\n",
"Select the key that maximize the similarity of the corresponding value of the key and `inc_vec`.'''"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "sts",
"language": "python",
"name": "sts"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.10"
}
},
"nbformat": 4,
"nbformat_minor": 2
}