SectionSpeedServiceImpl.java 10.8 KB
package com.bsth.service.impl;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.alibaba.fastjson.JSONArray;
import com.bsth.common.ResponseCode;
import com.bsth.entity.SectionSpeed;
import com.bsth.repository.SectionRouteRepository;
import com.bsth.repository.SectionSpeedRepository;
import com.bsth.service.SectionSpeedService;
import com.bsth.util.TransGPS;
import com.bsth.util.TransGPS.Location;
import com.bsth.util.Geo.GeoUtils;
import com.bsth.util.Geo.Point;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 * @description TODO(路段限速service实现类)
 * 
 * @author Administrator
 *
 * @date 2016年9月21日 13:30:33
 */
@Service
public class SectionSpeedServiceImpl extends BaseServiceImpl<SectionSpeed, Integer> implements SectionSpeedService {
	
	@Autowired
	private SectionSpeedRepository sectionSpeedRepository;
	
	@Autowired
	private SectionRouteRepository sectionRouteRepository;
	
	
	/**  @description TODO(新增路段限速) @return map ({status:SUCCESS}成功 或者  {status:ERROR}失败) @param map (路段限速信息)*/
	@Override
	public Map<String, Object> add(Map<String, Object> map) {
		
		/** 返回值 {status:SUCCESS}成功 或者  {status:ERROR}失败*/
		Map<String, Object> resultMap = new HashMap<String, Object>();
		
		/** <line:线路ID;versions:版本号;destroy:是否撤销;directions:方向;sValue:限速;code:路段序号> */
		Integer line = null, versions=null, destroy=null,directions = null,sValue = null,code = null;
		
		/** <lineCode:线路编码;sName:路段名称;sType:路段类型;bLineStr:路段矢量百度坐标;gLineStr:路段矢量WGS坐标;descriptions:说明>*/
		String lineCode ="", sName = "", sType = "",bLineStr="",gLineStr="",descriptions="";
		
		line = map.get("lineId").equals("") ? null : Integer.valueOf(map.get("lineId").toString());
		
		lineCode = map.get("lineCode").equals("") ? null : map.get("lineCode").toString();
		
		directions = map.get("directions").equals("") ? null : Integer.valueOf(map.get("directions").toString());
		
		code = map.get("code").equals("") ? null : Integer.valueOf(map.get("code").toString());
		
		sName = map.get("sName").equals("") ? "" : map.get("sName").toString();
		
		sValue = map.get("sValue").equals("") ? null : Integer.valueOf(map.get("sValue").toString());
		
		sType = map.get("sType").equals("") ? "" : map.get("sType").toString();
		
		bLineStr = map.get("bLineStr").equals("") ? "" : map.get("bLineStr").toString();
		
		String bPolyline = "";
		
		String gPolyline = "";
		
		// 转换成JSON数组
		JSONArray sectionsArray = JSONArray.parseArray(bLineStr);
		//[{"lng":121.337574,"lat":31.116436},{"lng":121.362439,"lat":31.099245},{"lng":121.362008,"lat":31.090834},{"lng":121.349791,"lat":31.093679}]
		// 遍历
		for(int s = 0 ;s<sectionsArray.size();s++) {
			
			String pointsLngStr = sectionsArray.getJSONObject(s).get("lng").toString();
			
			String pointsLatStr = sectionsArray.getJSONObject(s).get("lat").toString();
			
			Location resultPoint = FromBDPointToWGSPoint(pointsLngStr,pointsLatStr);
			
			String WGSLngStr = String.valueOf(resultPoint.getLng());
			
			String WGSLatStr = String.valueOf(resultPoint.getLat());
			
			if(s<sectionsArray.size()-1){
				
				bPolyline = bPolyline + pointsLngStr + " " + pointsLatStr + ",";
				
				gPolyline = gPolyline + WGSLngStr + " " + WGSLatStr + ",";
				
			}else{
				
				bPolyline = bPolyline + pointsLngStr + " " + pointsLatStr;
				
				gPolyline = gPolyline + WGSLngStr + " " + WGSLatStr;
			}
	 
		}
		
		
		bPolyline = "LINESTRING(" + bPolyline +")";
		
		gPolyline = "LINESTRING(" + gPolyline +")";
		/*gLineStr = map.get("gLineStr").equals("") ? "" : map.get("gLineStr").toString();*/
		
		versions = map.get("versions").equals("") ? null : Integer.valueOf(map.get("versions").toString());
		
		destroy = map.get("destroy").equals("") ? null : Integer.valueOf(map.get("destroy").toString());
		
		descriptions = map.get("descriptions").equals("")  ? "" : map.get("descriptions").toString();
		
		try {
			
			/** 保存*/
			/*sectionSpeedRepository.add(line, lineCode, directions, code, sName, sValue, sType, bPolyline, gPolyline, versions, destroy, descriptions);*/
			
			resultMap.put("status", ResponseCode.SUCCESS);
			
		} catch (Exception e) {
			
			resultMap.put("status", ResponseCode.ERROR);
			
			logger.error("save erro.", e);
			
		}
		
		return resultMap;
	}
	
