Commit 54a0b4cce0c7e24dfcb404957399fa27d21f8e07
1 parent
50daf0ec
gps test
Showing
5 changed files
with
462 additions
and
0 deletions
src/main/java/com/bsth/controller/test/GpsTestController.java
0 → 100644
| 1 | +package com.bsth.controller.test; | |
| 2 | + | |
| 3 | +import java.util.HashMap; | |
| 4 | +import java.util.List; | |
| 5 | +import java.util.Map; | |
| 6 | + | |
| 7 | +import org.springframework.beans.factory.annotation.Autowired; | |
| 8 | +import org.springframework.web.bind.annotation.RequestMapping; | |
| 9 | +import org.springframework.web.bind.annotation.RequestParam; | |
| 10 | +import org.springframework.web.bind.annotation.RestController; | |
| 11 | + | |
| 12 | +import com.bsth.service.StationRouteService; | |
| 13 | + | |
| 14 | +@RestController | |
| 15 | +@RequestMapping("/test/gps") | |
| 16 | +public class GpsTestController { | |
| 17 | + | |
| 18 | + @Autowired | |
| 19 | + StationRouteService stationRouteService; | |
| 20 | + | |
| 21 | + @RequestMapping(value = "/route") | |
| 22 | + public List<Map<String, Object>> findRouteByLineId(@RequestParam int xl,@RequestParam int directions){ | |
| 23 | + Map<String, Object> map = new HashMap<>(); | |
| 24 | + map.put("line.id_eq", xl); | |
| 25 | + map.put("directions_eq", directions); | |
| 26 | + | |
| 27 | + List<Map<String, Object>> list = stationRouteService.findPoints(map); | |
| 28 | + return list; | |
| 29 | + } | |
| 30 | +} | ... | ... |
src/main/java/com/bsth/util/TransGPS.java
0 → 100644
| 1 | +package com.bsth.util; | |
| 2 | + | |
| 3 | +import java.lang.Math; | |
| 4 | + | |
| 5 | +public class TransGPS { | |
| 6 | + | |
| 7 | + public static class Location { | |
| 8 | + private double lat; | |
| 9 | + private double lng; | |
| 10 | + | |
| 11 | + public double getLat() { | |
| 12 | + return lat; | |
| 13 | + } | |
| 14 | + | |
| 15 | + public void setLat(double lat) { | |
| 16 | + this.lat = lat; | |
| 17 | + } | |
| 18 | + | |
| 19 | + public double getLng() { | |
| 20 | + return lng; | |
| 21 | + } | |
| 22 | + | |
| 23 | + public void setLng(double lng) { | |
| 24 | + this.lng = lng; | |
| 25 | + } | |
| 26 | + | |
| 27 | + } | |
| 28 | + | |
| 29 | + public static Location LocationMake(double lng, double lat) { | |
| 30 | + Location loc = new Location(); | |
| 31 | + loc.lng = lng; | |
| 32 | + loc.lat = lat; | |
| 33 | + return loc; | |
| 34 | + } | |
| 35 | + | |
| 36 | + static double pi = 3.14159265358979324; | |
| 37 | + | |
| 38 | + static double a = 6378245.0; | |
| 39 | + static double ee = 0.00669342162296594323; | |
| 40 | + | |
| 41 | + public static int outOfChina(double lat, double lon) { | |
| 42 | + if (lon < 72.004 || lon > 137.8347) | |
| 43 | + return 1; | |
| 44 | + if (lat < 0.8293 || lat > 55.8271) | |
| 45 | + return 1; | |
| 46 | + return 0; | |
| 47 | + } | |
| 48 | + | |
| 49 | + public static double transformLat(double x, double y) { | |
| 50 | + double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.sqrt(x > 0 ? x : -x); | |
| 51 | + ret += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0; | |
| 52 | + ret += (20.0 * Math.sin(y * pi) + 40.0 * Math.sin(y / 3.0 * pi)) * 2.0 / 3.0; | |
| 53 | + ret += (160.0 * Math.sin(y / 12.0 * pi) + 320 * Math.sin(y * pi / 30.0)) * 2.0 / 3.0; | |
| 54 | + return ret; | |
| 55 | + } | |
| 56 | + | |
| 57 | + public static double transformLon(double x, double y) { | |
| 58 | + double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.sqrt(x > 0 ? x : -x); | |
| 59 | + ret += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0; | |
| 60 | + ret += (20.0 * Math.sin(x * pi) + 40.0 * Math.sin(x / 3.0 * pi)) * 2.0 / 3.0; | |
| 61 | + ret += (150.0 * Math.sin(x / 12.0 * pi) + 300.0 * Math.sin(x / 30.0 * pi)) * 2.0 / 3.0; | |
| 62 | + return ret; | |
| 63 | + } | |
| 64 | + | |
| 65 | + public static Location transformFromWGSToGCJ(Location wgLoc) { | |
| 66 | + Location mgLoc = new Location(); | |
| 67 | + if (1 == outOfChina(wgLoc.lat, wgLoc.lng)) { | |
| 68 | + mgLoc = wgLoc; | |
| 69 | + return mgLoc; | |
| 70 | + } | |
| 71 | + double dLat = transformLat(wgLoc.lng - 105.0, wgLoc.lat - 35.0); | |
| 72 | + double dLon = transformLon(wgLoc.lng - 105.0, wgLoc.lat - 35.0); | |
| 73 | + double radLat = wgLoc.lat / 180.0 * pi; | |
| 74 | + double magic = Math.sin(radLat); | |
| 75 | + magic = 1 - ee * magic * magic; | |
| 76 | + double sqrtMagic = Math.sqrt(magic); | |
| 77 | + dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi); | |
| 78 | + dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * pi); | |
| 79 | + mgLoc.lat = wgLoc.lat + dLat; | |
| 80 | + mgLoc.lng = wgLoc.lng + dLon; | |
| 81 | + | |
| 82 | + return mgLoc; | |
| 83 | + } | |
| 84 | + | |
| 85 | + Location transformFromGCJToWGS(Location gcLoc) { | |
| 86 | + Location wgLoc = new Location(); | |
| 87 | + wgLoc.lat = gcLoc.lat; | |
| 88 | + wgLoc.lng = gcLoc.lng; | |
| 89 | + | |
| 90 | + Location currGcLoc = new Location(); | |
| 91 | + Location dLoc = new Location(); | |
| 92 | + ; | |
| 93 | + while (true) { | |
| 94 | + currGcLoc = transformFromWGSToGCJ(wgLoc); | |
| 95 | + dLoc.lat = gcLoc.lat - currGcLoc.lat; | |
| 96 | + dLoc.lng = gcLoc.lng - currGcLoc.lng; | |
| 97 | + if (Math.abs(dLoc.lat) < 1e-7 && Math.abs(dLoc.lng) < 1e-7) { | |
| 98 | + return wgLoc; | |
| 99 | + } | |
| 100 | + wgLoc.lat += dLoc.lat; | |
| 101 | + wgLoc.lng += dLoc.lng; | |
| 102 | + } | |
| 103 | + | |
| 104 | + } | |
| 105 | + | |
| 106 | + static double x_pi = 3.14159265358979324 * 3000.0 / 180.0; | |
| 107 | + | |
| 108 | + public static Location bd_encrypt(Location gcLoc) { | |
| 109 | + double x = gcLoc.lng, y = gcLoc.lat; | |
| 110 | + double z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * x_pi); | |
| 111 | + double theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * x_pi); | |
| 112 | + return LocationMake(z * Math.cos(theta) + 0.0065, z * Math.sin(theta) + 0.006); | |
| 113 | + } | |
| 114 | + | |
| 115 | + public static Location bd_decrypt(Location bdLoc) { | |
| 116 | + double x = bdLoc.lng - 0.0065, y = bdLoc.lat - 0.006; | |
| 117 | + double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_pi); | |
| 118 | + double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_pi); | |
| 119 | + return LocationMake(z * Math.cos(theta), z * Math.sin(theta)); | |
| 120 | + } | |
| 121 | +} | ... | ... |
src/main/java/com/bsth/vehicle/gpsdata/service/GpsDataService.java
0 → 100644
src/main/java/com/bsth/vehicle/gpsdata/service/GpsDataServiceImpl.java
0 → 100644
| 1 | +package com.bsth.vehicle.gpsdata.service; | |
| 2 | + | |
| 3 | +import java.sql.Connection; | |
| 4 | +import java.sql.PreparedStatement; | |
| 5 | +import java.sql.ResultSet; | |
| 6 | +import java.util.ArrayList; | |
| 7 | +import java.util.Calendar; | |
| 8 | +import java.util.Date; | |
| 9 | +import java.util.HashMap; | |
| 10 | +import java.util.List; | |
| 11 | +import java.util.Map; | |
| 12 | + | |
| 13 | +import org.springframework.stereotype.Service; | |
| 14 | + | |
| 15 | +import com.bsth.util.TransGPS; | |
| 16 | +import com.bsth.util.TransGPS.Location; | |
| 17 | +import com.bsth.util.db.DBUtils_MS; | |
| 18 | + | |
| 19 | +@Service | |
| 20 | +public class GpsDataServiceImpl implements GpsDataService{ | |
| 21 | + | |
| 22 | + //历史gps查询 | |
| 23 | + @Override | |
| 24 | + public List<Map<String, Object>> history(String device, Long startTime, Long endTime, int directions) { | |
| 25 | + Calendar sCal = Calendar.getInstance(); | |
| 26 | + sCal.setTime(new Date(/*startTime*/)); | |
| 27 | + | |
| 28 | + Calendar eCal = Calendar.getInstance(); | |
| 29 | + eCal.setTime(new Date(endTime)); | |
| 30 | + | |
| 31 | + int dayOfYear = sCal.get(Calendar.DAY_OF_YEAR); | |
| 32 | + /*if(dayOfYear != eCal.get(Calendar.DAY_OF_YEAR)){ | |
| 33 | + System.out.println("暂时不支持跨天查询..."); | |
| 34 | + return null; | |
| 35 | + }*/ | |
| 36 | + | |
| 37 | + String sql = "select DEVICE_ID,LON,LAT,TS,INOUT_STOP,SERVICE_STATE from BSTH_C_GPS_INFO where days_year=? and device_id=? and ts > ? and ts < ?"; | |
| 38 | + Connection conn = null; | |
| 39 | + PreparedStatement ps = null; | |
| 40 | + ResultSet rs = null; | |
| 41 | + List<Map<String, Object>> list = new ArrayList<>(); | |
| 42 | + Map<String, Object> map = null; | |
| 43 | + try{ | |
| 44 | + conn = DBUtils_MS.getConnection(); | |
| 45 | + ps = conn.prepareStatement(sql); | |
| 46 | + ps.setInt(1, dayOfYear); | |
| 47 | + ps.setString(2, device); | |
| 48 | + ps.setLong(3, startTime); | |
| 49 | + ps.setLong(4, endTime); | |
| 50 | + | |
| 51 | + rs = ps.executeQuery(); | |
| 52 | + Float lon, lat; | |
| 53 | + Location location; | |
| 54 | + int upDown; | |
| 55 | + while (rs.next()) { | |
| 56 | + upDown = getUpOrDown(rs.getLong("SERVICE_STATE")); | |
| 57 | + if(upDown != directions) | |
| 58 | + continue; | |
| 59 | + | |
| 60 | + //to 百度坐标 | |
| 61 | + lon = rs.getFloat("LON"); | |
| 62 | + lat = rs.getFloat("lat"); | |
| 63 | + location = TransGPS.LocationMake(lon, lat); | |
| 64 | + location = TransGPS.bd_encrypt(TransGPS.transformFromWGSToGCJ(location)); | |
| 65 | + | |
| 66 | + map = new HashMap<>(); | |
| 67 | + map.put("device", rs.getString("DEVICE_ID")); | |
| 68 | + map.put("lon", location.getLng()); | |
| 69 | + map.put("lat", location.getLat()); | |
| 70 | + map.put("ts", rs.getLong("ts")); | |
| 71 | + map.put("inout_stop", rs.getInt("INOUT_STOP")); | |
| 72 | + //上下行 | |
| 73 | + map.put("upDown", upDown); | |
| 74 | + list.add(map); | |
| 75 | + } | |
| 76 | + }catch(Exception e){ | |
| 77 | + e.printStackTrace(); | |
| 78 | + }finally { | |
| 79 | + DBUtils_MS.close(rs, ps, conn); | |
| 80 | + } | |
| 81 | + return list; | |
| 82 | + } | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + /**王通 2016/6/29 9:23:24 | |
| 87 | + * 获取车辆线路上下行 | |
| 88 | + * @return -1无效 0上行 1下行 | |
| 89 | + */ | |
| 90 | + public static byte getUpOrDown(long serviceState) { | |
| 91 | + if ((serviceState & 0x00020000) == 0x00020000 || (serviceState & 0x80000000) == 0x80000000 | |
| 92 | + || (serviceState & 0x01000000) == 0x01000000 | |
| 93 | + || (serviceState & 0x08000000) == 0x08000000) return -1; | |
| 94 | + return (byte)(((serviceState & 0x10000000) == 0x10000000) ? 1 : 0); | |
| 95 | + } | |
| 96 | +} | ... | ... |
src/main/resources/static/gpsTest/test.html
0 → 100644
| 1 | +<!DOCTYPE html> | |
| 2 | +<html> | |
| 3 | +<head> | |
| 4 | +<meta charset="UTF-8"> | |
| 5 | +<title>GPS点测试</title> | |
| 6 | +<meta name=”renderer” content=”webkit”> | |
| 7 | +<meta http-equiv=”X-UA-Compatible” content=”IE=Edge,chrome=1″ > | |
| 8 | + | |
| 9 | +<meta http-equiv="Pragma" content="no-cache"> | |
| 10 | +<meta http-equiv="Cache-control" content="no-cache"> | |
| 11 | +<meta http-equiv="Cache" content="no-cache"> | |
| 12 | +<head> | |
| 13 | +<!-- select2 下拉框插件 --> | |
| 14 | +<link href="/metronic_v4.5.4/plugins/select2/css/select2.min.css" rel="stylesheet" type="text/css" /> | |
| 15 | +<style type="text/css"> | |
| 16 | +html,body{ | |
| 17 | + height: 100%; | |
| 18 | + overflow: hidden; | |
| 19 | +} | |
| 20 | +#mapContainer{ | |
| 21 | + width: 100%; | |
| 22 | + height: calc(100% - 93px); | |
| 23 | +} | |
| 24 | + | |
| 25 | +form{ | |
| 26 | + padding: 25px; | |
| 27 | +} | |
| 28 | + | |
| 29 | +form .item{ | |
| 30 | + display: inline-block; | |
| 31 | +} | |
| 32 | + | |
| 33 | +form .item input{ | |
| 34 | + height: 26px; | |
| 35 | + width: 110px; | |
| 36 | +} | |
| 37 | + | |
| 38 | +form .item select{ | |
| 39 | + height: 32px; | |
| 40 | +} | |
| 41 | + | |
| 42 | + | |
| 43 | +</style> | |
| 44 | +</head> | |
| 45 | +<body> | |
| 46 | +<form action=""> | |
| 47 | + <div class="item"> | |
| 48 | + 线路: | |
| 49 | + <select name="xl" style="width: 150px;"> | |
| 50 | + </select> | |
| 51 | + </div> | |
| 52 | + <div class="item"> | |
| 53 | + 方向: | |
| 54 | + <select name="directions" style="width: 70px;"> | |
| 55 | + <option value="0">上行</option> | |
| 56 | + <option value="1">下行</option> | |
| 57 | + </select> | |
| 58 | + </div> | |
| 59 | + <div class="item"> | |
| 60 | + 设备号: | |
| 61 | + <input name="device" value="059L1931"/> | |
| 62 | + </div> | |
| 63 | + <div class="item"> | |
| 64 | + 开始时间戳: | |
| 65 | + <input type="number" name="startTime" value="1461365400000"/> | |
| 66 | + </div> | |
| 67 | + <div class="item"> | |
| 68 | + 结束时间戳: | |
| 69 | + <input type="number" name="endTime" value="1461370800000"/> | |
| 70 | + </div> | |
| 71 | + <div class="item"> | |
| 72 | + <input type="button" value="查询GPS轨迹" onclick="searchGps()"> | |
| 73 | + </div> | |
| 74 | + <div class="item"> | |
| 75 | + <input type="button" value="开启测距" onclick="myDis.open();" style="width: 75px"/> | |
| 76 | + <input type="button" value="关闭测距" onclick="myDis.close()" style="width: 75px"/> | |
| 77 | + | |
| 78 | + </div> | |
| 79 | + | |
| 80 | + <div class="item"> | |
| 81 | + <a target="_blank" href="http://tool.chinaz.com/Tools/unixtime.aspx" style="font-size: 12px;color: red;">毫秒时间戳转换</a> | |
| 82 | + </div> | |
| 83 | +</form> | |
| 84 | + | |
| 85 | +<div id="mapContainer"></div> | |
| 86 | +<script src="/assets/plugins/pinyin.js"></script> | |
| 87 | +<script src="/metronic_v4.5.4/plugins/jquery.min.js" ></script> | |
| 88 | +<script src="/assets/plugins/jquery.serializejson.js" ></script> | |
| 89 | +<script src="http://api.map.baidu.com/api?v=2.0&ak=IGGrr4UjwIYzatoCRFKEL8sT" ></script> | |
| 90 | +<script type="text/javascript" src="http://api.map.baidu.com/library/DistanceTool/1.2/src/DistanceTool_min.js"></script> | |
| 91 | +<!-- moment.js 日期处理类库 --> | |
| 92 | +<script src="/assets/plugins/moment-with-locales.js"></script> | |
| 93 | +<!-- select2 下拉框 --> | |
| 94 | +<script src="/metronic_v4.5.4/plugins/select2/js/select2.full.min.js" ></script> | |
| 95 | +<script> | |
| 96 | + | |
| 97 | + var inMark = 'data:image/png;base64,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AAAldEVYdGRhdGU6bW9kaWZ5ADIwMTMtMTEtMjBUMjI6NDc6MTErMDg6MDAou1syAAAATnRFWHRzb2Z0d2FyZQBJbWFnZU1hZ2ljayA2LjguOC0xMCBRMTYgeDg2XzY0IDIwMTUtMDctMTkgaHR0cDovL3d3dy5pbWFnZW1hZ2ljay5vcmcFDJw1AAAAGHRFWHRUaHVtYjo6RG9jdW1lbnQ6OlBhZ2VzADGn/7svAAAAF3RFWHRUaHVtYjo6SW1hZ2U6OkhlaWdodAA1Mwmpb+QAAAAWdEVYdFRodW1iOjpJbWFnZTo6V2lkdGgAMjgpleAmAAAAGXRFWHRUaHVtYjo6TWltZXR5cGUAaW1hZ2UvcG5nP7JWTgAAABd0RVh0VGh1bWI6Ok1UaW1lADEzODQ5NTg4MzEXUMEwAAAAE3RFWHRUaHVtYjo6U2l6ZQA0LjUzS0JC/AyPiAAAAFp0RVh0VGh1bWI6OlVSSQBmaWxlOi8vL2hvbWUvd3d3cm9vdC93d3cuZWFzeWljb24ubmV0L2Nkbi1pbWcuZWFzeWljb24uY24vc3JjLzExMjk3LzExMjk3NzIucG5nqXNeUQAAAABJRU5ErkJggg=='; | |
| 98 | + var outMark = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAvCAMAAAC18jgTAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAABO1BMVEUAAAAiu4ggv40gvowgvowgvosgvowfvo0jv44hv40gvosgvowcxo4fvowgvowdvYogv4whvo0gvowhvYwrqoAhv4wnxIkgv4wA//8gvIshvosgvowhvIshvowgvowrv5Ugv4ohvosgvowhv4wgv4whvYwXuYsgvowgvowiu4gfvo0zzJkhvowktpIgvowgv40hvo0gv4wgvowAqqogvosgvowjv4sgvowivIskv4khvowgvYsiu44hvosfvI0hv4sgvYofvowgvowgv40gv4wjuYsgvowhvowfvIsgvYsgvo0hvoxAv4Agv4wgvowgvoshvo0mv4whvowgvowfwo8gv4wgv40duokAAAAfvYsgvYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAYjGUYj2kAAAAAAAAAAAAgvoz///9v2GMAAAAAZ3RSTlMAD1eZyOr4miSc950Jivoj0i/pfAarDaoBWH3JLuv5DDDL0ZunbQvu/h6CBbQO5jhOkNwDtfAsz0Qc42EtdUGLYKKOwsYW7/s5f7nMBCj9N40U8/YZh48aAaOmAggNERMWF0lLGBkanzLKGQAAAAFiS0dEaMts9CIAAAGZSURBVDjLfZRnW8IwFIUvyN6FUlCx4AZxKw7cA/eeKKNUwfz/f2ChZNAmnC+U+54m9548KQCRwznicns8bpfX6QC7fP4AIgoEfRYcCkfQgCLhEMujMWRTLEq55EYcuSXyPpcbjv4aoRgSKGb2EUZChXvzRcSGSHfaIP0fT0iyLCXitOI38qP5JBWzKSVFE3OAk/I0HiudJMVR8JL1FRqMQgb3ggs/Jthox3B1HIg3wxoyuDoBKn6UWYOMqyp4uIYsNfC3yNEtJoc3OQXT3DFJmDNMUCkaFI1yFubmqcMedb4AsMAeVqaYzbGHtWj4l5bFx51f6a64mhca/OaeayK+3m9qY5PPS1tk7G0eV3doMLtlToN7bLT7JZvhYPByHqoWfmS93ceD/CRtNcApy89kG4fiOeXlCucLAoULzC+vgCvSxjUIdGPy2zuR4b53jx8eQagn5gi5en5B6PVtiAHeEfoYxqHiUT9FrNrT17f5a8O1eqOptXT951fXW1qzUa9ZXtfanU7nry/jsa1VuSsYtjZ3BdIDFin/A1AVNdoKDyAYAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE1LTA3LTI1VDIxOjUwOjQzKzA4OjAw6BLjdwAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxMy0xMS0yMFQyMjo0NzoxMyswODowML8kShsAAABOdEVYdHNvZnR3YXJlAEltYWdlTWFnaWNrIDYuOC44LTEwIFExNiB4ODZfNjQgMjAxNS0wNy0xOSBodHRwOi8vd3d3LmltYWdlbWFnaWNrLm9yZwUMnDUAAAAYdEVYdFRodW1iOjpEb2N1bWVudDo6UGFnZXMAMaf/uy8AAAAXdEVYdFRodW1iOjpJbWFnZTo6SGVpZ2h0ADQ3F9+avAAAABZ0RVh0VGh1bWI6OkltYWdlOjpXaWR0aAAzMtBbOHkAAAAZdEVYdFRodW1iOjpNaW1ldHlwZQBpbWFnZS9wbmc/slZOAAAAF3RFWHRUaHVtYjo6TVRpbWUAMTM4NDk1ODgzM/leoBwAAAATdEVYdFRodW1iOjpTaXplADQuMDFLQkKe5chzAAAAWnRFWHRUaHVtYjo6VVJJAGZpbGU6Ly8vaG9tZS93d3dyb290L3d3dy5lYXN5aWNvbi5uZXQvY2RuLWltZy5lYXN5aWNvbi5jbi9zcmMvMTEyOTcvMTEyOTc4Ni5wbmetpUpEAAAAAElFTkSuQmCC'; | |
| 99 | + | |
| 100 | + var inOuts = [outMark, inMark]; | |
| 101 | + | |
| 102 | + var map = new BMap.Map("mapContainer"); | |
| 103 | + map.centerAndZoom(new BMap.Point(121.544336, 31.221315), 15); | |
| 104 | + map.enableScrollWheelZoom(); | |
| 105 | + //中心点和缩放级别 | |
| 106 | + map.setCurrentCity("上海"); | |
| 107 | + var myDis = new BMapLib.DistanceTool(map); | |
| 108 | + | |
| 109 | + | |
| 110 | + $.get('/line/all', function(rs){ | |
| 111 | + var data = []; | |
| 112 | + $.each(rs, function(){ | |
| 113 | + data.push({id: this.id, text: this.name}); | |
| 114 | + }); | |
| 115 | + | |
| 116 | + initPinYinSelect2('select[name=xl]', data); | |
| 117 | + }); | |
| 118 | + | |
| 119 | + function searchGps(){ | |
| 120 | + var params = $('form').serializeJSON(); | |
| 121 | + //查询线路路由站点 | |
| 122 | + $.get('/test/gps/route', params, function(rs){ | |
| 123 | + var array = rs[0].children[0].children | |
| 124 | + ,coords,circle, cdsArray, points, polygon; | |
| 125 | + //画出站点 | |
| 126 | + $.each(array, function(){ | |
| 127 | + if(this.stationShapesType === 'r'){ | |
| 128 | + //画圆 | |
| 129 | + coords = this.stationBJwpoints.split(' '); | |
| 130 | + circle = new BMap.Circle(new BMap.Point(coords[0], coords[1]),this.stationRadius); | |
| 131 | + circle.setStrokeColor('red'); | |
| 132 | + circle.setStrokeWeight(2) | |
| 133 | + map.addOverlay(circle); | |
| 134 | + } | |
| 135 | + else if(this.stationShapesType === 'd'){ | |
| 136 | + //画多边形 | |
| 137 | + coords = this.stationBPolygonGrid.substring(9, this.stationBPolygonGrid.length - 2); | |
| 138 | + cdsArray = coords.split(','); | |
| 139 | + points = []; | |
| 140 | + $.each(cdsArray, function(){ | |
| 141 | + coords = this.split(' '); | |
| 142 | + points.push(new BMap.Point(coords[0], coords[1])); | |
| 143 | + }); | |
| 144 | + | |
| 145 | + polygon = new BMap.Polygon(points, {strokeColor:"red", strokeWeight:2, strokeOpacity:0.5}); | |
| 146 | + map.addOverlay(polygon); | |
| 147 | + } | |
| 148 | + }); | |
| 149 | + coords = array[array.length / 2].stationBJwpoints.split(' '); | |
| 150 | + map.setCenter(new BMap.Point(coords[0], coords[1])) | |
| 151 | + }); | |
| 152 | + | |
| 153 | + //查询gps点 | |
| 154 | + $.get('/gps/history/' + params.device, params, function(gpsArray){ | |
| 155 | + console.log(gpsArray); | |
| 156 | + var marker, label, point, state, text; | |
| 157 | + $.each(gpsArray, function(){ | |
| 158 | + point = new BMap.Point(this.lon, this.lat); | |
| 159 | + marker = new BMap.Marker(point); | |
| 160 | + state = this.inout_stop; | |
| 161 | + //inOuts | |
| 162 | + if(state == 0 || state == 1){ | |
| 163 | + text = state == 0?'出':'进'; | |
| 164 | + marker.setIcon(new BMap.Icon(inOuts[this.inout_stop], new BMap.Size(25,25))); | |
| 165 | + label = new BMap.Label(moment(this.ts).format('HH:mm') + ' -'+text, {position: point, offset: new BMap.Size(-5,-18)}); | |
| 166 | + marker.setLabel(label); | |
| 167 | + } | |
| 168 | + map.addOverlay(marker); | |
| 169 | + }); | |
| 170 | + }); | |
| 171 | + } | |
| 172 | + | |
| 173 | + | |
| 174 | + /** | |
| 175 | + * 支持拼音搜索的select2 | |
| 176 | + * @param selector | |
| 177 | + * @param data | |
| 178 | + */ | |
| 179 | + function initPinYinSelect2(selector, data, cb){ | |
| 180 | + | |
| 181 | + $.each(data, function(){ | |
| 182 | + this.fullChars = pinyin.getFullChars(this.text).toUpperCase(); | |
| 183 | + this.camelChars = pinyin.getCamelChars(this.text); | |
| 184 | + }); | |
| 185 | + | |
| 186 | + $.fn.select2.amd.require(['select2/compat/matcher'], function (oldMatcher) { | |
| 187 | + $(selector).select2({ | |
| 188 | + data: data, | |
| 189 | + matcher: oldMatcher(function(term, text, item){ | |
| 190 | + var upTerm = term.toUpperCase(); | |
| 191 | + if(item.fullChars.indexOf(upTerm) != -1 | |
| 192 | + || item.camelChars.indexOf(upTerm) != -1) | |
| 193 | + return true; | |
| 194 | + | |
| 195 | + return text.indexOf(term) != -1; | |
| 196 | + }) | |
| 197 | + }); | |
| 198 | + | |
| 199 | + cb && cb(); | |
| 200 | + }); | |
| 201 | + | |
| 202 | + return $(selector); | |
| 203 | + } | |
| 204 | +</script> | |
| 205 | +</body> | |
| 206 | +</html> | ... | ... |