Эх сурвалжийг харах

dev update traffic calculate algorithm

shjung 1 жил өмнө
parent
commit
8c33694622

BIN
app-install/agip-comm-server.exe.old


+ 0 - 2
app-install/agip-comm-server.txt.jsmooth

@@ -6,7 +6,6 @@
 <JVMSearchPath>registry</JVMSearchPath>
 <JVMSearchPath>exepath</JVMSearchPath>
 <JVMSearchPath>jview</JVMSearchPath>
-<arguments></arguments>
 <currentDirectory>${EXECUTABLEPATH}</currentDirectory>
 <embeddedJar>true</embeddedJar>
 <executableName>agip-comm-server.exe</executableName>
@@ -24,7 +23,6 @@
 </skeletonProperties>
 <skeletonProperties>
 <key>URL</key>
-<value></value>
 </skeletonProperties>
 <skeletonProperties>
 <key>SingleProcess</key>

+ 2 - 2
app-install/conf/application.yml

@@ -1,8 +1,8 @@
 application:
-  name: 안동시 VMS 통신 서버
+  name: 안동시 BIS 통신 서버
 
 server:
-  port: 8904
+  port: 7904
   history-min: 30
   min-speed: 3
   max-speed: 140

+ 4 - 2
app-install/conf/debug.properties

@@ -1,3 +1,5 @@
 #system debug setting configuration...
-#Tue Nov 07 17:54:17 KST 2023
-system-debug=false
+#Fri Dec 15 12:42:42 KST 2023
+packet-info=x
+packet-dump=x
+system-debug=true

+ 0 - 31
src/main/java/com/its/bis/dto/BisObe.java

@@ -29,35 +29,4 @@ public class BisObe  implements Serializable {
     private NodeRunDto runNode;
     private LinkRunDto runLink;
 
-//    private Long stNodeId = 0L;
-//    private Long edNodeId = 0L;
-//    private int  trvlHh = 0;    // stNodeId ~ edNodeId travel time(seconds)
-//
-//    private long stNodeTm;
-//    private long edNodeTm;
-//
-//    private Long runNodeId = 0L;    // 운행중 노드
-//    private long runNodeTm = 0L;    // 운행중 노드 진입시각
-//    private int runNodeWaitTm = 0;  // 운행중 노드 대기시각(진출시각 - 진입시각)
-
-    public void initRunNodeInfo() {
-//        this.runNodeId = 0L;
-//        this.runNodeTm = 0L;
-    }
-
-    public int calTravelTime() {
-        if (this.stNode.isValid() && this.edNode.isValid()) {
-            return 1;
-        }
-        else return 0;
-    }
-
-    public int calNodeWaitTm() {
-        return 0;
-//        if (this.runNodeId != 0L && this.runNodeTm != 0L) {
-//            this.runNodeWaitTm = (int) ((System.currentTimeMillis() - this.runNodeTm) / 1000);
-//        }
-//        return this.runNodeWaitTm;
-    }
-
 }

+ 3 - 0
src/main/java/com/its/bis/dto/NodeRunDto.java