	/** 百度坐标转WGS坐标 */
	public Location FromBDPointToWGSPoint(String bLonx,String bLatx) {
		
		double lng = Double.parseDouble(bLonx);
		
		double lat = Double.parseDouble(bLatx);
		
		Location bdLoc = TransGPS.LocationMake(lng, lat);
		
		Location location = TransGPS.bd_decrypt(bdLoc);
		
		Location WGSPoint = TransGPS.transformFromGCJToWGS(location);
		
		return WGSPoint;
		
	}

	@Override
	public List<Map<String, Object>> getSectionSpeedInfo(Map<String, Object> map) {
		
		int lineId = Integer.parseInt(map.get("lineId").toString());
		
		String lineCode = map.get("lineCode").toString();
		
		int directions = Integer.parseInt(map.get("directions").toString());
		
		List<Object[]> listObj = sectionSpeedRepository.getSectionSpeedInfo(lineId, lineCode, directions);
		
		List<Map<String, Object>> resultList = new ArrayList<Map<String,Object>>();
		
		if(listObj.size()>0) {
			
			for(int i = 0 ;i<listObj.size();i++){
				Map<String, Object> tempM = new HashMap<String, Object>();
				
				tempM.put("lineName", listObj.get(i)[0]);
				
				tempM.put("id", listObj.get(i)[1]);
				
				tempM.put("bLineStr", listObj.get(i)[2]);
				
				tempM.put("line_code", listObj.get(i)[3]);
				
				tempM.put("s_name", listObj.get(i)[4]);
				
				tempM.put("s_value", listObj.get(i)[5]);
				
				tempM.put("line", listObj.get(i)[6]);
				
				tempM.put("xh", listObj.get(i)[7]);
				
				tempM.put("road", listObj.get(i)[8]);
				
				tempM.put("directions", listObj.get(i)[9]);
				resultList.add(tempM);
				
			}
		}
		return resultList;
	}

	@Override
	public List<Map<String, Object>> analyticSection(Map<String, Object> map) {

		int lineId = map.get("line.id_eq").equals("") ? 0 : Integer.parseInt(map.get("line.id_eq").toString());
		
		int directions = map.get("directions_eq").equals("") ? 0 : Integer.parseInt(map.get("directions_eq").toString());
		
		String lineCode = map.get("lineCode").toString();
		
		String argus = map.get("argus").toString();
		
		List<Object[]> listObjArray = sectionRouteRepository.getSectionRoute(lineId, directions);
		
		List<Object[]> loadArray = sectionSpeedRepository.getroadNet();
		
		int len = loadArray.size();
		
		int size = listObjArray.size();
		
		List<Map<String, Object>> idArray = new  ArrayList<Map<String, Object>>();
		
		if(size > 0) {
			
			for(int i = 0; i< size; i++) {
				
				String g1 = listObjArray.get(i)[16].toString();
				
				for(int k = 0;k<len;k++) {
					
					String g2 = loadArray.get(k)[0].toString();
					
					int isContains = sectionSpeedRepository.ST_Contains(g1, g2);
					
					if(isContains == 1) {
						
						String ldbh = loadArray.get(k)[2].toString();
						
						String mc = loadArray.get(k)[3].toString();
						
						Map<String, Object> mp = new HashMap<>();
						
						mp.put("linestring", g2);
						
						int index = sectionSort(g1,g2);
						
						mp.put("index", index+100);
						
						mp.put("ldbh", ldbh);
						
						mp.put("mc", mc);
						
						mp.put("id", loadArray.get(k)[1].toString());
						
						idArray.add(mp);
						
					}
						
				}
			}
			
			if(argus.equals("1"))
				insertRode(idArray,lineId,directions,lineCode );
			
		}
		
		return idArray;
	}
	
