cccreator / GIS

Gis releated
1 stars 0 forks source link

Bus Run Diagram #11

Open cccreator opened 5 years ago

cccreator commented 5 years ago

车辆运行简图:到离站数据实现和实时经纬度实现(java)

用到离站实现,很简单直接获取站点信息就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;
    }