@@ -40,6 +40,9 @@ public class NodeRunDto implements Serializable {
     public void calWaitTm() {
         if (this.nodeId != 0L && this.inTime != 0L && this.outTime != 0L) {
             this.waitTm = (int) ((this.outTime - this.inTime) / 1000);
+            if (this.waitTm <= 0) {
+                this.waitTm = 1;
+            }
         }
         else {
             this.waitTm = 0;

+ 1 - 1
src/main/java/com/its/bis/scheduler/SchedulerTask.java

@@ -45,7 +45,7 @@ public class SchedulerTask {
         log.info("scheduleUnitSystStts: ..end. {} ms. {}", elapsed.milliSeconds(), Thread.currentThread().getName());
     }
 
-    @Scheduled(cron = "45 4,9,14,19,24,29,34,39,44,49,54,59 * * * *")  // 5분주기 작업 실행(BIS 구간 소통정보 생성)
+    @Scheduled(cron = "55 4,9,14,19,24,29,34,39,44,49,54,59 * * * *")  // 5분주기 작업 실행(BIS 구간 소통정보 생성)
     public void scheduleMakeBisLinkTraf() {
         if (!this.config.isStartSchedule()) {
             return;

+ 95 - 113
src/main/java/com/its/bis/service/worker/BisAgipWorker.java

@@ -6,6 +6,7 @@ import com.its.app.utils.TimeUtils;
 import com.its.bis.api.dto.AgipObeLoc;
 import com.its.bis.config.ServerConfig;
 import com.its.bis.dto.*;
+import com.its.bis.entity.TbBisLinkTrafClct;
 import com.its.bis.entity.TbBisVehLoc;
 import com.its.bis.process.DbmsData;
 import com.its.bis.process.DbmsDataProcess;
@@ -121,154 +122,89 @@ public class BisAgipWorker implements Runnable {
         NearNodeDto passNode = getNearNode(currLocation);
         Long stNodeId = bisObe.getStNode().getNodeId();
         Long edNodeId = bisObe.getEdNode().getNodeId();
+        Long runNodeId = bisObe.getRunNode().getNodeId();
         Long passNodeId = passNode.getNodeId();
+        log.info("R1.DEVICE ID: {}, 시작노드: {}, 종료노드: {}, 현재노드: {}", bisObe.getDeviceId(), stNodeId, edNodeId, passNodeId);
         if (passNodeId != 0L) {
-            log.info("DEVICE ID: {}, 노드운행: {}", bisObe.getDeviceId(), passNodeId);
-            if (bisObe.getRunNode().getNodeId() == 0L) {
-                // 운행중 노드정보 설정
+            // 노드 진입/운행
+            if (runNodeId == 0L) {
+                // 운행노드 정보가 없는 경우
                 bisObe.getRunNode().setNodeId(passNodeId);
                 bisObe.getRunNode().setInTime(currSysTime);
-                bisObe.getRunNode().setOutTime(currSysTime);
-            } else {
-                // 운행중 노드의 진출시각을 업데이트
-                bisObe.getRunNode().setOutTime(currSysTime);
+                log.info("R2.DEVICE ID: {}, 운행노드 도착: {}", bisObe.getDeviceId(), passNodeId);
             }
+            bisObe.getRunNode().setOutTime(currSysTime);
 
             if (stNodeId == 0L) {
-                // 시작노드가 없으면 시작노드 설정
+                // 운행중인 시작노드가 없는 경우 - 진입 노드정보 설정
                 bisObe.getStNode().setNodeId(passNodeId);
                 bisObe.getStNode().setInTime(currSysTime);
                 bisObe.getStNode().setOutTime(currSysTime);
-                log.info("DEVICE ID: {}, 시작노드 도착: {}", bisObe.getDeviceId(), passNodeId);
-            } else {
+                log.info("S1.DEVICE ID: {}, 시작노드 도착: {}", bisObe.getDeviceId(), passNodeId);
+            }
+            else {
+                // 운행중인 노선의 시작노드가 존해하는 경우
                 if (stNodeId.equals(passNodeId)) {
-                    // 시작노드와 동일한 노드를 운행중
-                    log.info("DEVICE ID: {}, 시작노드 운행중: {}", bisObe.getDeviceId(), passNodeId);
+                    // 시작노드와 현재노드가 같은경우 - 운행중 노드의 진출시각을 업데이트
                     bisObe.getStNode().setOutTime(currSysTime);
+                    log.info("S2.DEVICE ID: {}, 시작노드 운행중: {}", bisObe.getDeviceId(), passNodeId);
+                } else {
+                    if (edNodeId == 0L) {
+                        // 운행중인 종료노드가 없는 경우 - 진입 노드정보 설정
+                        bisObe.getEdNode().setNodeId(passNodeId);
+                        bisObe.getEdNode().setInTime(currSysTime);
+                        bisObe.getEdNode().setOutTime(currSysTime);
+                        log.info("E1.DEVICE ID: {}, 종료노드 도착: {}", bisObe.getDeviceId(), passNodeId);
+                        // 시작노드 진출시각과 종료노드 도착시각을 이용하여 구간운행정보를 생성
+                        calcLinkTraffic(bisObe);
+                    } else {
+                        if (edNodeId.equals(passNodeId)) {
+                            // 시작노드와 동일한 노드를 운행중
+                            bisObe.getEdNode().setOutTime(currSysTime);
+                            log.info("E2.DEVICE ID: {}, 종료노드 운행중: {}", bisObe.getDeviceId(), passNodeId);
+                        } else {
+                            log.info("X1.DEVICE ID: {}, 시작노드: {}, 종료노드: {}, 현재노드: {}, 구간노드정보 불일치.....", bisObe.getDeviceId(), stNodeId, edNodeId, passNodeId);
+                        }
+                    }
                 }
             }
         }
         else {
-            // 근접한 노드를 찾을 수 없을 때...
-            if (bisObe.getRunNode().getNodeId() != 0L) {
-                // 노드운행을 종료(진출)
+            // 근접한 노드를 찾을 수 없을 때...즉 구간을 운행중일때
+            if (runNodeId != 0L) {
+                // 운행노드 정보가 존해하면 노드운행을 종료(진출)
                 bisObe.getRunNode().setOutTime(currSysTime);
                 bisObe.getRunNode().calWaitTm();    // 노드 대기시간 계산
-                log.info("DEVICE ID: {}, 노드진출: {}, 대기시간: {} sec.", bisObe.getDeviceId(), bisObe.getRunNode().getNodeId(), bisObe.getRunNode().getWaitTm());
+                log.info("R3.DEVICE ID: {}, 운행노드 진출: {}, 대기시간: {} sec.", bisObe.getDeviceId(), runNodeId, bisObe.getRunNode().getWaitTm());
 
-                if (bisObe.getStNode().getNodeId().equals(bisObe.getRunNode().getNodeId())) {
+                bisObe.getRunNode().init(); // 운행중 노드 초기화
+
+                if (stNodeId.equals(runNodeId)) {
                     bisObe.getStNode().setOutTime(currSysTime);
                     bisObe.getStNode().calWaitTm();    // 노드 대기시간 계산
-                    log.info("DEVICE ID: {}, 시작노드진출: {}, 대기시간: {} sec.", bisObe.getDeviceId(), bisObe.getStNode().getNodeId(), bisObe.getStNode().getWaitTm());
+                    log.info("S3.DEVICE ID: {}, 시작노드 진출: {}, 대기시간: {} sec.", bisObe.getDeviceId(), stNodeId, bisObe.getStNode().getWaitTm());
                 }
-                if (bisObe.getEdNode().getNodeId().equals(bisObe.getRunNode().getNodeId())) {
+                else if (edNodeId.equals(runNodeId)) {
                     bisObe.getEdNode().setOutTime(currSysTime);
                     bisObe.getEdNode().calWaitTm();    // 노드 대기시간 계산
-                    log.info("DEVICE ID: {}, 종료노드진출: {}, 대기시간: {} sec.", bisObe.getDeviceId(), bisObe.getEdNode().getNodeId(), bisObe.getStNode().getWaitTm());
+                    log.info("E3.DEVICE ID: {}, 종료노드 진출: {}, 대기시간: {} sec.", bisObe.getDeviceId(), edNodeId, bisObe.getEdNode().getWaitTm());
 
+                    // 종료노드를 빠져 나왔기 때문에 종료노드를 시작노드로 변경
                     bisObe.getStNode().copy(bisObe.getEdNode());
                     bisObe.getEdNode().init();
                 }
-
-                bisObe.getRunNode().init(); // 운행중 노드 초기화
-            }
-            else {
-                log.info("DEVICE ID: {}, 노선운행 중: {}", bisObe.getDeviceId(), passNodeId);
-            }
-        }
-
-/**
-
-
-            if (bisObe != null) {
-            }
                 else {
-                    if (!stNodeId.equals(passNodeId) && !edNodeId.equals(passNodeId)) {
-                        // 시작노드 값이 존재하면서 통과노드가 시작노드 및 종료노드와 같지 않으면 종료노드로 설정
-                        log.info("DEVICE ID: {}, 종료노드 통과: {}", bisObe.getDeviceId(), passNodeId);
-                        // 종료노드와 같지 않은 경우 종료노드에 도착한 것이므로 구간 소통정보를 생성하자....
-                        bisObe.setEdNodeId(passNodeId);
-                        bisObe.setEdNodeTm(currSysTime);
-                        int travelSec = (int) ((bisObe.getEdNodeTm() - bisObe.getStNodeTm()) / 1000);
-                        if (travelSec > (this.config.getMaxTrvlMin() * 60)) {
-                            // 구간 통과 시간이 설정한 값보다 크기 때문에 통행시간을 계산하지 않는다.
-                            // 현재 통과 노드를 시작노드로 설정한다.
-                            log.warn("DEVICE ID: {}, 시작노드: {}, 종료노드: {}, 여행시간 오류: {} sec.", bisObe.getDeviceId(), bisObe.getStNodeId(), bisObe.getEdNodeId(), travelSec);
-                            bisObe.setStNodeId(bisObe.getEdNodeId());
-                            bisObe.setStNodeTm(bisObe.getEdNodeTm());
-                            bisObe.setEdNodeId(0L);
-                            bisObe.setEdNodeTm(0);
-                        }
-                        else {
-                            TbLinkDto link = this.repoService.getSectMap(bisObe.getStNodeId(), bisObe.getEdNodeId());
-                            if (link == null) {
-                                // 구간을 찾지 못하였음... 종료노드를 시작노드로 설정
-                                log.warn("DEVICE ID: {}, 시작노드: {}, 종료노드: {}, 구간 맷칭 오류...", bisObe.getDeviceId(), bisObe.getStNodeId(), bisObe.getEdNodeId());
-                                bisObe.setStNodeId(bisObe.getEdNodeId());
-                                bisObe.setStNodeTm(bisObe.getEdNodeTm());
-                                bisObe.setEdNodeId(0L);
-                                bisObe.setEdNodeTm(0);
-                            }
-                            else {
-                                // 구간을 통과하였으므로 구간교통정보를 생성한다.
-                                int speed = calcSpeed(link.getLinkLeng(), travelSec);
-                                log.warn("DEVICE ID: {}, 시작노드: {}, 종료노드: {}, 구간통과: {}, {} m, {} km/h, {} seconds.",
-                                        bisObe.getDeviceId(), bisObe.getStNodeId(), bisObe.getEdNodeId(), link.getLinkId(), link.getLinkLeng(), speed, travelSec);
-                                TbBisLinkTrafClct bisLinkTrafClct = TbBisLinkTrafClct.builder()
-                                        .CLCT_DT(SysUtils.getSysTime())
-                                        .LINK_ID(link.getLinkId())
-                                        .DEVICE_ID(bisObe.getDeviceId())
-                                        .SPED(speed)
-                                        .TRVL_HH(travelSec)
-                                        .ST_NODE_ARR_DT(TimeUtils.millisToString(bisObe.getStNodeTm()))
-                                        .ED_NODE_ARR_DT(TimeUtils.millisToString(bisObe.getEdNodeTm()))
-                                        .build();
-
-                                this.dbmsDataProcess.add(new DbmsData(DbmsDataType.DBMS_DATA_CRT_BIS_LINK_TRAF_CLCT, false, bisLinkTrafClct));
-
-                                bisObe.setStNodeId(bisObe.getEdNodeId());
-                                bisObe.setStNodeTm(bisObe.getEdNodeTm());
-                                bisObe.setEdNodeId(0L);
-                                bisObe.setEdNodeTm(0);
-                            }
-                        }
-                    }
-                    else {
-                        log.info("DEVICE ID: {}, 시작노드: {}, 종료노드: {}, 통과노드: {}", bisObe.getDeviceId(), stNodeId, edNodeId, passNodeId);
-                    }
+                    // 시작노드 종료노드
+                    log.info("X2.DEVICE ID: {}, 시작노드: {}, 종료노드: {}, 노선운행 노드: {}, 시작/종료/운행 노드 불일치.", bisObe.getDeviceId(), stNodeId, edNodeId, runNodeId);
                 }
             }
-        }
-        else {
-        log.info("DEVICE ID: {}, 노선운행: {}", bisObe.getDeviceId(), passNodeId);
-            if (bisObe.getRunNodeId() != 0L) {
-                int nodeWaitTm = bisObe.calNodeWaitTm();
-                log.info("DEVICE ID: {}, 운행노드: {}, 대기시간: {} sec, 통과....", bisObe.getDeviceId(), bisObe.getRunNodeId(), nodeWaitTm);
-                bisObe.initRunNodeInfo();   // 운행중 노드 정보를 초기화 한다.
-            }
-
-            if (stNodeId != 0 && edNodeId != 0) {
-                // 시작노드와 종료노드가 설정된 상태에서 이번에 아무런 노드정보가 없으므로 노드를 빠져 나온것이므로
-                // 종료노드를 시작노드로 설정하고 종료노드는 0으로 설정한다.
-                // 노드 통과 후 구간 정보를 생성하기 위해서는 여기서 처리
-                log.info("DEVICE ID: {}, 시작노드: {}, 종료노드: {}, 통과노드: {}", bisObe.getDeviceId(), stNodeId, edNodeId, passNodeId);
-                bisObe.setStNodeId(edNodeId);
-                bisObe.setStNodeTm(currSysTime);
-                // 종료노드 초기화
-                bisObe.setEdNodeId(0L);
-                bisObe.setEdNodeTm(0);
-            }
             else {
-                log.info("DEVICE ID: {}, 시작노드: {}, 종료노드: {}, 통과노드: {}, 구간 운행 중...", bisObe.getDeviceId(), stNodeId, edNodeId, passNodeId);
+                log.info("R3.DEVICE ID: {}, 시작노드: {}, 종료노드: {}, 노선운행 중.", bisObe.getDeviceId(), stNodeId, edNodeId);
             }
         }
-**/
         MDC.remove(bisObe.getDeviceId());
         MDC.clear();
 
-        /**
-         * 버스 현재위치 정보를 업데이트 한다.
-         */
         TbBisVehLoc bisVehLoc = TbBisVehLoc.builder()
                 .DEVICE_ID(bisObe.getDeviceId())
                 .CLCT_DT(SysUtils.getSysTime())
@@ -280,9 +216,53 @@ public class BisAgipWorker implements Runnable {
                 .LAT(obeLoc.getGnssInfo().getLatitude())
                 .PASS_NODE_ID(passNodeId)
                 .build();
+
+        // 버스 현재위치 정보를 업데이트 한다.
         this.dbmsDataProcess.add(new DbmsData(DbmsDataType.DBMS_DATA_UPD_BIS_VEH_LOC, false, bisVehLoc));
     }
 
+    private void calcLinkTraffic(BisObe bisObe) {
+        // 시작노드 진출시각과 종료노드 진입시각을 이용하여 구간 소통정보를 생성
+        Long stNodeId = bisObe.getStNode().getNodeId();
+        Long edNodeId = bisObe.getEdNode().getNodeId();
+        long stTime = bisObe.getStNode().getOutTime();  // 시작노드 진출시각
+        long edTime = bisObe.getEdNode().getInTime();   // 종료노드 도착시각
+
+        int travelSec = (int) ((edTime - stTime) / 1000);   // 여행시간(초)
+        if (travelSec > (this.config.getMaxTrvlMin() * 60)) {
+            // 구간 통과 시간이 설정한 값보다 크기 때문에 통행시간을 계산하지 않는다. 지연 또는 정류장대기 등의 이유일것....
+            // 현재 통과 노드를 시작노드로 설정한다.
+            log.warn("T3.DEVICE ID: {}, 시작노드: {}, 종료노드: {}, 여행시간 오류: {} sec.", bisObe.getDeviceId(), stNodeId, edNodeId, travelSec);
+        }
+        else {
+            TbLinkDto link = this.repoService.getSectMap(stNodeId, edNodeId);
+            if (link == null) {
+                // 구간을 찾지 못하였음... 중간에 노드를 건너 띈 경우
+                log.warn("T2.DEVICE ID: {}, 시작노드: {}, 종료노드: {}, 구간 맷칭 오류...", bisObe.getDeviceId(), stNodeId, edNodeId);
+            }
+            else {
+                // 구간을 통과하였으므로 구간교통정보를 생성한다.
+                int speed = calcSpeed(link.getLinkLeng(), travelSec);
+                int prcsSpeed = Math.min(100, speed);
+                log.info("T1.DEVICE ID: {}, 시작노드: {}, 종료노드: {}, 운행구간: {}, {} m, {}/{} km/h, {} seconds.",
+                        bisObe.getDeviceId(), stNodeId, edNodeId, link.getLinkId(), link.getLinkLeng(), speed, prcsSpeed, travelSec);
+
+                TbBisLinkTrafClct bisLinkTrafClct = TbBisLinkTrafClct.builder()
+                        .CLCT_DT(SysUtils.getSysTime())
+                        .LINK_ID(link.getLinkId())
+                        .DEVICE_ID(bisObe.getDeviceId())
+                        .SPED(prcsSpeed)
+                        .TRVL_HH(travelSec)
+                        .ST_NODE_ARR_DT(TimeUtils.millisToString(stTime))
+                        .ED_NODE_ARR_DT(TimeUtils.millisToString(edTime))
+                        .build();
+
+                // 구간 소통정보 이력으로 저장
+                this.dbmsDataProcess.add(new DbmsData(DbmsDataType.DBMS_DATA_CRT_BIS_LINK_TRAF_CLCT, false, bisLinkTrafClct));
+            }
+        }
+    }
+
     public void report() {
         long avgTime = 0;
         log.info("Packet: Remain Q: {}, Average: {}, {}", this.DATA_QUEUE.size(), TimeUtils.elapsedTimeStr(avgTime), Thread.currentThread().getName());
@@ -293,7 +273,7 @@ public class BisAgipWorker implements Runnable {
         if (distance <= 0 || seconds <= 0) {
             return 2;
         }
-        speed = (int)(((distance * 3.6) / (float)seconds) + 0.5);
+        speed = (int)(((distance * 3.6) / seconds) + 0.5);
         return speed;
     }
 
@@ -315,7 +295,9 @@ public class BisAgipWorker implements Runnable {
                 }
             }
         }
-        log.info("getNearNode: {} ms. {} m, {}", elapsed.milliSeconds(), maxDistance, nearNode);
+        if (elapsed.milliSeconds() > 200) {
+            log.info("getNearNode: {} ms. {} m, {}", elapsed.milliSeconds(), maxDistance, nearNode);
+        }
         return nearNode;
     }
 

+ 10 - 8
src/main/java/com/its/bis/service/worker/BisAgipWorkerBackup.java

@@ -1,16 +1,13 @@
 package com.its.bis.service.worker;
 
 import com.its.app.utils.Elapsed;
-import com.its.app.utils.SysUtils;
 import com.its.app.utils.TimeUtils;
 import com.its.bis.api.dto.AgipObeLoc;
 import com.its.bis.config.ServerConfig;
-import com.its.bis.dto.*;
-import com.its.bis.entity.TbBisLinkTrafClct;
-import com.its.bis.entity.TbBisVehLoc;
-import com.its.bis.process.DbmsData;
+import com.its.bis.dto.Location;
+import com.its.bis.dto.NearNodeDto;
+import com.its.bis.dto.TbNodeDto;
 import com.its.bis.process.DbmsDataProcess;
-import com.its.bis.process.DbmsDataType;
 import com.its.bis.service.AppRepositoryService;
 import lombok.extern.slf4j.Slf4j;
 import org.slf4j.MDC;
@@ -74,6 +71,7 @@ public class BisAgipWorkerBackup implements Runnable {
     }
 
     public void process(AgipObeLoc obeLoc) {
+        /**
 //        long curr = System.nanoTime();
         // 샘플데이터: latitude=36.56392018, longitude=128.74352336
         Location currLocation = Location.builder()
@@ -111,10 +109,12 @@ public class BisAgipWorkerBackup implements Runnable {
         bisObe.setAngle(obeLoc.getGnssInfo().getAngle());
 
         MDC.put("id", bisObe.getDeviceId());
-
+**/
         /**
          * 최근접 통과노드정보를 구한다.
          */
+
+        /**
         NearNodeDto passNode = getNearNode(currLocation);
         Long stNodeId = bisObe.getStNodeId();
         Long edNodeId = bisObe.getEdNodeId();
@@ -208,10 +208,11 @@ public class BisAgipWorkerBackup implements Runnable {
 
         MDC.remove(bisObe.getDeviceId());
         MDC.clear();
-
+**/
         /**
          * 버스 현재위치 정보를 업데이트 한다.
          */
+        /**
         TbBisVehLoc bisVehLoc = TbBisVehLoc.builder()
                 .DEVICE_ID(bisObe.getDeviceId())
                 .CLCT_DT(SysUtils.getSysTime())
@@ -224,6 +225,7 @@ public class BisAgipWorkerBackup implements Runnable {
                 .PASS_NODE_ID(passNodeId)
                 .build();
         this.dbmsDataProcess.add(new DbmsData(DbmsDataType.DBMS_DATA_UPD_BIS_VEH_LOC, false, bisVehLoc));
+         **/
     }
 
     public void report() {