	@Transactional
	private void insertRode(List<Map<String, Object>> idArray,int line,int directions,String lineCode) {
		
		int size = idArray.size();
		
		if(size>0) {
			for(int i =0;i<size;i++) {
				
				String broad_vector = idArray.get(i).get("linestring").toString();
				
				String groad_vector = null;
				
				String road_code = idArray.get(i).get("ldbh").toString();
				
				String road_name = idArray.get(i).get("mc").toString();
				
				Integer id = Integer.parseInt(idArray.get(i).get("id").toString());
				
				Double speed = 60.0d;
				
				Integer index = Integer.parseInt(idArray.get(i).get("index").toString());
				
				Integer vali = sectionSpeedRepository.validateRoade(road_code);
				
				if(vali==null)
					sectionSpeedRepository.insertRoad(broad_vector, groad_vector, road_code, road_name, speed,id);
				else
					id = vali;
				
				sectionSpeedRepository.add(line, lineCode, directions, index, road_name, id,road_code);
				
			}
		}
		
		int isR = 1;
		
		sectionRouteRepository.isRoadSpeedUpd( isR, line, directions);
		
	}

	public int sectionSort(String g1,String g2) {

		String g1_str =  g1.substring(g1.indexOf("(")+1, g1.length()-1);
	 	
	 	String g2_str =  g2.substring(g2.indexOf("(")+1, g2.length()-1);
	 	
	 	String g1_array[] = g1_str.split(",");
	 	
	 	String g2_array[] = g2_str.split(",");
	 	
	 	int len = g1_array.length;
	 	
	 	String pArray[] = g2_array[g2_array.length/2].split(" ");
 		
 		Point p = new Point(Double.parseDouble(pArray[0]), Double.parseDouble(pArray[1]));
	 	
	 	for(int l =0 ;l<len-1;l++) {
	 		
	 		List<Point> ps = new ArrayList<Point>();
	 		
	 		Point Point1 = new Point(Double.parseDouble(g1_array[l].split(" ")[0]), Double.parseDouble(g1_array[l].split(" ")[1]));
	 		
	 		Point Point2 = new Point(Double.parseDouble(g1_array[l+1].split(" ")[0]), Double.parseDouble(g1_array[l+1].split(" ")[1]));
	 		
	 		ps.add(Point1);
	 		
	 		ps.add(Point2);
	 		
	 		boolean b = GeoUtils.isInSection(ps, p);
	 		 
	 		if(b)
	 			return l;
	 		
	 	}
		return 0;
	}
	
	@Transactional
	public Map<String, Object> roadUpd(Map<String, Object> map) {
		/** 返回值 {status:SUCCESS}成功 或者  {status:ERROR}失败*/
		Map<String, Object> resultMap = new HashMap<String, Object>();
		try {
			Integer code = Integer.parseInt(map.get("code").toString());
			Integer sSpeedId = Integer.parseInt(map.get("sSpeedId").toString());
			String roadName = map.get("roadName").toString();
			Double speed = Double.parseDouble(map.get("speed").toString());
			Integer id = Integer.parseInt(map.get("id").toString());
			sectionSpeedRepository.roadUpdCode(code, sSpeedId);
			sectionSpeedRepository.sSpeedUpd(roadName, speed, id);
			resultMap.put("status", ResponseCode.SUCCESS);
		} catch (Exception e) {
			
			resultMap.put("status", ResponseCode.ERROR);
			
			logger.error("save erro.", e);
			
		}
		return resultMap;
	}
}