随着社会的发展,城市中的汽车越来越多。车辆集中存放管理的场所被人类提出车辆进出的秩序、车辆存放的安全性、车辆存放管理的有偿性等要求。停车场系统应用现代机械电子及通讯科学技术,集控制硬件、软件于一体。随着科技的发展,停车场管理系统也日新月异,目前最为专业化的停车场系统为免取卡停车场。下面我们就用ThingJs平台来搭建一个3d可视化的停车场管理系统。
点击查看:DEMO1 DEMO2
效果
停车场总览
车辆信息
车辆行动轨迹监控
车位信息展示
下面我们就用ThingJs平台来搭建一个3d可视化的停车场管理系统。
第一步
使用CampusBuilder来搭建一个模拟停车场。CampusBuider很好用在以往的文章中也多次提及过,丰富的模型库任你选择快速搭建3D场景。
第二步
初始化摄像机的位置并添加鼠标滑过,左键单击,右键单击,左键双击等事件。鼠标滑过,车勾边变红色,车位勾边边蓝色。左键单击,车或车位弹出信息牌。右键单击,关闭当前信息牌,镜头初始化。getCarData() 与 getParkData() 为模拟数据,没有几个售出的车位和车就用了switch。
1 app.on('load', function (evt) { 2 3 //初始化摄像机 4 init_camera(); 5 6 //滑过勾边 7 var campus = evt.campus; 8 var objs = app.query('.Building').add(campus.things); 9 objs.on('mouseon', function (ev) { 10 if (ev.object.name.search("car") == 0) { 11 this.style.outlineColor = '#ff0000'; 12 } 13 if (ev.object.name.search("park") == 0) { 14 this.style.outlineColor = '#0000ff'; 15 } 16 }); 17 objs.on('mouseoff', function () { 18 this.style.outlineColor = null; 19 }); 20 21 //单击事件 22 app.on('click', function (ev) { 23 if (ev.button == 2) { 24 destroy_ui(); 25 init_camera(); 26 } 27 if (ev.object.name.search("car") == 0) { 28 destroy_ui(); 29 getCarData(ev.object); 30 create_ui_car(); 31 } 32 if (ev.object.name.search("park") == 0) { 33 destroy_ui(); 34 getParkData(ev.object); 35 create_ui_park(); 36 } 37 }); 38 39 //双击事件 40 app.on('dblclick', function (ev) { 41 42 if (ev.object.name.search("car") == 0) { 43 app.camera.flyTo({ 44 'time': 1500, 45 'object': ev.object, 46 'position': [0, 0, 0], 47 'complete': function () { 48 } 49 }); 50 } 51 if (ev.object.name.search("park") == 0) { 52 app.camera.flyTo({ 53 'time': 1500, 54 'object': ev.object, 55 'position': [0, 5, 0], 56 'complete': function () { 57 } 58 }); 59 } 60 }); 61 }); 62 63 //初始化摄像机 64 function init_camera() { 65 // 摄像机飞行到某位置 66 app.camera.flyTo({ 67 'position': [-67.95670997548082, 49.69517426520041, -42.88366089402964], 68 'target': [-7.188588318222256, 14.094194791658271, -12.724756207211417], 69 'time': 800, 70 'complete': function () { 71 console.log("Camera ready"); 72 } 73 }); 74 } 75 //创建面板 76 var panel; 77 var dataObj; 78 var carInfo; 79 var parkInfo; 80 81 function create_ui_car() { 82 panel = new THING.widget.Panel({ 83 titleText: "车辆信息", 84 closeIcon: true, // 是否有关闭按钮 85 dragable: true, 86 retractable: true, 87 opacity: 0.9, 88 hasTitle: true, 89 titleImage: 'https://www.thingjs.com/static/images/example/icon.png' 90 }); 91 panel.position = [0, 326]; 92 // 创建任意对象 93 dataObj = { 94 name: carInfo[0], 95 info: carInfo[1], 96 park: carInfo[2], 97 plateNum: carInfo[3], 98 state: carInfo[4], 99 contactNum: carInfo[5] 100 }; 101 // 动态绑定物体 102 var name = panel.addString(dataObj, 'name').caption('车主姓名'); 103 var info = panel.addString(dataObj, 'info').caption('车主信息'); 104 var park = panel.addString(dataObj, 'park').caption('车位编号'); 105 var plateNum = panel.addString(dataObj, 'plateNum').caption('车牌号码'); 106 var contactNum = panel.addString(dataObj, 'contactNum').caption('联系电话'); 107 var state = panel.addString(dataObj, 'state').caption('车位状态'); 108 109 } 110 111 function create_ui_park() { 112 panel = new THING.widget.Panel({ 113 titleText: "车位信息", 114 closeIcon: true, // 是否有关闭按钮 115 dragable: true, 116 retractable: true, 117 opacity: 0.9, 118 hasTitle: true, 119 titleImage: 'https://www.thingjs.com/static/images/example/icon.png' 120 }); 121 panel.position = [0, 326]; 122 dataObj = { 123 park: parkInfo[0], 124 name: parkInfo[1], 125 state: parkInfo[2], 126 date: parkInfo[3] 127 }; 128 var park = panel.addString(dataObj, 'park').caption('车位编号'); 129 var name = panel.addString(dataObj, 'name').caption('车主姓名'); 130 var state = panel.addString(dataObj, 'state').caption('车位状态'); 131 var date = panel.addString(dataObj, 'date').caption('车位期限'); 132 133 } 134 135 function destroy_ui() { 136 if (panel) { 137 panel.destroy(); 138 panel = null; 139 } 140 } 141 142 function getCarData(obj) { 143 switch (obj.name) { 144 case "car_0": 145 carInfo = ['张三', '28#1-302', 'A-06', '吉K49278', '未交费', '13159828222']; 146 break; 147 case "car_1": 148 carInfo = ['李四', '18#2-1202', 'B-04', '吉A46154', '已交费', '13159828222']; 149 break; 150 case "car_2": 151 carInfo = ['王五', '13#2-702', 'B-05', '吉D95868', '已交费', '13159828222']; 152 break; 153 case "car_3": 154 carInfo = ['郭富贵', '3#3-802', 'B-09', '吉B46278', '已交费', '13159828222']; 155 break; 156 case "car_4": 157 carInfo = ['薛展畅', '8#3-1302', 'C-03', '吉A44278', '未交费', '13159828222']; 158 break; 159 case "car_5": 160 carInfo = ['李文忠', '6#2-302', 'C-05', '黑B77865', '已交费', '13159828222']; 161 break; 162 case "car_6": 163 carInfo = ['李洪春', '8#2-402', 'D-08', '吉CJ87821', '未交费', '13159828222']; 164 break; 165 case "car_7": 166 carInfo = ['孟旭浩', '9#2-801', 'D-16', '吉A4U278', '已交费', '13159828222']; 167 break; 168 case "car_8": 169 carInfo = ['刘星辰', '4#2-502', 'D-20', '吉A98378', '已交费', '13159828222']; 170 break; 171 case "car_9": 172 carInfo = ['张星辰', '4#1-302', 'E-04', '吉A98378', '已交费', '13159828222']; 173 break; 174 case "car_10": 175 carInfo = ['张星辰', '8#2-302', 'D-01', '京A44378', '已交费', '13159228222']; 176 break; 177 } 178 } 179 180 function getParkData(obj) { 181 switch (obj.name) { 182 case "park_5": 183 parkInfo = ['A-06', '张三', '已交', '2018.5.10-2020.5.11']; 184 break; 185 case "park_11": 186 parkInfo = ['B-09', '郭富贵', '已交', '2018.5.10-2020.5.11']; 187 break; 188 case "park_16": 189 parkInfo = ['B-05', '王五', '欠费', '2018.5.10-2020.5.11']; 190 break; 191 case "park_17": 192 parkInfo = ['B-04', '李四', '已交', '2018.5.10-2020.5.11']; 193 break; 194 case "park_40": 195 parkInfo = ['C-03', '薛展畅', '已交', '2018.5.10-2020.5.11']; 196 break; 197 case "park_44": 198 parkInfo = ['C-05', '李文忠', '已交', '2018.5.10-2020.5.11']; 199 break; 200 case "park_68": 201 parkInfo = ['D-08', '李洪春', '已交', '2018.5.10-2020.5.11']; 202 break; 203 case "park_78": 204 parkInfo = ['E-04', '张星辰', '已交', '2018.5.10-2020.5.11']; 205 break; 206 case "park_59": 207 parkInfo = ['D-16', '孟旭浩', '已交', '2018.5.10-2020.5.11']; 208 break; 209 case "park_67": 210 parkInfo = ['D-20', '刘星辰', '已交', '2018.5.10-2020.5.11']; 211 break; 212 case "park_3": 213 parkInfo = ['A-04', '刘地辰', '已交', '2018.5.10-2020.5.11']; 214 break; 215 case "park_54": 216 parkInfo = ['D-1', '龙的辰', '未交', '2018.5.10-2020.5.11']; 217 break; 218 default: 219 parkInfo = ['X-xx', 'XXX', '未售出', '2000.1.1-2020.1.1']; 220 221 } 222 }