diff --git a/Analysis/0411_unp-left_p-right-uturn/0415_matching.ipynb b/Analysis/0411_unp-left_p-right-uturn/0415_matching.ipynb index 083bef383..fbb8e15b6 100644 --- a/Analysis/0411_unp-left_p-right-uturn/0415_matching.ipynb +++ b/Analysis/0411_unp-left_p-right-uturn/0415_matching.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -17,7 +17,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -46,7 +46,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -285,7 +285,7 @@ "[108 rows x 12 columns]" ] }, - "execution_count": 3, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -296,14 +296,7 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 22, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -328,1073 +321,289 @@ " \n", " \n", " inter_no\n", - " node_id\n", + " phase_no\n", + " ring_type\n", " move_no\n", - " inc_angle\n", - " out_angle\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", - " i0\n", - " 8\n", - " 179\n", - " 000\n", - " 남\n", - " 북\n", - " -571542797_02\n", - " 571500487_01\n", - " \n", - " \n", - " 1\n", - " 175\n", - " i0\n", - " 4\n", - " 001\n", - " 180\n", - " 북\n", - " 남\n", - " -571500487_01\n", - " 571542797_02\n", - " \n", - " \n", - " 2\n", - " 175\n", - " i0\n", - " 7\n", - " 001\n", - " 090\n", - " 북\n", - " 동\n", - " -571500487_01\n", - " 571545870_01\n", - " \n", - " \n", - " 3\n", - " 175\n", - " i0\n", - " 3\n", - " 179\n", - " 270\n", - " 남\n", - " 서\n", - " -571542797_02\n", - " 571510153_01\n", - " \n", - " \n", - " 4\n", - " 175\n", - " i0\n", + " 80\n", + " 202\n", + " 1\n", + " A\n", " 6\n", - " 090\n", - " 270\n", " 동\n", " 서\n", - " 571545870_02\n", - " 571510153_01\n", - " \n", - " \n", - " 5\n", - " 175\n", - " i0\n", - " 1\n", " 090\n", - " 180\n", - " 동\n", - " 남\n", - " 571545870_02\n", - " 571542797_02\n", - " \n", - " \n", - " 6\n", - " 175\n", - " i0\n", - " 5\n", " 270\n", - " 000\n", - " 서\n", - " 북\n", - " 571510153_02\n", - " 571500487_01\n", + " 571510152_02\n", + " -571510152_01\n", + " i9\n", + " straight\n", " \n", " \n", - " 7\n", - " 175\n", - " i0\n", + " 81\n", + " 202\n", + " 1\n", + " B\n", " 2\n", - " 270\n", - " 090\n", " 서\n", " 동\n", - " 571510153_02\n", - " 571545870_01\n", + " 270\n", + " 090\n", + " 571510152_01\n", + " 571510152_01.65\n", + " i9\n", + " straight\n", " \n", " \n", "\n", "" ], "text/plain": [ - " inter_no node_id move_no inc_angle out_angle inc_dire out_dire \\\n", - "0 175 i0 8 179 000 남 북 \n", - "1 175 i0 4 001 180 북 남 \n", - "2 175 i0 7 001 090 북 동 \n", - "3 175 i0 3 179 270 남 서 \n", - "4 175 i0 6 090 270 동 서 \n", - "5 175 i0 1 090 180 동 남 \n", - "6 175 i0 5 270 000 서 북 \n", - "7 175 i0 2 270 090 서 동 \n", + " inter_no phase_no ring_type move_no inc_dire out_dire inc_angle \\\n", + "80 202 1 A 6 동 서 090 \n", + "81 202 1 B 2 서 동 270 \n", "\n", - " inc_edge_id out_edge_id \n", - "0 -571542797_02 571500487_01 \n", - "1 -571500487_01 571542797_02 \n", - "2 -571500487_01 571545870_01 \n", - "3 -571542797_02 571510153_01 \n", - "4 571545870_02 571510153_01 \n", - "5 571545870_02 571542797_02 \n", - "6 571510153_02 571500487_01 \n", - "7 571510153_02 571545870_01 " + " out_angle inc_edge_id out_edge_id node_id turn_type \n", + "80 270 571510152_02 -571510152_01 i9 straight \n", + "81 090 571510152_01 571510152_01.65 i9 straight " ] }, + "execution_count": 10, "metadata": {}, - "output_type": "display_data" - }, + "output_type": "execute_result" + } + ], + "source": [ + "self.match6[self.match6.node_id==parent_id].dropna(subset=['inc_edge_id', 'out_edge_id'])" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "self.match7 = self.match6.copy()\n", + "self.match7 = self.match7[['inter_no', 'node_id', 'move_no', 'inc_angle', 'out_angle', 'inc_dire', 'out_dire', 'inc_edge_id', 'out_edge_id']]\n", + "# parent_id = self.parent_ids[1]\n", + "\n", + "for parent_id in self.parent_ids:\n", + " m7 = self.match7[self.match7.node_id==parent_id].dropna(subset=['inc_edge_id', 'out_edge_id'])\n", + " m6 = self.match6[self.match6.node_id==parent_id].dropna(subset=['inc_edge_id', 'out_edge_id'])\n", + " inc_angles = [int(angle) for angle in np.unique(m7.inc_angle.values)]\n", + " out_angles = [int(angle) for angle in np.unique(m7.out_angle.values)]\n", + " # print(parent_id)\n", + " # display(m6)\n", + " # display(m7)\n", + " # print(inc_angles)\n", + " # print(out_angles)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "# (1) 가능한 (진입방향, 진출방향) 목록 \n", + "flows = self.nema.dropna().apply(lambda row: (row['inc_dire'], row['out_dire']), axis=1).tolist()\n", + "# (2) 각 교차로별 방향 목록 : pdires (possible directions)\n", + "pdires = {}\n", + "for node_id in self.parent_ids:\n", + " dires = self.match7[self.match7.node_id == node_id][['inc_dire','out_dire']].values.flatten()\n", + " dires = {dire for dire in dires if type(dire)==str}\n", + " pdires[node_id] = dires\n", + "# (3) 각 (교차로, 진입방향) 별 진입id 목록 : inc2id (incoming direction to incoming edge_id)\n", + "inc2id = {}\n", + "for node_id in self.parent_ids:\n", + " for inc_dire in pdires[node_id]:\n", + " df = self.match7[(self.match7.node_id==node_id) & (self.match7.inc_dire==inc_dire)]\n", + " inc2id[(node_id, inc_dire)] = df.inc_edge_id.iloc[0]\n", + "# (4) 각 (교차로, 진출방향) 별 진출id 목록 : out2id (outgoing direction to outgoing edge_id)\n", + "out2id = {}\n", + "for node_id in self.parent_ids:\n", + " for out_dire in pdires[node_id]:\n", + " df = self.match7[(self.match7.node_id==node_id) & (self.match7.out_dire==out_dire)]\n", + " out2id[(node_id, out_dire)] = df.out_edge_id.iloc[0]\n", + "# (5) 각 교차로별 가능한 (진입방향, 진출방향) 목록 : pflow (possible flows)\n", + "pflow = {}\n", + "for node_id in self.parent_ids:\n", + " pflow[node_id] = [flow for flow in flows if set(flow).issubset(pdires[node_id])]" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": {}, + "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "[1, 90, 179, 270]\n", - "[0, 90, 180, 270]\n" + "i0\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", - "
inter_nonode_idmove_noinc_angleout_angleinc_direout_direinc_edge_idout_edge_id
16176i18180356-571542810_01-571542797_02.99
17176i14359180571542797_02.99571542810_01
18176i18180356-571542810_01-571542797_02.99
19176i13180270-571542810_01571543469_01
20176i15270356571543469_02-571542797_02.99
\n", - "
" - ], "text/plain": [ - " inter_no node_id move_no inc_angle out_angle inc_dire out_dire \\\n", - "16 176 i1 8 180 356 남 북 \n", - "17 176 i1 4 359 180 북 남 \n", - "18 176 i1 8 180 356 남 북 \n", - "19 176 i1 3 180 270 남 서 \n", - "20 176 i1 5 270 356 서 북 \n", - "\n", - " inc_edge_id out_edge_id \n", - "16 -571542810_01 -571542797_02.99 \n", - "17 571542797_02.99 571542810_01 \n", - "18 -571542810_01 -571542797_02.99 \n", - "19 -571542810_01 571543469_01 \n", - "20 571543469_02 -571542797_02.99 " + "{1: '571545870_02',\n", + " 2: '571510153_02',\n", + " 3: '-571542797_02',\n", + " 4: '-571500487_01',\n", + " 5: '571510153_02',\n", + " 6: '571545870_02',\n", + " 7: '-571500487_01',\n", + " 8: '-571542797_02',\n", + " 9: '-571500487_01',\n", + " 10: '571510153_02',\n", + " 11: '571545870_02',\n", + " 12: '-571500487_01',\n", + " 13: '571510153_02',\n", + " 14: '-571500487_01',\n", + " 15: '-571500487_01',\n", + " 16: '571545870_02'}" ] }, "metadata": {}, "output_type": "display_data" }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[180, 270, 359]\n", - "[180, 270, 356]\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", - "
inter_nonode_idmove_noinc_angleout_angleinc_direout_direinc_edge_idout_edge_id
22177i28179000-571542809_01571542811_01
23177i24000180571542811_02571542809_01
\n", - "
" - ], - "text/plain": [ - " inter_no node_id move_no inc_angle out_angle inc_dire out_dire \\\n", - "22 177 i2 8 179 000 남 북 \n", - "23 177 i2 4 000 180 북 남 \n", - "\n", - " inc_edge_id out_edge_id \n", - "22 -571542809_01 571542811_01 \n", - "23 571542811_02 571542809_01 " - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[0, 179]\n", - "[0, 180]\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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \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_idmove_noinc_angleout_angleinc_direout_direinc_edge_idout_edge_id
38178i38180000571540304_02571556450_01
39178i34000180571556450_02571540304_01
40178i37000090571556450_02571500475_01
41178i33180270571540304_02571540303_01
42178i35270000571540303_02.21571556450_01
43178i32270090571540303_02.21571500475_01
44178i36090270-571500475_01571540303_01
45178i31090180-571500475_01571540304_01
\n", - "
" - ], - "text/plain": [ - " inter_no node_id move_no inc_angle out_angle inc_dire out_dire \\\n", - "38 178 i3 8 180 000 남 북 \n", - "39 178 i3 4 000 180 북 남 \n", - "40 178 i3 7 000 090 북 동 \n", - "41 178 i3 3 180 270 남 서 \n", - "42 178 i3 5 270 000 서 북 \n", - "43 178 i3 2 270 090 서 동 \n", - "44 178 i3 6 090 270 동 서 \n", - "45 178 i3 1 090 180 동 남 \n", - "\n", - " inc_edge_id out_edge_id \n", - "38 571540304_02 571556450_01 \n", - "39 571556450_02 571540304_01 \n", - "40 571556450_02 571500475_01 \n", - "41 571540304_02 571540303_01 \n", - "42 571540303_02.21 571556450_01 \n", - "43 571540303_02.21 571500475_01 \n", - "44 -571500475_01 571540303_01 \n", - "45 -571500475_01 571540304_01 " - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[0, 90, 180, 270]\n", - "[0, 90, 180, 270]\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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
inter_nonode_idmove_noinc_angleout_angleinc_direout_direinc_edge_idout_edge_id
92210i66090270-571542115_01571500535_01
94210i65270000571500535_02.18571511538_01
95210i62270090571500535_02.18571542115_01
96210i67000090571511538_02.121571542115_01
97210i64000180571511538_02.121571500585_01
98210i68180000571500585_02571511538_01
99210i63180270571500585_02571500535_01
\n", - "
" - ], - "text/plain": [ - " inter_no node_id move_no inc_angle out_angle inc_dire out_dire \\\n", - "92 210 i6 6 090 270 동 서 \n", - "94 210 i6 5 270 000 서 북 \n", - "95 210 i6 2 270 090 서 동 \n", - "96 210 i6 7 000 090 북 동 \n", - "97 210 i6 4 000 180 북 남 \n", - "98 210 i6 8 180 000 남 북 \n", - "99 210 i6 3 180 270 남 서 \n", - "\n", - " inc_edge_id out_edge_id \n", - "92 -571542115_01 571500535_01 \n", - "94 571500535_02.18 571511538_01 \n", - "95 571500535_02.18 571542115_01 \n", - "96 571511538_02.121 571542115_01 \n", - "97 571511538_02.121 571500585_01 \n", - "98 571500585_02 571511538_01 \n", - "99 571500585_02 571500535_01 " - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[0, 90, 180, 270]\n", - "[0, 90, 180, 270]\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", - "
inter_nonode_idmove_noinc_angleout_angleinc_direout_direinc_edge_idout_edge_id
84206i78180000-571511538_02571542073_02
85206i74000180571542073_01571511538_02
88206i78180000-571511538_02571542073_02
89206i74000180571542073_01571511538_02
\n", - "
" - ], - "text/plain": [ - " inter_no node_id move_no inc_angle out_angle inc_dire out_dire \\\n", - "84 206 i7 8 180 000 남 북 \n", - "85 206 i7 4 000 180 북 남 \n", - "88 206 i7 8 180 000 남 북 \n", - "89 206 i7 4 000 180 북 남 \n", - "\n", - " inc_edge_id out_edge_id \n", - "84 -571511538_02 571542073_02 \n", - "85 571542073_01 571511538_02 \n", - "88 -571511538_02 571542073_02 \n", - "89 571542073_01 571511538_02 " - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[0, 180]\n", - "[0, 180]\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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \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_idmove_noinc_angleout_angleinc_direout_direinc_edge_idout_edge_id
70201i88180000-571500569_01571500583_02
71201i83180270-571500569_01571500618_01
72201i85270000571500618_02571500583_02
73201i82270090571500618_02571500617_01
74201i86090270571500617_02571500618_01
75201i82270090571500618_02571500617_01
76201i86090270571500617_02571500618_01
77201i81090180571500617_02571500569_01
78201i87000090571500583_01571500617_01
79201i84000180571500583_01571500569_01
\n", - "
" - ], - "text/plain": [ - " inter_no node_id move_no inc_angle out_angle inc_dire out_dire \\\n", - "70 201 i8 8 180 000 남 북 \n", - "71 201 i8 3 180 270 남 서 \n", - "72 201 i8 5 270 000 서 북 \n", - "73 201 i8 2 270 090 서 동 \n", - "74 201 i8 6 090 270 동 서 \n", - "75 201 i8 2 270 090 서 동 \n", - "76 201 i8 6 090 270 동 서 \n", - "77 201 i8 1 090 180 동 남 \n", - "78 201 i8 7 000 090 북 동 \n", - "79 201 i8 4 000 180 북 남 \n", - "\n", - " inc_edge_id out_edge_id \n", - "70 -571500569_01 571500583_02 \n", - "71 -571500569_01 571500618_01 \n", - "72 571500618_02 571500583_02 \n", - "73 571500618_02 571500617_01 \n", - "74 571500617_02 571500618_01 \n", - "75 571500618_02 571500617_01 \n", - "76 571500617_02 571500618_01 \n", - "77 571500617_02 571500569_01 \n", - "78 571500583_01 571500617_01 \n", - "79 571500583_01 571500569_01 " - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[0, 90, 180, 270]\n", - "[0, 90, 180, 270]\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", - "
inter_nonode_idmove_noinc_angleout_angleinc_direout_direinc_edge_idout_edge_id
80202i96090270571510152_02-571510152_01
81202i92270090571510152_01571510152_01.65
\n", - "
" - ], "text/plain": [ - " inter_no node_id move_no inc_angle out_angle inc_dire out_dire \\\n", - "80 202 i9 6 090 270 동 서 \n", - "81 202 i9 2 270 090 서 동 \n", - "\n", - " inc_edge_id out_edge_id \n", - "80 571510152_02 -571510152_01 \n", - "81 571510152_01 571510152_01.65 " + "{1: '571542797_02',\n", + " 2: '571545870_01',\n", + " 3: '571510153_01',\n", + " 4: '571542797_02',\n", + " 5: '571500487_01',\n", + " 6: '571510153_01',\n", + " 7: '571545870_01',\n", + " 8: '571500487_01',\n", + " 9: '571545870_01',\n", + " 10: '571500487_01',\n", + " 11: '571510153_01',\n", + " 12: '571545870_01',\n", + " 13: '571500487_01',\n", + " 14: '571510153_01',\n", + " 15: '571500487_01',\n", + " 16: '571500487_01'}" ] }, "metadata": {}, "output_type": "display_data" - }, + } + ], + "source": [ + "p2am = dict() # parent id to a list of aligned movement numbers\n", + "for parent_id in self.parent_ids:\n", + " pnema = self.nema[self.nema.inc_dire.isin(pdires[parent_id]) & self.nema.out_dire.isin(pdires[parent_id])]\n", + " p2am[parent_id] = list(pnema.move_no)\n", + "\n", + "dire2vec = dict() # direction to unit vector\n", + "theta = np.pi/2\n", + "for dire in self.dires:\n", + " dire2vec[dire] = np.array([np.cos(theta), np.sin(theta)])\n", + " theta -= np.pi/4\n", + "\n", + "plain_move_nos = list(range(1,17)) # plain movement numbers\n", + "\n", + "p2pm2inc_edge_id = dict() # parent id to pm2inc_edge_id\n", + "p2pm2out_edge_id = dict() # parent id to pm2out_edge_id\n", + "for parent_id in self.parent_ids:\n", + " pm2inc_edge_id = dict() # plain movement to incoming edge id\n", + " pm2out_edge_id = dict() # plain movement to outgoing edge id\n", + " for pm in plain_move_nos:\n", + " row = self.nema[self.nema.move_no==pm].iloc[0]\n", + " inc_dire = row.inc_dire\n", + " out_dire = row.out_dire\n", + " inc_vec_true = dire2vec[inc_dire]\n", + " out_vec_true = dire2vec[out_dire]\n", + "\n", + " node = self.net.getNode(parent_id)\n", + " # 교차로의 모든 (from / to) edges\n", + " inc_edges = [edge for edge in node.getIncoming() if edge.getFunction() == ''] # incoming edges\n", + " out_edges = [edge for edge in node.getOutgoing() if edge.getFunction() == ''] # outgoing edges\n", + " # 교차로의 모든 (from / to) unit vector\n", + " inc_vecs = []\n", + " for inc_edge in inc_edges:\n", + " start = inc_edge.getShape()[-1]\n", + " end = inc_edge.getShape()[-2]\n", + " inc_vec = np.array(end) - np.array(start)\n", + " inc_vec = inc_vec / (inc_vec ** 2).sum() ** 0.5\n", + " inc_vecs.append(inc_vec)\n", + " out_vecs = []\n", + " for out_edge in out_edges:\n", + " start = out_edge.getShape()[0]\n", + " end = out_edge.getShape()[1]\n", + " out_vec = np.array(end) - np.array(start)\n", + " out_vec = out_vec / (out_vec ** 2).sum() ** 0.5\n", + " out_vecs.append(out_vec)\n", + " # 매칭 엣지 반환\n", + " inc_index = np.array([np.dot(inc_vec, inc_vec_true) for inc_vec in inc_vecs]).argmax()\n", + " out_index = np.array([np.dot(out_vec, out_vec_true) for out_vec in out_vecs]).argmax()\n", + " inc_edge_id = inc_edges[inc_index].getID()\n", + " out_edge_id = out_edges[out_index].getID()\n", + " pm2inc_edge_id[pm] = inc_edge_id\n", + " pm2out_edge_id[pm] = out_edge_id\n", + " p2pm2inc_edge_id[parent_id] = pm2inc_edge_id\n", + " p2pm2out_edge_id[parent_id] = pm2out_edge_id\n", + "\n", + "parent_id = self.parent_ids[0]\n", + "print(parent_id)\n", + "display(p2pm2inc_edge_id[parent_id])\n", + "display(p2pm2out_edge_id[parent_id])" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [], + "source": [ + "plain_move_nos = list(range(1,17)) # plain movement numbers\n", + "p2pm2inc_edge_id = dict() # parent id to pm2inc_edge_id\n", + "p2pm2out_edge_id = dict() # parent id to pm2out_edge_id\n", + "for parent_id in self.parent_ids:\n", + " pm2inc_angle = dict()\n", + " for pm in plain_move_nos:\n", + " row = self.nema[self.nema.move_no==pm].iloc[0]\n", + " # inc_dire = row.\n", + "# plain movement number(1-16) to (inc_angle, out_angle)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "[90, 270]\n", - "[90, 270]\n" + "[('동', '남'), ('서', '동'), ('남', '서'), ('북', '남'), ('서', '북'), ('동', '서'), ('북', '동'), ('남', '북'), ('북동', '남동'), ('남서', '북동'), ('남동', '남서'), ('북서', '남동'), ('남서', '북서'), ('북동', '남서'), ('북서', '북동'), ('남동', '북서')]\n", + "{'i0': {'북', '남', '동', '서'}, 'i1': {'북', '남', '서'}, 'i2': {'북', '남'}, 'i3': {'북', '남', '동', '서'}, 'i6': {'북', '남', '동', '서'}, 'i7': {'북', '남'}, 'i8': {'북', '남', '서', '동'}, 'i9': {'동', '서'}}\n", + "{('i0', '북'): '-571500487_01', ('i0', '남'): '-571542797_02', ('i0', '동'): '571545870_02', ('i0', '서'): '571510153_02', ('i1', '북'): '571542797_02.99', ('i1', '남'): '-571542810_01', ('i1', '서'): '571543469_02', ('i2', '북'): '571542811_02', ('i2', '남'): '-571542809_01', ('i3', '북'): '571556450_02', ('i3', '남'): '571540304_02', ('i3', '동'): '-571500475_01', ('i3', '서'): '571540303_02.21', ('i6', '북'): '571511538_02.121', ('i6', '남'): '571500585_02', ('i6', '동'): '-571542115_01', ('i6', '서'): '571500535_02.18', ('i7', '북'): '571542073_01', ('i7', '남'): '-571511538_02', ('i8', '북'): '571500583_01', ('i8', '남'): '-571500569_01', ('i8', '서'): '571500618_02', ('i8', '동'): '571500617_02', ('i9', '동'): '571510152_02', ('i9', '서'): '571510152_01'}\n", + "{('i0', '북'): '571500487_01', ('i0', '남'): '571542797_02', ('i0', '동'): '571545870_01', ('i0', '서'): '571510153_01', ('i1', '북'): '-571542797_02.99', ('i1', '남'): '571542810_01', ('i1', '서'): '571543469_01', ('i2', '북'): '571542811_01', ('i2', '남'): '571542809_01', ('i3', '북'): '571556450_01', ('i3', '남'): '571540304_01', ('i3', '동'): '571500475_01', ('i3', '서'): '571540303_01', ('i6', '북'): '571511538_01', ('i6', '남'): '571500585_01', ('i6', '동'): '571542115_01', ('i6', '서'): '571500535_01', ('i7', '북'): '571542073_02', ('i7', '남'): '571511538_02', ('i8', '북'): '571500583_02', ('i8', '남'): '571500569_01', ('i8', '서'): '571500618_01', ('i8', '동'): '571500617_01', ('i9', '동'): '571510152_01.65', ('i9', '서'): '-571510152_01'}\n", + "{'i0': [('동', '남'), ('서', '동'), ('남', '서'), ('북', '남'), ('서', '북'), ('동', '서'), ('북', '동'), ('남', '북')], 'i1': [('남', '서'), ('북', '남'), ('서', '북'), ('남', '북')], 'i2': [('북', '남'), ('남', '북')], 'i3': [('동', '남'), ('서', '동'), ('남', '서'), ('북', '남'), ('서', '북'), ('동', '서'), ('북', '동'), ('남', '북')], 'i6': [('동', '남'), ('서', '동'), ('남', '서'), ('북', '남'), ('서', '북'), ('동', '서'), ('북', '동'), ('남', '북')], 'i7': [('북', '남'), ('남', '북')], 'i8': [('동', '남'), ('서', '동'), ('남', '서'), ('북', '남'), ('서', '북'), ('동', '서'), ('북', '동'), ('남', '북')], 'i9': [('서', '동'), ('동', '서')]}\n" ] } ], "source": [ - "self.match7 = self.match6.copy()\n", - "self.match7 = self.match7[['inter_no', 'node_id', 'move_no', 'inc_angle', 'out_angle', 'inc_dire', 'out_dire', 'inc_edge_id', 'out_edge_id']]\n", - "# parent_id = self.parent_ids[1]\n", - "\n", - "for parent_id in self.parent_ids:\n", - " m7 = self.match7[self.match7.node_id==parent_id].dropna(subset=['inc_edge_id', 'out_edge_id'])\n", - " display(m7)\n", - " inc_angles = [int(angle) for angle in np.unique(m7.inc_angle.values)]\n", - " out_angles = [int(angle) for angle in np.unique(m7.out_angle.values)]\n", - " print(inc_angles)\n", - " print(out_angles)" + "print(flows)\n", + "print(pdires)\n", + "print(inc2id)\n", + "print(out2id)\n", + "print(pflow)" ] }, { @@ -1404,33 +613,6 @@ "outputs": [], "source": [ "\n", - "# parent_ids = sorted(self.inter_node[self.inter_node.inter_type=='parent'].node_id.unique())\n", - "# child_ids = sorted(self.inter_node[self.inter_node.inter_type=='child'].node_id.unique())\n", - "\n", - "# (1) 가능한 (진입방향, 진출방향) 목록 \n", - "flows = self.nema.dropna().apply(lambda row: (row['inc_dire'], row['out_dire']), axis=1).tolist()\n", - "# (2) 각 교차로별 방향 목록 : pdires (possible directions)\n", - "pdires = {}\n", - "for node_id in self.parent_ids:\n", - " dires = self.match7[self.match7.node_id == node_id][['inc_dire','out_dire']].values.flatten()\n", - " dires = {dire for dire in dires if type(dire)==str}\n", - " pdires[node_id] = dires\n", - "# (3) 각 (교차로, 진입방향) 별 진입id 목록 : inc2id (incoming direction to incoming edge_id)\n", - "inc2id = {}\n", - "for node_id in self.parent_ids:\n", - " for inc_dire in pdires[node_id]:\n", - " df = self.match7[(self.match7.node_id==node_id) & (self.match7.inc_dire==inc_dire)]\n", - " inc2id[(node_id, inc_dire)] = df.inc_edge_id.iloc[0]\n", - "# (4) 각 (교차로, 진출방향) 별 진출id 목록 : out2id (outgoing direction to outgoing edge_id)\n", - "out2id = {}\n", - "for node_id in self.parent_ids:\n", - " for out_dire in pdires[node_id]:\n", - " df = self.match7[(self.match7.node_id==node_id) & (self.match7.out_dire==out_dire)]\n", - " out2id[(node_id, out_dire)] = df.out_edge_id.iloc[0]\n", - "# (5) 각 교차로별 가능한 (진입방향, 진출방향) 목록 : pflow (possible flows)\n", - "pflow = {}\n", - "for node_id in self.parent_ids:\n", - " pflow[node_id] = [flow for flow in flows if set(flow).issubset(pdires[node_id])]\n", "# (6) 가능한 이동류에 대하여 진입id, 진출id 배정 : matching\n", "dires_right = ['북', '북서', '서', '남서', '남', '남동', '동', '북동'] # ex (북, 서), (서, 남) 등은 우회전 flow\n", "self.matching = []\n", diff --git a/Documents/1127_table_definition/table_definition_v0.8.5.xlsx b/Documents/1127_table_definition/table_definition_v0.8.5.xlsx index 1001ed33e..81d07f1a4 100644 Binary files a/Documents/1127_table_definition/table_definition_v0.8.5.xlsx and b/Documents/1127_table_definition/table_definition_v0.8.5.xlsx differ diff --git a/Scripts/__pycache__/preprocess_daily.cpython-38.pyc b/Scripts/__pycache__/preprocess_daily.cpython-38.pyc index 3430d562d..176ac9501 100644 Binary files a/Scripts/__pycache__/preprocess_daily.cpython-38.pyc and b/Scripts/__pycache__/preprocess_daily.cpython-38.pyc differ diff --git a/Scripts/preprocess_daily.py b/Scripts/preprocess_daily.py index bed3e4d29..6b2291dbf 100644 --- a/Scripts/preprocess_daily.py +++ b/Scripts/preprocess_daily.py @@ -366,11 +366,11 @@ class DailyPreprocessor(): # 교차로의 모든 (from / to) edges inc_edges = [edge for edge in node.getIncoming() if edge.getFunction() == ''] # incoming edges out_edges = [edge for edge in node.getOutgoing() if edge.getFunction() == ''] # outgoing edges - # 교차로의 모든 (from / to) directions (unit vector) + # 교차로의 모든 (from / to) unit vector inc_vecs = [] for inc_edge in inc_edges: - start = inc_edge.getShape()[-2] - end = inc_edge.getShape()[-1] + start = inc_edge.getShape()[-1] + end = inc_edge.getShape()[-2] inc_vec = np.array(end) - np.array(start) inc_vec = inc_vec / (inc_vec ** 2).sum() ** 0.5 inc_vecs.append(inc_vec) @@ -386,7 +386,7 @@ class DailyPreprocessor(): inc_angle = int(row.inc_angle) out_angle = int(row.out_angle) # 방위각을 일반각으로 가공, 라디안 변환, 단위벡터로 변환 - inc_angle = (-90 - inc_angle) % 360 + inc_angle = (90 - inc_angle) % 360 inc_angle = inc_angle * np.pi / 180. inc_vec_true = np.array([np.cos(inc_angle), np.sin(inc_angle)]) out_angle = (90 - out_angle) % 360 @@ -564,8 +564,8 @@ class DailyPreprocessor(): # 2-1-7 def make_matching(self): ''' - 각 교차로에 대하여, 가능한 모든 이동류 (1~18, 21)에 대한 진입·진출엣지ID를 지정한 테이블 - * 시차제 + 각 교차로에 대하여, 가능한 모든 이동류 (1~16)에 대한 진입·진출엣지ID를 지정한 테이블 + * 시차제에 대비한 테이블 컬럼명 : inter_no, move_no, inc_dire, out_dire, inc_edge_id, out_edge_id, node_id ''' @@ -573,9 +573,6 @@ class DailyPreprocessor(): self.match7 = self.match6.copy() self.match7 = self.match7[['inter_no', 'move_no', 'inc_dire', 'out_dire', 'inc_edge_id', 'out_edge_id', 'node_id']] - # parent_ids = sorted(self.inter_node[self.inter_node.inter_type=='parent'].node_id.unique()) - # child_ids = sorted(self.inter_node[self.inter_node.inter_type=='child'].node_id.unique()) - # (1) 가능한 (진입방향, 진출방향) 목록 flows = self.nema.dropna().apply(lambda row: (row['inc_dire'], row['out_dire']), axis=1).tolist() # (2) 각 교차로별 방향 목록 : pdires (possible directions)