Changeset 616 in tmcsimulator for trunk/webapps/cptms/CameraDisplay.html
- Timestamp:
- 06/06/2020 12:53:44 PM (6 years ago)
- File:
-
- 1 edited
-
trunk/webapps/cptms/CameraDisplay.html (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/webapps/cptms/CameraDisplay.html
r614 r616 1 1 <html> 2 2 <head> 3 <title>UI Prototype - CPTMS Camera Display Controller</title> 3 <meta charset="UTF-8"> 4 <title>CPTMS Camera Display Controller V1</title> 4 5 <style> 5 6 .toprow { … … 18 19 } 19 20 </style> 21 <script src="../common/js/fileutils.js"></script> 20 22 <script> 23 /* Camera Controller for CPTMS 24 * @author jdalbey Apr 2020 25 */ 26 var kVDSstatusFile = "../dynamicdata/highway_status.json"; // dynamic json data file 27 var kCCTVfile = "data_layers/cctv_locations_D12.gjson"; // CCTV locations 28 var vdsList; 29 var cctvList; 30 var routeCameras = {}; // for each route, a list of cameras on that route 31 var cameraDict = {}; // for each cameraid, the associated nearVDS and locationName properties 32 function init() 33 { 34 loadJSON(kVDSstatusFile, function(response) 35 { 36 // Parse JSON string into list of VDS's 37 vdsList = JSON.parse(response); 38 39 }); 40 loadJSON(kCCTVfile, function(response) 41 { 42 // Parse JSON string into list of cctv's 43 cctvList = JSON.parse(response); 44 cctvList.features.forEach(buildDict); 45 // Build the route dropdowns using routeCameras keys 46 for (var quadrant = 1; quadrant <= 4; quadrant++) 47 { 48 routecombo = document.getElementById("R"+quadrant) 49 removeOptions(routecombo); 50 routecombo.add(document.createElement('option')); // an empty entry 51 // Get all the routes and sort them 52 var routeList = Object.keys(routeCameras); 53 routeList.sort() 54 // Add all the routes to the route dropdown box 55 for (var route of routeList) 56 { 57 opt1 = document.createElement('option') 58 opt1.text = opt1.value = route 59 routecombo.add(opt1); 60 } 61 } 62 }); 63 64 // Start a timer to refresh the traffic colors every 30 seconds 65 var myTimer = setInterval(updateVDSlist, 30000); 66 } 67 68 // Build a lookup dictionary that maps route to camera id's 69 function buildDict(cctvItem) 70 { 71 id = cctvItem.id 72 route = id.substring(3,6); // extract 3 character route number 73 if (route in routeCameras) 74 { 75 routeCameras[route].push(id); // add the camera id to the list for the route 76 } 77 else 78 { 79 routeCameras[route] = [id]; // special case for first occurrence of route 80 } 81 // Add a camera's info to the cameraDict 82 cameraDict[id] = {'nearVDS':cctvItem.properties["nearVDS"], 83 'locationName':cctvItem.properties["locationName"]} 84 } 85 21 86 /* When a route is selected from the combobox, filter the 22 87 list of cameras for just those on that route. */ … … 30 95 fillOptions(currentRoute, cameraselect); 31 96 } 32 // Remove all the options from a combo box 97 98 // Helper: Remove all the options from a combo box 33 99 function removeOptions(selectbox) 34 100 { … … 41 107 42 108 // Fill the selectbox with items from the lookup table that match route 109 // route param may be empty if the first item in the combo box was chosen 43 110 function fillOptions(route,cameraselect) 44 111 { 45 var cameracombo = document.getElementById(cameraselect) 46 items = lookup[route]; // grab cameras from lookup table 47 // Create a new select OPTION for each camera 48 for (idx = 0; idx < items.length; idx++) 112 // IF the route is not empty 113 if (route.length > 0) 49 114 { 50 opt1 = document.createElement('option') 51 opt1.text = opt1.value = items[idx] 52 cameracombo.add(opt1); 53 } 54 } 55 // A dictionary that maps routes to cameras on that route 56 var lookup = { 57 "5":["SB 5 N/O MAGNOLIA AVE (S/O 91)","NB 5 HARBOR BLVD","NB 5 RTE 22","NB 5 GRAND AVE","SB 5 17TH ST (7TH)","NB 5 BAKE PKWY (LAKE FOREST)","SB 5 ENTERPRISE ST /12-405 (235)","NB 5 ORTEGA HWY","NB 5 JUNIPERO SERRA RD ","NB 5 CROWN VALLEY PKWY (MV)","NB 5 N/O LA PAZ RD (S/O ALICIA)","NB 5 OSO PKWY O/C (MV)","NB 5 N/O OSO PKWY","NB 5 LA PAZ RD ( MV)","NB 5 ALICIA PKWY ON ( MV)","NB 5 ALICIA PKWY","NB 5 EL TORO RD","NB 5 NO EL TORO RD (CARLOTA)","NB 5 ALTON PKWY","NB 5 JEFFREY RD","NB 5 YALE AVE","NB 5 CULVER DR","NB 5 JAMBOREE RD","NB 5 TUSTIN RANCH RD","NB 5 S/O NEWPORT AVE","SB 5 22 FWY","NB 5 STATE COLLEGE BLVD","SB 5 ORANGEWOOD AVE","NB 5 KATELLA AVE","NB 5 WEST ST","NB 5 LINCOLN AVE","NB 5 EUCLID AVE","NB 5 BROOKHURST ST","NB 5 GILBERT ST","NB 5 MAGNOLIA AVE","NB 5 N/O ORANGETHORPE BLVD","NB 5 ANAHEIM BL","NB 5 MANCHESTER AVE (S/O STANTON)","WB 91 GILBERT ST","NB 5 N/O BEACH BLVD","NB 5 AVERY PKWY","NB 5 N/O YALE AVE","NB 5 S/O REDHILL AVE","NB 5 S/O ARTESIA BLVD","NB 5 CHRISTIANITOS RD","NB 5 PRESIDIO DR ON","NB 5 AVENIDA PALIZADA ON","NB 5 VIA HERMOSA","NB 5 S/O AVENIDA VAQUERO ON","NB 5 CAMINO DE ESTRELLA ON","NB 5 STONEHILL DR (CAPISTRANO/STONEHILL)","NB 5 AVENIDA AEROPUERTO","NB 5 VALLE RD ON (SAN JUAN CREEK)","NB 5 S/O ORTEGA HWY (SAN JUAN CREEK)","NB 5 73 FWY (NO LOC DESC)"], 58 "22":["EB 22 7TH ST","WB 22 BROOKHURST ST","WB 22 EUCLID ST","WB 22 HARBOR BLVD","WB 22 CITY DRIVE","WB 22 CAMBRIDGE ST","EB 22 GLASSELL ST","WB 22 MAIN ST","EB 22 MAGNOLIA ST","WB 22 MAGNOLIA ST","WB 22 BEACH BLVD","EB 22 KNOTT AVE","WB 22 KNOTT AVE","EB 22 VALLEY VIEW AVE","EB 22 LOS ALISOS ST"], 59 "55":["SB 55 DEL MAR AVE","NB 55 4TH ST","NB 55 MCFADDEN AVE","NB 55 EDINGER AVE","NB 55 WARNER AVE ","SB 55 @RTE405","SB 55 RTE 22 ","NB 55 CHAPMAN AVE ","NB 55 WALNUT ST","NB 55 COLLINS AVE","NB 55 KATELLA AVE","NB 55 S/O MEATS AVE","NB 55 17TH ST","NB 55 WILSON ST","NB 55 DEL MAR AVE EXT","NB 55 RTE 73","NB 55 N/O BAKER ST"], 60 "57":["NB 57 BALL ROAD","NB 57 KATELLA AVE","NB 57 LINCOLN AVE","NB 57 ORANGETHORPE AVE","NB 57 IMPERIAL HWY","NB 57 LAMBERT ST","NB 57 CHAPMAN AVE (ORANGE)","NB 57 ORANGEWOOD AVE ON","NB 57 N/O WAGNER AVE","NB 57 S/O MIRALOMA OC","NB 57 NUTWOOD ST","NB 57 YORBA LINDA BLVD","NB 57 BASTANCHURY RD U/C","NB 57 ROLLING HILLS RD U/C","NB 57 S/O OF TONNER CYN RD","NB 57 N/O OF TONNER CYN RD"], 61 "73":["NB 73 MAINLINE S/O BIRCH ST OC","NB 73 MAINLINE N/O CAMPUS DR OC","NB 73 MAINLINE N/O REDHILL AVE OC","NB 73 MAINLINE N/O PASEO DE COLINAS UC","NB 73 MAINLINE N/O CROWN VALLEY PKWY UC","SB 73 MAINLINE N/O GREENFIELD DR UC","SB 73 MAINLINE S/O MOULTON PKWY UC","SB 73 MAINLINE N/O MOULTON PKWY UC","NB 73 MAINLINE N/O LA PAZ RD UC","SB 73 MAINLINE AT ALICIA PKWY OC", 62 "SB 73 AT ALICIA CREEK RD","SB 73 MAINLINE S/O LAGUNA HILLS DR OC","SB 73 MAINLINE N/O LAGUNA HILLS DR OC","SB 73 MAINLINE AT GLENWOOD DR OC","NB 73 OFF-RAMP EL ORO RD","SB 73 MAINLINE N/O EL TORO RD UC","NB 73 CD N/O LAGUNA CYN RD UC","SB 73 MAINLINE N/O LAGUNA CYN RD UC","SB 73 MAINLINE N/O LAGUNA CYN RD UC","SB 73 MAINLINE S/O MAINLINE TOLL PLAZA","SB 73 MAINLINE MAINLINE TOLL PLAZA","SB 73 MAINLINE N/O MAINLINE TOLL PLAZA","SB 73 MAINLINE N/O MAINLINE TOLL PLAZA","SB 73 MAINLINE N/O NEWPORT COAST DR","SB 73 MAINLINE S/O NEWPORT COAST DR","SB 73 MAINLINE S/O NEWPORT COAST DR","NB 73 MAINLINE S/O BISON AVE OC","SB 73 MAINLINE S/O BISON AVE OC","NB 73 MAINLINE S/O UNIVERSITY DR UC","NB 73 MAINLINE JAMBOREE RD"], 63 "91":["WB 91 BEACH BLVD","WB 91 FROM NB 57 FWY","EB 91 SCALE HOUSE","EB 91 BROOKHURST ST","EB 91 HARBOR BLVD","WB 91 W/O 57 FWY","EB 91 RAYMOND AVE","WB 91 STATE COLLEGE BLVD","WB 91 WEST / KRAEMER BLVD","WB 91 KRAEMER BLVD","EB 91 E/O GLASSELL ST","EB 91 EUCLID AVE","EB 91 LEMON ST","WB 91 MAGNOLIA ST","WB 91 STANTON AVE"], 64 "133":["NB 133 MAINLINE S/O MARINE WAY UC","NB 133 MAINLINE S/O TRABUCO RD OC","NB 133 MAINLINE N/O TRABUCO RD OC","NB 133 MAINLINE N/O IRVINE BLVD OC","NB 133 MAINLINE S/O TOLL PLAZA"], 65 "241":["NB 241 MAINLINE N/O ANTONIO PKWY OC","NB 241 MAINLINE 530M N/O ANTONIO PKWY UC","NB 241 MAINLINE N/O SANTA MARGARITA PKWY UC","NB 241 MAINLINE 30M S/O MELINDA ROAD UC","NB 241 MAINLINE 50M S/O EL TORO ROAD UC","NB 241 MAINLINE 80M S/O PORTOLA PKWY UC","NB 241 MAINLINE 40M S/O LAKE FOREST DRIVE UC","NB 241 MAINLINE 310M N/O BAKE PKWY OC","NB 241 MAINLINE 80M S/O ALTON PKWY OC","NB 241 MAINLINE 780M S/O PORTOLA PKWY OC","NB 241 MAINLINE 750M S/O BEE CANYON ROAD","NB 241 MAINLINE 50M S/O BEE CANYON ROAD","NB 241 MAINLINE 800M S/O HAUL ROAD","NB 241 MAINLINE 180M N/O HAUL ROAD","NB 241 MAINLINE 500M S/O SOUTH CULVER DR","NB 241 MAINLINE 400M N/O SOUTH CULVER DR","NB 241 MAINLINE 600M S/O NORTH CULVER DR","NB 241 MAINLINE 430M N/O NORTH CULVER DR","NB 241 MAINLINE 1400M N/O NORTH CULVER DR","NB 241 MAINLINE 230M S/O SANTIAGO CANYON ROAD OC","NB 241 MAINLINE 900M N/O SANTIAGO CANYON ROAD OC","NB 241 MAINLINE 1700M N/O SANTIAGO CANYON ROAD OC","NB 241 MAINLINE 2600M N/O SANTIAGO CANYON ROAD OC","NB 241 MAINLINE 2000M S/O WINDY RIDGE TOLL PLAZA","NB 241 MAINLINE 920M S/O WINDY RIDGE TOLL PLAZA","NB 241 MAINLINE 600M N/O WINDY RIDGE TOLL PLAZA","NB 241 MAINLINE 1200M N/O WINDY RIDGE TOLL PLAZA","NB 241 MAINLINE 2300M N/O WINDY RIDGE TOLL PLAZA","NB 241 MAINLINE 1100M S/O STATE ROUTE 91","EB 91 TO SB 241 CONNECTOR", 66 "NB 241 TO EB 91 CONNECTOR","NB 241 MAINLINE 40M N/O PORTOLA PKWY"], 67 "261":["SB 261 MAINLINE 200M S/O 5 ","NB 261 MAINLINE 100M S/O BRYAN AVE OC","NB 261 MAINLINE 70M S/O IRVINE BLVD OC","NB 261 MAINLINE 370M N/O IRVINE BLVD NB TOLL PLAZA","NB 261 MAINLINE 80M S/O PORTOLA PKWY (WEST) OC","NB 261 MAINLINE 940M N/O PORTOLA PKWY (WEST) OC","NB 261 MAINLINE 1900M N/O PORTOLA PKWY (WEST) OC","NB 261 MAINLINE 1500M S/O HANDY CREEK RD","NB 261 MAINLINE 290 M N/O HANDY CREEK RD"], 68 "405":["SB 405 N/O BRISTOL ST","NB 405 SEAL BEACH BLVD","NB 405 S/O 605 ","NB 405 S/O EUCLID ST","NB 405 BROOKHURST ST","NB 405 WARNER AVE","NB 405 S/O NEWLAND ST","NB 405 GOLDENWEST AVE"], 69 "605":["NB 605 S/O KATELLA AVE"] 70 }; 115 var cameracombo = document.getElementById(cameraselect) 116 // grab cameras from lookup table 117 cameranames = routeCameras[route]; 118 //console.log(cameranames.length + " cameras for route " + route); 119 // Create a new select OPTION for each camera 120 for (var idx = 0; idx < cameranames.length; idx++) 121 { 122 var opt1 = document.createElement('option') 123 opt1.value = cameranames[idx] 124 opt1.text = cameraDict[cameranames[idx]].locationName 125 cameracombo.add(opt1); 126 } 127 } 128 } 129 130 // Display the image requested from a camera dropdrown box 131 function showView(cameraselect) 132 { 133 var quadrant = cameraselect.charAt(1) // extract numeric part of camera identifier 134 var imgElement = document.getElementById("img"+quadrant) 135 var e = document.getElementById(cameraselect); 136 // if no camera was selected 137 if (e.selectedIndex == -1) 138 { 139 imgElement.src="" // remove the image 140 } 141 else 142 { 143 var chosenCamera = e.options[e.selectedIndex].value; 144 nearvds = cameraDict[chosenCamera].nearVDS 145 // Search for the vds that is nearest 146 var idx = 0; 147 while (idx < vdsList.features.length && vdsList.features[idx].id != nearvds) 148 { 149 idx++; 150 } 151 // If we found the nearVDS 152 if (idx < vdsList.features.length) 153 { 154 // Obtain color and convert to speed 155 var foundVDS = vdsList.features[idx] 156 var color = foundVDS.properties['color'] 157 var speed = "freeflow" 158 if (color == "yellow") 159 { 160 speed = "slow" 161 } 162 if (color == "red") 163 { 164 speed = "stopped" 165 } 166 // construct filename 167 var filename = chosenCamera + "-day-"+speed+".jpg" 168 //console.log("Found " + foundVDS.id + " " + foundVDS.properties['color'] + " " + filename) 169 // Load the desired image 170 var preload = new Image(); 171 preload.onload = function() { 172 if (imgElement) 173 { 174 imgElement.src = preload.src; // image 175 imgElement.title=chosenCamera // tooltip 176 } 177 }; 178 // if couldn't load show as unavailable 179 preload.onerror = function() { 180 if (imgElement) { imgElement.src = "images/CCTV/video_unavailable.jpg" } 181 }; 182 // attempt to load the image 183 preload.src = "images/CCTV/"+filename; 184 //Reference: https://www.daniweb.com/programming/web-development/threads/272293/javascript-test-for-file-existence 185 } 186 } 187 } 188 // Execute periodically to reload the vds list with current data 189 function updateVDSlist() 190 { 191 loadJSON(kVDSstatusFile, function(response) 192 { 193 // Reload the vds list with current data 194 vdsList = JSON.parse(response); 195 // Refresh each camera view 196 var views = document.getElementsByClassName("camcombo"); 197 for (var quadrant of views) 198 { 199 showView(quadrant); 200 } 201 }); 202 203 } 71 204 </script> 72 205 </head> 73 <body >74 <div style="text-align: center ">206 <body onload="init()"> 207 <div style="text-align: center; width:80%"> 75 208 CPTMS Camera Controller 76 209 </div> 77 <table >210 <table width="80%"> 78 211 <tr> 79 <td class="caption"><img src="images/CCTV/12-005-CCTV-0029-day-slow.jpg"/> 80 Choose Route 81 <select id="R1"> 82 <option value="0"></option> 83 <option value="1">1</option> 84 <option value="2" selected>5</option> 85 <option value="3">73</option> 86 <option value="4">405</option> 87 </select> 88 Choose Camera 89 <select id="C1"> 90 <option value="0"></option> 91 <option value="1" selected>SB 17th St</option> 92 <option value="2">NB 5 Ortega Hwy</option> 93 <option value="3">NB 5 Crown Valley Pkwy</option> 94 <option value="4">NB 5 Alicia Pkwy</option> 212 <td class="caption" width="50%"><img id="img1" src=""/><br> 213 Choose Route 214 <select id="R1" onchange='routechanged("R1","C1")'> 215 <option value="0"></option> 216 </select> 217 <br>Choose Camera 218 <select id="C1" class="camcombo" onchange='showView("C1")'> 95 219 </select></td> 96 <td class="caption"><img src="images/CCTV/12-005-CCTV-0084-day-slow.jpg"/> 97 Choose Route 98 <select id="R2"> 99 <option value="0"></option> 100 <option value="1">1</option> 101 <option value="2" selected>5</option> 102 <option value="3">73</option> 103 <option value="4">405</option> 104 </select> 105 Choose Camera 106 <select id="C2"> 107 <option value="0"></option> 108 <option value="1">SB 17th St</option> 109 <option value="2" selected>NB 5 Ortega Hwy</option> 110 <option value="3">NB 5 Crown Valley Pkwy</option> 111 <option value="4">NB 5 Alicia Pkwy</option> 220 <td class="caption"><img id="img2"src=""/><br> 221 Choose Route 222 <select id="R2" onchange='routechanged("R2","C2")'> 223 <option value="0"></option> 224 </select> 225 <br>Choose Camera 226 <select id="C2" class="camcombo" onchange='showView("C2")'> 112 227 </select></td> 113 228 </tr> 114 229 <tr> 115 <td class="caption"><img src="images/CCTV/12-005-CCTV-0088-day-slow.jpg"/> 116 Choose Route 117 <select id="R3"> 118 <option value="0"></option> 119 <option value="1">1</option> 120 <option value="2" selected>5</option> 121 <option value="3">73</option> 122 <option value="4">405</option> 123 </select> 124 Choose Camera 125 <select id="C3"> 126 <option value="0"></option> 127 <option value="1">SB 17th St</option> 128 <option value="2">NB 5 Ortega Hwy</option> 129 <option value="3" selected>NB 5 Crown Valley Pkwy</option> 130 <option value="4">NB 5 Alicia Pkwy</option> 230 <td class="caption"><img id="img3" src=""/><br> 231 Choose Route 232 <select id="R3" onchange='routechanged("R3","C3")'> 233 <option value="0"></option> 234 </select> 235 <br>Choose Camera 236 <select id="C3" class="camcombo" onchange='showView("C3")'> 131 237 </select> 132 238 </td> 133 <td class="caption"> 239 <td class="caption"><img id="img4" src=""/><br> 134 240 Choose Route 135 241 <select id="R4" onchange='routechanged("R4","C4")'> 136 <option value="0" selected></option> 137 <option value="1">5</option> 138 <option value="2">22</option> 139 <option value="3">57</option> 140 <option value="4">73</option> 141 </select> 142 Choose Camera 143 <select id="C4"> 144 <option value="0" selected></option> 242 <option value="0"></option> 243 </select> 244 <br>Choose Camera 245 <select id="C4" class="camcombo" onchange='showView("C4")'> 145 246 </select> 146 247 </td>
Note: See TracChangeset
for help on using the changeset viewer.
