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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
inter_nonode_idinter_type
0175i0parent
1175u00child
2176i1parent
3177i2parent
4177u20child
5178i3parent
6178u30child
7178u31child
8178u32child
9201i8parent
10202i9parent
11206i7parent
12210i6parent
13210u60child
14178c30child
\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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
inter_nophase_noring_typemove_noinc_direout_direinc_angleout_angleinc_edge_idout_edge_idnode_idturn_type
01751A8179000-571542797_02571500487_01i0straight
11751B4001180-571500487_01571542797_02i0straight
21752A7001090-571500487_01571545870_01i0left
31752B3179270-571542797_02571510153_01i0left
41753A6090270571545870_02571510153_01i0straight
51753B1090180571545870_02571542797_02i0left
61754A5270000571510153_02571500487_01i0left
71754B2270090571510153_02571545870_01i0straight
141771A8179000-571542809_01571542811_01i2straight
151771B4000180571542811_02571542809_01i2straight
161772A17NaNNaNNaNNaNNaNNaNi2NaN
171772B18NaNNaNNaNNaNNaNNaNi2NaN
181781A8180000571540304_02571556450_01i3straight
191781B4000180571556450_02571540304_01i3straight
201782A7000090571556450_02571500475_01i3left
211782B3180270571540304_02571540303_01i3left
221783A5270000571540303_02.21571556450_01i3left
231783B2270090571540303_02.21571500475_01i3straight
241784A6090270-571500475_01571540303_01i3straight
251784B1090180-571500475_01571540304_01i3left
482101A6090270-571542115_01571500535_01i6straight
492101B18NaNNaNNaNNaNNaNNaNi6NaN
502102A5270000571500535_02.18571511538_01i6left
512102B2270090571500535_02.18571542115_01i6straight
522103A7000090571511538_02.121571542115_01i6left
532103B4000180571511538_02.121571500585_01i6straight
542104A8180000571500585_02571511538_01i6straight
552104B3180270571500585_02571500535_01i6left
\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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
inter_nophase_noring_typemove_noinc_direout_direinc_angleout_angleinc_edge_idout_edge_idnode_idturn_type
01771A8179000-571542809_01571542811_01u20straight
11771B4000180571542811_02571542809_01u20straight
21772A17NaNNaNNaNNaNNaNNaNu20NaN
31772B18NaNNaNNaNNaNNaNNaNu20NaN
\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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
inter_nophase_noring_typemove_noinc_direout_direinc_angleout_angleinc_edge_idout_edge_idnode_idturn_type
01771A8179000NaNNaNu20straight
11771B4000180NaNNaNu20straight
21772A17NaNNaNNaNNaN571542810_01.51571542810_02u20NaN
31772B18NaNNaNNaNNaNNaNNaNu20NaN
\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) 부여