Open cccreator opened 5 years ago
用到离站实现,很简单直接获取站点信息就ok;用经纬度实现,通过实时经纬度和数据库表经纬度的距离来确定到站信息,用flag来标记站点信息在List中的位置;
//根据子线路查询所属车辆的到离站信息 public List getBusArrLevBySubRouteID(String[] subRouteIds) throws BusinessException { List<String> listSubRouteIds = Arrays.asList(subRouteIds); List<BusArrLevData> listResult = new ArrayList<BusArrLevData>(); List<BusClusterData> busClusterDatas = getBusDataByRouteID(subRouteIds); Map<String, BusClusterData> busClusterDataMap = new HashMap<String, BusClusterData>(); Map<String, BusArrLeftMessage> busArrLeftMessageMap = BusRealDataCacheService.getBusArrLevDataCache(); Set<String> set = busArrLeftMessageMap.keySet(); MapCacheManager mapCacheManager = new MapCacheManager(); /** * 将busClusterDatas转为Map<busCard,busClusterData> **/ for (int i = 0; i < busClusterDatas.size(); i++) { if (busClusterDatas.get(i).getProductID() != null) { //将gps缓存中的信息放入到busClusterDataMap中;其中productID为key值,value为busClusterDatas(gps缓存数据) busClusterDataMap.put(busClusterDatas.get(i).getProductID(), busClusterDatas.get(i)); } } /*使用迭代器*/ Iterator itor = set.iterator(); DecimalFormat dcmFmt = new DecimalFormat("#.0000"); BusArrLeftMessage busArrLeftMessage; String key; //while循环,如果还有下一个数据就一直执行 if(!(propertiesUtil.getCityName().equals("SZ"))){ while (itor.hasNext()) { key = (String) itor.next(); //根据缓存中的key值,获取对应得实体类 busArrLeftMessage = busArrLeftMessageMap.get(key); BusArrLevData busArrLevData = new BusArrLevData(); if (StringUtil.isNotEmpty(busArrLeftMessage.getProductID()) && listSubRouteIds.contains(busArrLeftMessage.getSubRouteID())) { busArrLeftMessage.setRouteName(busArrLeftMessage.getRouteName()); //将获取的实体类放入一个list集合中 busArrLevData.setBusCardNo(busArrLeftMessage.getBusCardNo()); busArrLevData.setOrgName(busArrLeftMessage.getOrgName()); busArrLevData.setProductID(busArrLeftMessage.getProductID()); busArrLevData.setRouteId(busArrLeftMessage.getRouteID()); busArrLevData.setSubRouteID(busArrLeftMessage.getSubRouteID()); busArrLevData.setSpeed(new BigDecimal(busArrLeftMessage.getSpeed()).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue()); busArrLevData.setMsgTime(busArrLeftMessage.getMsgTime()); busArrLevData.setIsArrLeft(busArrLeftMessage.getIsArrLeft()); busArrLevData.setDualSerialid(busArrLeftMessage.getDualSerialid()); busArrLevData.setBusSelfId(busArrLeftMessage.getBusSelfId()); if (MapCacheManager.cacheMapSubRouteSegmentBySubRouteID.containsKey(busArrLeftMessage.getSubRouteID())) { List<String> list = mapCacheManager.getCacheMapSegmentIdBySubRouteId(busArrLeftMessage.getSubRouteID()); boolean flag = false; for (int i = 0; i < list.size(); i++) { if (flag) { break; } String segmentId = list.get(i); if (MapCacheManager.cacheMapSegmentStationBySegmentId.containsKey(segmentId)) { List<ClsSegmentStation> clsSegmentStations = mapCacheManager.getCacheMapSegmentStationBySegmentId(segmentId); for (int j = 0; j < clsSegmentStations.size(); j++) { String dualSerialID = clsSegmentStations.get(j).getDualSerialID(); if (null != dualSerialID && !"".equals(dualSerialID) && dualSerialID.equals(busArrLevData.getDualSerialid())) { busArrLevData.setStationName(clsSegmentStations.get(j).getStationName()); busArrLevData.setStationNo(clsSegmentStations.get(j).getStationNo()); busArrLevData.setRunDirection(clsSegmentStations.get(j).getRunDirection()); busArrLevData.setStationGlobalID(clsSegmentStations.get(j).getStationID()); flag = true; listResult.add(busArrLevData); if (busClusterDataMap.containsKey(busArrLevData.getProductID())) { busClusterDataMap.put(busArrLevData.getProductID(), null); } break; } } } } } } } } Set<String> set1 = busClusterDataMap.keySet(); /*使用迭代器*/ Iterator itor1 = set1.iterator(); Map<String, List> map = new HashMap<String, List>(); for (int i = 0; i < subRouteIds.length; i++) { List resultList = gisMonitorDao.getStationListBySubRouteId(subRouteIds[i]); //resultList是这条线(上下行)的所有站点信息,注意上下行同一个站点名的站点编号可是不一样的 if (resultList.size() > 0) { map.put(subRouteIds[i], resultList); //map中的数据为getStationListBySubRouteId(subRouteIds[i])方法从数据库表里获取的数据 } } try { while (itor1.hasNext()) { String key1 = (String) itor1.next(); /*根据缓存中的key值,获取对应得实体类*/ if (busClusterDataMap.get(key1) != null) { Double distance = 999999.0; int flag = -1; //key1为productID,busClusterDataMap.get(key1)确定到某辆车后通过getSubRouteID()获取到子线ID。 // stationList为某辆车所在线路的上下行站点编号list,map为表中站点信息,stationList中的信息为实时gps缓存中的信息 List<Map> stationList = map.get(busClusterDataMap.get(key1).getSubRouteID()); Double busLon = busClusterDataMap.get(key1).getLongitude(); //某辆车的实时经度 Double busLat = busClusterDataMap.get(key1).getLatitude(); //某辆车的实时维度 String runDirection = ""; //实时gps缓存中车辆的上下行 if (Constants.CITYNAME_FZ.equals(propertiesUtil.getCityName())) { if (busClusterDataMap.get(key1).getSequenceType().equals(4)) { runDirection = "2"; } else if (busClusterDataMap.get(key1).getSequenceType().equals(5)) { runDirection = "1"; } else if (busClusterDataMap.get(key1).getSequenceType().equals(6)) { runDirection = "3"; } else { continue; } } else { if (busClusterDataMap.get(key1).getSequenceType().equals(4)) { runDirection = "1"; } else if (busClusterDataMap.get(key1).getSequenceType().equals(5)) { runDirection = "2"; } else if (busClusterDataMap.get(key1).getSequenceType().equals(6)) { runDirection = "3"; } else { continue; } } for (int i = 0; i < stationList.size(); i++) { //这一个for循环是为了获取距离车辆最近的一个站点,标志位为flag Map map1 = stationList.get(i); //运行图表中第i个站点信息 Double stationLon = (Double) map1.get("longitude"); //运行图表中站点经度信息 Double stationLat = (Double) map1.get("latitude"); //运行图表中站点维度信息 //runDirection.equals(map1.get("runDirection")),将gps缓存中的运行方向与运行简图表中的运行方向进行比对 (Math.abs(busLon * 1000 - stationLon * 1000) * Math.abs(busLat * 1000 - stationLat * 1000) + Math.abs(busLat * 1000 - stationLat * 1000) * Math.abs(busLat * 1000 - stationLat * 1000)) if (runDirection.equals(map1.get("runDirection")) && distance > (Math.abs(busLon * 1000 - stationLon * 1000) * Math.abs(busLat * 1000 - stationLat * 1000) + Math.abs(busLat * 1000 - stationLat * 1000) * Math.abs(busLat * 1000 - stationLat * 1000))) { distance = Math.abs(busLon * 1000 - stationLon * 1000) * Math.abs(busLat * 1000 - stationLat * 1000) + Math.abs(busLat * 1000 - stationLat * 1000) * Math.abs(busLat * 1000 - stationLat * 1000); // distance = GpsUtil.getDistance(busLat,busLon,stationLat,stationLon); flag = i; } } if (flag == -1) { for (int i = 0; i < stationList.size(); i++) { Map map1 = stationList.get(i); Double stationLon = (Double) map1.get("longitude"); Double stationLat = (Double) map1.get("latitude"); if (distance > Math.sqrt(Math.abs(busLon - stationLon) * Math.abs(busLat - stationLat) + Math.abs(busLat - stationLat))) { distance = Math.sqrt(Math.abs(busLon - stationLon) * Math.abs(busLat - stationLat) + Math.abs(busLat - stationLat)); flag = i; } /*if (distance > GpsUtil.getDistance(busLat,busLon,stationLat,stationLon)) { distance = GpsUtil.getDistance(busLat,busLon,stationLat,stationLon); flag = i; }*/ } } if (flag != -1 && distance < 999999.0) { BusArrLevData busArrLevData = new BusArrLevData(); busArrLevData.setBusCardNo(busClusterDataMap.get(key1).getBusCardNo()); busArrLevData.setSubRouteID((String) stationList.get(flag).get("subRouteId")); busArrLevData.setStationNo((String) stationList.get(flag).get("stationNo")); busArrLevData.setStationGlobalID((String) stationList.get(flag).get("stationNo")); busArrLevData.setLongitude((Double) stationList.get(flag).get("longitude")); busArrLevData.setLatitude((Double) stationList.get(flag).get("latitude")); busArrLevData.setRunDirection((String) stationList.get(flag).get("runDirection")); busArrLevData.setStationGlobalID((String) stationList.get(flag).get("stationId")); busArrLevData.setSpeed(busClusterDataMap.get(key1).getSpeed()); busArrLevData.setMsgTime(busClusterDataMap.get(key1).getActTime()); busArrLevData.setBusSelfId(busClusterDataMap.get(key1).getBusSelfId()); listResult.add(busArrLevData); } } } } catch (Exception e) { e.printStackTrace(); } return listResult; }
车辆运行简图:到离站数据实现和实时经纬度实现(java)