diff --git a/Analysis/0411_unp-left_p-right-uturn/0411_uturn.ipynb b/Analysis/0411_unp-left_p-right-uturn/0411_uturn.ipynb
index c4cfb768f..9f4bb791d 100644
--- a/Analysis/0411_unp-left_p-right-uturn/0411_uturn.ipynb
+++ b/Analysis/0411_unp-left_p-right-uturn/0411_uturn.ipynb
@@ -359,24 +359,106 @@
},
{
"cell_type": "code",
- "execution_count": 5,
+ "execution_count": 111,
"metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "['i0', 'i1', 'i2', 'i3', 'i6', 'i7', 'i8', 'i9']\n"
- ]
- }
- ],
+ "outputs": [],
"source": [
- "print(self.parent_ids)"
+ "cmatches = []\n",
+ "for row in self.u_turn.itertuples():\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",
+ "\n",
+ " # 진입엣지 각도\n",
+ " inc_angle = p2inc_edge2angle[parent_id][adj_inc_edge_id]\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",
+ "\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",
+ "\n",
+ " # 보행신호시의 진입로 엣지id\n",
+ " inc_angle2edge = p2inc_angle2edge[parent_id]\n",
+ " inc_edge_id_pedes = inc_angle2edge[inc_angle_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",
+ "\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",
+ "\n",
+ " # 보행신호시의 진입로 엣지id\n",
+ " out_angle2edge = p2out_angle2edge[parent_id]\n",
+ " out_edge_id_pedes = out_angle2edge[out_angle_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",
+ "\n",
+ " if uturn_not_assigned:\n",
+ " # 보행신호시\n",
+ " if pedes_flag.any():\n",
+ " cmatch.loc[pedes_flag, ['inc_edge_id', 'out_edge_id']] = [inc_edge_id, out_edge_id]\n",
+ " # 좌회전시\n",
+ " elif right_flag.any():\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",
+ " cmatch.loc[crosswalk_on, ['inc_edge_id', 'out_edge_id']] = [inc_edge_id, out_edge_id]\n",
+ " # 신호없음이동류(18) 발생시\n",
+ " elif all_redsigns.any():\n",
+ " cmatch.loc[all_redsigns, ['inc_edge_id', 'out_edge_id']] = [inc_edge_id, out_edge_id]\n",
+ " # 진출엣지 미포함시\n",
+ " elif out_true.any():\n",
+ " cmatch.loc[~ out_true, ['inc_edge_id', 'out_edge_id']] = [inc_edge_id, out_edge_id]\n",
+ " cmatches.append(cmatch)"
]
},
{
"cell_type": "code",
- "execution_count": 37,
+ "execution_count": 112,
"metadata": {},
"outputs": [
{
@@ -492,7 +574,7 @@
"5 -571500535_02 좌회전시 "
]
},
- "execution_count": 37,
+ "execution_count": 112,
"metadata": {},
"output_type": "execute_result"
}
@@ -501,1084 +583,6 @@
"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,
diff --git a/Scripts/preprocess_daily.py b/Scripts/preprocess_daily.py
index 0b72d6fbe..8c60b3554 100644
--- a/Scripts/preprocess_daily.py
+++ b/Scripts/preprocess_daily.py
@@ -428,60 +428,123 @@ class DailyPreprocessor():
컬럼명 : inter_no, phase_no, ring_type, move_no, inc_dire, out_dire, inc_angle, out_angle, inc_edge_id, out_edge_id, node_id
'''
+ self.u_turn = pd.merge(self.u_turn, self.u_condition, on='child_id')
+
+ # p2inc_edge2angle : node_id to inc_edge2angle
+ p2inc_edge2angle = dict()
+ # p2out_edge2angle : node_id to out_edge2angle
+ p2out_edge2angle = dict()
+ # p2inc_angle2edge : node_id to inc_angle2edge
+ p2inc_angle2edge = dict()
+ # p2out_angle2edge : node_id to out_angle2edge
+ p2out_angle2edge = dict()
+ for node_id in self.parent_ids:
+ m5 = self.match5[self.match5.node_id==node_id]
+ m5 = m5.dropna(subset=['inc_edge_id', 'out_edge_id'])
+ # inc_edge2angle : inc_edge_id to inc_angle
+ inc_edge2angle = dict(zip(m5.inc_edge_id, m5.inc_angle.astype(int)))
+ p2inc_edge2angle[node_id] = inc_edge2angle
+ # out_edge2angle : out_edge_id to out_angle
+ out_edge2angle = dict(zip(m5.out_edge_id, m5.out_angle.astype(int)))
+ p2out_edge2angle[node_id] = out_edge2angle
+ # inc_angle2edge : inc_angle to inc_edge_id
+ inc_angle2edge = dict(zip(m5.inc_angle.astype(int), m5.inc_edge_id))
+ p2inc_angle2edge[node_id] = inc_angle2edge
+ # out_angle2edge : out_angle to out_edge_id
+ out_angle2edge = dict(zip(m5.out_angle.astype(int), m5.out_edge_id))
+ p2out_angle2edge[node_id] = out_angle2edge
+
# 각 uturn node에 대하여 (inc_edge_id, out_edge_id) 부여
cmatches = []
- for _, row in self.uturn.iterrows():
- child_id = row.child_id
+ for row in self.u_turn.itertuples():
parent_id = row.parent_id
- dire = row.direction
+ child_id = row.child_id
condition = row.condition
- inc_edge_id = row.inc_edge_id
- out_edge_id = row.out_edge_id
+ inc_edge_id = row.from_edge_id
+ out_edge_id = row.to_edge_id
+ adj_inc_edge_id = row.adj_from_edge_id
+ adj_out_edge_id = row.adj_to_edge_id
# match5에서 부모노드id에 해당하는 행들을 가져옴 (cmatch)
cmatch = self.match5.copy()[self.match5.node_id==parent_id] # match dataframe for a child node
cmatch = cmatch.sort_values(by=['phase_no', 'ring_type']).reset_index(drop=True)
cmatch['node_id'] = child_id
- cmatch[['inc_edge_id', 'out_edge_id']] = np.nan
- # 보행신호시/좌회전시 진입/진출방향
- ind = self.dires.index(dire)
- inc_dire_pedes = self.dires[(ind + 2) % len(self.dires)]
- out_dire_pedes = self.dires[(ind - 2) % len(self.dires)]
- inc_dire_right = dire
- out_dire_right = self.dires[(ind + 2) % len(self.dires)]
+ # 진입엣지 각도
+ inc_angle = p2inc_edge2angle[parent_id][adj_inc_edge_id]
+
+ # 이격각도
+ self.angle_separation = 10
+
+ # 진입로 각도 목록
+ inc_angles = cmatch.dropna(subset=['inc_angle', 'out_angle']).inc_angle.astype(int).unique()
+ inc_angles = np.sort(inc_angles)
+ inc_angles = list(inc_angles - 360) + list(inc_angles) + list(inc_angles + 360)
+ inc_angles = np.array(inc_angles)
+
+ # 보행신호시의 진입로 각도
+ inc_angles_left = inc_angles[inc_angles >= inc_angle + self.angle_separation]
+ inc_angle_pedes = np.sort(inc_angles_left)[0] % 360
+
+ # 보행신호시의 진입로 엣지id
+ inc_angle2edge = p2inc_angle2edge[parent_id]
+ inc_edge_id_pedes = inc_angle2edge[inc_angle_pedes]
- # 보행신호시/좌회전시 조건
- pedes_exists = (cmatch.inc_dire==inc_dire_pedes) & (cmatch.out_dire==out_dire_pedes)
- right_exists = (cmatch.inc_dire==inc_dire_right) & (cmatch.out_dire==out_dire_right)
+ # 진출로 각도 목록
+ out_angles = cmatch.dropna(subset=['inc_angle', 'out_angle']).out_angle.astype(int).unique()
+ out_angles = np.sort(out_angles)
+ out_angles = list(out_angles - 360) + list(out_angles) + list(out_angles + 360)
+ out_angles = np.array(out_angles)
+
+ # 보행신호시의 진입로 각도
+ out_angles_right = out_angles[out_angles <= inc_angle - self.angle_separation]
+ out_angle_pedes = np.sort(out_angles_right)[-1] % 360
+
+ # 보행신호시의 진입로 엣지id
+ out_angle2edge = p2out_angle2edge[parent_id]
+ out_edge_id_pedes = out_angle2edge[out_angle_pedes]
+
+ # 진입엣지/진출엣지 포함 조건
+ inc_true = (cmatch.inc_edge_id==adj_inc_edge_id)
+ out_true = (cmatch.out_edge_id==adj_out_edge_id)
+
+ # 보행신호시 조건
+ pedes_flag = (cmatch.inc_edge_id==inc_edge_id_pedes) & (cmatch.out_edge_id==out_edge_id_pedes)
+
+ # 좌회전시 조건
+ right_flag = inc_true & (cmatch.turn_type=='left')
+
+ # 보행신호이동류(17) 조건
+ crosswalk_on = (cmatch.move_no==17) & ~ out_true
+
+ # 신호없음이동류(18) 조건
+ all_redsigns = (cmatch.move_no==18) & ~ out_true
# 보행신호시/좌회전시 진입/진출 엣지id 배정
- ind = self.dires.index(dire)
+ cmatch[['inc_edge_id', 'out_edge_id']] = np.nan
if condition == "보행신호시":
- cmatch.loc[pedes_exists, ['inc_edge_id', 'out_edge_id']] = [inc_edge_id, out_edge_id]
+ cmatch.loc[pedes_flag, ['inc_edge_id', 'out_edge_id']] = [inc_edge_id, out_edge_id]
elif condition == "좌회전시":
- cmatch.loc[right_exists, ['inc_edge_id', 'out_edge_id']] = [inc_edge_id, out_edge_id]
-
- # 신호없음이동류발생시/보행신호이동류발생시 조건
- all_redsigns = cmatch.move_no == 18
- crosswalk_on = cmatch.move_no == 17
+ cmatch.loc[right_flag, ['inc_edge_id', 'out_edge_id']] = [inc_edge_id, out_edge_id]
- # 만약 어떤 유턴신호도 배정되지 않았다면
- # 좌회전시 → 보행신호시 → 보행신호이동류발생시 → 신호없음이동류발생시 순으로 진입/진출 엣지id 배정
uturn_not_assigned = cmatch[['inc_edge_id','out_edge_id']].isna().any(axis=1).all()
+
if uturn_not_assigned:
- # 좌회전시
- if right_exists.any():
- cmatch.loc[right_exists, ['inc_edge_id', 'out_edge_id']] = [inc_edge_id, out_edge_id]
# 보행신호시
- elif pedes_exists.any():
- cmatch.loc[pedes_exists, ['inc_edge_id', 'out_edge_id']] = [inc_edge_id, out_edge_id]
+ if pedes_flag.any():
+ cmatch.loc[pedes_flag, ['inc_edge_id', 'out_edge_id']] = [inc_edge_id, out_edge_id]
+ # 좌회전시
+ elif right_flag.any():
+ cmatch.loc[right_flag, ['inc_edge_id', 'out_edge_id']] = [inc_edge_id, out_edge_id]
# 보행신호이동류(17) 발생시
elif crosswalk_on.any():
- cmatch.loc[crosswalk_on & (cmatch.out_dire!=dire), ['inc_edge_id', 'out_edge_id']] = [inc_edge_id, out_edge_id]
+ cmatch.loc[crosswalk_on, ['inc_edge_id', 'out_edge_id']] = [inc_edge_id, out_edge_id]
# 신호없음이동류(18) 발생시
elif all_redsigns.any():
- cmatch.loc[all_redsigns & (cmatch.out_dire!=dire), ['inc_edge_id', 'out_edge_id']] = [inc_edge_id, out_edge_id]
+ cmatch.loc[all_redsigns, ['inc_edge_id', 'out_edge_id']] = [inc_edge_id, out_edge_id]
+ # 진출엣지 미포함시
+ elif out_true.any():
+ cmatch.loc[~ out_true, ['inc_edge_id', 'out_edge_id']] = [inc_edge_id, out_edge_id]
cmatches.append(cmatch)
# 각 연등교차로(coordination node)에 대하여 (inc_edge_id, out_edge_id) 부여