├── .gitignore ├── tt.txt ├── src ├── test │ └── java │ │ └── com │ │ └── github │ │ └── amap │ │ └── track │ │ ├── TraceTest.java │ │ ├── TerminalTest.java │ │ ├── ServiceTest.java │ │ └── AMapTrackClientTest.java └── main │ └── java │ └── com │ └── github │ └── amap │ └── track │ ├── util │ ├── JsonUtil.java │ └── HttpUtil.java │ ├── BaseOpr.java │ ├── AMapTrackException.java │ ├── Points.java │ ├── AMapTrackClient.java │ ├── Const.java │ ├── Point.java │ ├── Trace.java │ ├── Terminal.java │ └── Service.java ├── README.md └── pom.xml /.gitignore: -------------------------------------------------------------------------------- 1 | /target/ 2 | -------------------------------------------------------------------------------- /tt.txt: -------------------------------------------------------------------------------- 1 | local2 2 | 3 | -------------------------------------------------------------------------------- /src/test/java/com/github/amap/track/TraceTest.java: -------------------------------------------------------------------------------- 1 | package com.github.amap.track; 2 | 3 | import static org.junit.Assert.*; 4 | 5 | import org.junit.Test; 6 | 7 | /** 8 | * 单元测试 9 | */ 10 | public class TraceTest { 11 | 12 | @Test 13 | public void testDelete() { 14 | fail("Not yet implemented"); 15 | } 16 | 17 | @Test 18 | public void testUploadPoint() { 19 | fail("Not yet implemented"); 20 | } 21 | 22 | @Test 23 | public void testUploadPoints() { 24 | fail("Not yet implemented"); 25 | } 26 | 27 | @Test 28 | public void testTrsearch() { 29 | fail("Not yet implemented"); 30 | } 31 | 32 | @Test 33 | public void testCreatePointOpr() { 34 | fail("Not yet implemented"); 35 | } 36 | 37 | } 38 | -------------------------------------------------------------------------------- /src/test/java/com/github/amap/track/TerminalTest.java: -------------------------------------------------------------------------------- 1 | package com.github.amap.track; 2 | 3 | import static org.junit.Assert.*; 4 | 5 | import org.junit.Test; 6 | 7 | public class TerminalTest { 8 | 9 | @Test 10 | public void testDelete() { 11 | fail("Not yet implemented"); 12 | } 13 | 14 | @Test 15 | public void testUpdate() { 16 | fail("Not yet implemented"); 17 | } 18 | 19 | @Test 20 | public void testCreateTrace() { 21 | fail("Not yet implemented"); 22 | } 23 | 24 | @Test 25 | public void testCreateDefaultTrace() { 26 | fail("Not yet implemented"); 27 | } 28 | 29 | @Test 30 | public void testDefaultTrace() { 31 | fail("Not yet implemented"); 32 | } 33 | 34 | @Test 35 | public void testGetService() { 36 | fail("Not yet implemented"); 37 | } 38 | 39 | } 40 | -------------------------------------------------------------------------------- /src/main/java/com/github/amap/track/util/JsonUtil.java: -------------------------------------------------------------------------------- 1 | package com.github.amap.track.util; 2 | 3 | import com.alibaba.fastjson.JSON; 4 | 5 | public class JsonUtil { 6 | 7 | /** 8 | * 对象转json字符串 9 | * 10 | * @param obj 对象 11 | * @return json字符串 12 | */ 13 | public static String toJson(Object obj) { 14 | try { 15 | return JSON.toJSONString(obj); 16 | } catch (Exception e) { 17 | throw new RuntimeException("", e); 18 | } 19 | } 20 | 21 | /** 22 | * json字符串转对象 23 | * 24 | * @param json json字符串 25 | * @param clazz 对象类型 26 | * @return 对象 27 | */ 28 | public static T toObject(String json, Class clazz) { 29 | try { 30 | return JSON.parseObject(json, clazz); 31 | } catch (Exception e) { 32 | throw new RuntimeException("", e); 33 | } 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/com/github/amap/track/BaseOpr.java: -------------------------------------------------------------------------------- 1 | package com.github.amap.track; 2 | 3 | import java.io.Serializable; 4 | import java.util.HashMap; 5 | import java.util.Map; 6 | 7 | import com.github.amap.track.util.HttpUtil; 8 | 9 | public class BaseOpr implements Serializable { 10 | private static final long serialVersionUID = 5940916603997502761L; 11 | 12 | protected String postForm(String url, Map queryMap) { 13 | String result = HttpUtil.post(url, new HashMap<>(queryMap)); 14 | return result; 15 | } 16 | 17 | protected String get(String url, Map queryMap) { 18 | StringBuilder sb = new StringBuilder(); 19 | queryMap.forEach((k, v) -> { 20 | sb.append(k + "=" + String.valueOf(v) + "&"); 21 | }); 22 | sb.deleteCharAt(sb.length() - 1); 23 | url = url + "?" + sb.toString(); 24 | String result = HttpUtil.get(url); 25 | return result; 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/github/amap/track/AMapTrackException.java: -------------------------------------------------------------------------------- 1 | package com.github.amap.track; 2 | 3 | public class AMapTrackException extends RuntimeException { 4 | private static final long serialVersionUID = 1542961003161717755L; 5 | 6 | public AMapTrackException() { 7 | super(); 8 | // TODO Auto-generated constructor stub 9 | } 10 | 11 | public AMapTrackException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { 12 | super(message, cause, enableSuppression, writableStackTrace); 13 | // TODO Auto-generated constructor stub 14 | } 15 | 16 | public AMapTrackException(String message, Throwable cause) { 17 | super(message, cause); 18 | // TODO Auto-generated constructor stub 19 | } 20 | 21 | public AMapTrackException(String message) { 22 | super(message); 23 | // TODO Auto-generated constructor stub 24 | } 25 | 26 | public AMapTrackException(Throwable cause) { 27 | super(cause); 28 | // TODO Auto-generated constructor stub 29 | } 30 | 31 | 32 | 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/com/github/amap/track/Points.java: -------------------------------------------------------------------------------- 1 | package com.github.amap.track; 2 | 3 | import java.io.Serializable; 4 | import java.util.ArrayList; 5 | import java.util.List; 6 | 7 | public class Points implements Serializable { 8 | private static final long serialVersionUID = 884788470693780644L; 9 | protected Trace trace; 10 | private Integer distance; 11 | private Long time; 12 | private List points = new ArrayList<>(); 13 | 14 | public void add(Points p) { 15 | distance += p.distance; 16 | time += p.time; 17 | points.addAll(p.points); 18 | } 19 | 20 | 21 | public Integer getDistance() { 22 | return distance; 23 | } 24 | 25 | public Long getTime() { 26 | return time; 27 | } 28 | 29 | public Trace getTrace() { 30 | return trace; 31 | } 32 | 33 | public List getPoints() { 34 | return points; 35 | } 36 | 37 | void setTrace(Trace trace) { 38 | this.trace = trace; 39 | } 40 | 41 | void setDistance(Integer distance) { 42 | this.distance = distance; 43 | } 44 | 45 | void setTime(Long time) { 46 | this.time = time; 47 | } 48 | 49 | void setPoints(List points) { 50 | this.points = points; 51 | } 52 | 53 | @Override 54 | public String toString() { 55 | return "Points [trace=" + trace + ", distance=" + distance + ", time=" + time + ", points=" + points.size() + "]"; 56 | } 57 | 58 | 59 | } 60 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # amap-lieying-sdk 2 | 使用java语言封装了高德地图的猎鹰轨迹服务 3 | # 一、概述 4 | > 最初是由于公司项目的需要,使用到高德地图的猎鹰轨迹服务。使用场景是,后台对数据进行过滤并且规划出轨迹然后送给前端进行展示。高德的猎鹰服务刚好就满足这个需求。但是高德官方只提供http的接口文档,并没有其他语言的SDK。所以在做完公司这个项目之后,决定把当时写的代码放出来,有同样需求的朋友可以直接拷贝代码使用。主要是对各个http接口用java语言进行封装,然后可以使用Java代码方便的调用。 5 | 6 | 7 | # 二、快速开始 8 | 最简单的使用方式就是把这个项目,代码直接拷贝到工程里面。然后就可以如下使用: 9 | ```java 10 | 11 | // 表示高德客户端,使用这个类就可以管理Service 12 | AMapTrackClient client = new AMapTrackClient("高德key"); 13 | 14 | // 通过service_id或者service_name获取已经创建的Service 15 | Service service = client.getService(null, "battery"); 16 | 17 | // 通过终端名称找到这个service下面的终端 18 | Terminal terminal = service.listTerminal("860000000002019"); 19 | 20 | // 为终端创建一个默认的轨迹,官方api是没有这个功能的,这是通过在终端属性字段中保存默认轨迹方式实现的 21 | Trace trace = terminal.createDefaultTrace(); 22 | 23 | // 轨迹规划,该方法具体定义如下: 24 | trace.trsearch() 25 | 26 | ``` 27 | 28 | Trace.trsearch方法定义: 29 | 30 | ```java 31 | 32 | /** 33 | * 对应高德API https://lbs.amap.com/api/track/lieying-kaifa/api/grasproad 返回 34 | * 纠偏或者补充后的点 35 | * 36 | * @param starttime 可为空 37 | * @param endtime 可为空 38 | * @param recoup 可为空 表示是否填充距离大于gap的点 39 | * @param gap 定义两点之间需要补点的最小距离 50<= gap <=10000 单位m 40 | * @param page 查询第几页 41 | * @param pagesize 每页数据条数 42 | * @return Points 43 | */ 44 | public Points trsearch(Long starttime, Long endtime, Boolean recoup, Integer gap, Integer page, Integer pagesize) 45 | ``` 46 | # 三、 最后 47 | Service、Terminal、Trace这些都有增删查改的方法,这里就不列举了,可以直接看代码。 48 | 49 | 50 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 4 | 4.0.0 5 | com.github 6 | amap-lieying-sdk 7 | V1.0.0 8 | 9 | 10 | UTF-8 11 | UTF-8 12 | 1.8 13 | 14 | 15 | 16 | 17 | junit 18 | junit 19 | 4.13.1 20 | test 21 | 22 | 23 | 24 | org.apache.httpcomponents 25 | httpclient 26 | 4.5.13 27 | 28 | 29 | org.apache.httpcomponents 30 | httpcore 31 | 4.4.9 32 | 33 | 34 | org.apache.httpcomponents 35 | httpmime 36 | 4.5.5 37 | 38 | 39 | com.alibaba 40 | fastjson 41 | 1.2.56 42 | 43 | 44 | -------------------------------------------------------------------------------- /src/main/java/com/github/amap/track/AMapTrackClient.java: -------------------------------------------------------------------------------- 1 | package com.github.amap.track; 2 | 3 | import java.util.Iterator; 4 | import java.util.List; 5 | 6 | /** 7 | * 表示客户端对象,用户通过key来实例化这个类,这个类可以管理服务(Service) 8 | * 9 | * @author wy 10 | * 11 | */ 12 | public class AMapTrackClient { 13 | 14 | protected String key; 15 | 16 | public AMapTrackClient(String key) { 17 | this.key = key; 18 | } 19 | 20 | /** 21 | * 新建一个Service 22 | * 23 | * @param name 24 | * @param desc 25 | * @return Service 26 | */ 27 | public Service createService(String name, String desc) { 28 | Service opr = new Service(); 29 | opr.setClient(this); 30 | opr.setName(name); 31 | opr.setDesc(desc); 32 | opr.add(); 33 | return opr; 34 | } 35 | 36 | /** 37 | * 通过sid或者name查找service 38 | * 39 | * @param sid 可为空 40 | * @param name 可为空 41 | * @return Service 42 | */ 43 | public Service getService(Integer sid, String name) { 44 | Iterator iterator = listService().iterator(); 45 | while (iterator.hasNext()) { 46 | Service serviceOpr = (Service) iterator.next(); 47 | if (sid != null && serviceOpr.getSid().intValue() == sid.intValue()) 48 | return serviceOpr; 49 | if (serviceOpr.getName().equals(name)) 50 | return serviceOpr; 51 | } 52 | return null; 53 | } 54 | 55 | /** 56 | * 列出当前key下面所有的Service 57 | * 58 | * @return List 59 | */ 60 | public List listService() { 61 | Service opr = new Service(); 62 | opr.setClient(this); 63 | return opr.list(); 64 | } 65 | 66 | } 67 | -------------------------------------------------------------------------------- /src/test/java/com/github/amap/track/ServiceTest.java: -------------------------------------------------------------------------------- 1 | package com.github.amap.track; 2 | 3 | import static org.junit.Assert.*; 4 | 5 | import org.junit.Test; 6 | 7 | public class ServiceTest { 8 | 9 | 10 | @Test 11 | public void testUpdate() { 12 | AMapTrackClient client = new AMapTrackClient(AMapTrackClientTest.key); 13 | Service service = client.createService("testservice", "thisistestservice"); 14 | System.out.println(service); 15 | service.update("testservice2", "thisistestservice"); 16 | System.out.println(service); 17 | service.delete(); 18 | } 19 | 20 | @Test 21 | public void testCreateTerminal() { 22 | AMapTrackClient client = new AMapTrackClient(AMapTrackClientTest.key); 23 | Service service = client.createService("testservice1", "thisistestservice"); 24 | Terminal createTerminal = null; 25 | try { 26 | createTerminal = service.createTerminal("imei415534799", "aaaa", null); 27 | createTerminal.delete(); 28 | } catch (Exception e) { 29 | e.printStackTrace(); 30 | } 31 | System.out.println(createTerminal); 32 | service.delete(); 33 | } 34 | 35 | @Test 36 | public void testListTerminalInteger() { 37 | fail("Not yet implemented"); 38 | } 39 | 40 | @Test 41 | public void testListTerminalString() { 42 | fail("Not yet implemented"); 43 | } 44 | 45 | @Test 46 | public void testListTerminalIntegerStringInteger() { 47 | fail("Not yet implemented"); 48 | } 49 | 50 | @Test 51 | public void testAddPropsForTerminal() { 52 | fail("Not yet implemented"); 53 | } 54 | 55 | @Test 56 | public void testDelPropsForTerminal() { 57 | fail("Not yet implemented"); 58 | } 59 | 60 | } 61 | -------------------------------------------------------------------------------- /src/main/java/com/github/amap/track/Const.java: -------------------------------------------------------------------------------- 1 | package com.github.amap.track; 2 | 3 | public class Const { 4 | 5 | 6 | public static final String SERVICE_ADD_URL = "https://tsapi.amap.com/v1/track/service/add"; 7 | public static final String SERVICE_DELETE_URL = "https://tsapi.amap.com/v1/track/service/delete"; 8 | public static final String SERVICE_UPDATE_URL="https://tsapi.amap.com/v1/track/service/update"; 9 | public static final String SERVICE_LIST_URL= "https://tsapi.amap.com/v1/track/service/list"; 10 | 11 | public static final String TERMINAL_ADD_URL = "https://tsapi.amap.com/v1/track/terminal/add"; 12 | public static final String TERMINAL_DELETE_URL = "https://tsapi.amap.com/v1/track/terminal/delete"; 13 | public static final String TERMINAL_UPDATE_URL = "https://tsapi.amap.com/v1/track/terminal/update"; 14 | public static final String TERMINAL_LIST_URL = "https://tsapi.amap.com/v1/track/terminal/list"; 15 | 16 | public static final String TERMINAL_SEARCH_URL = "https://tsapi.amap.com/v1/track/terminal/search"; 17 | public static final String TERMINAL_AROUNDSEARCH_URL = "https://tsapi.amap.com/v1/track/terminal/aroundsearch"; 18 | public static final String TERMINAL_POLYGONSEARCH_URL = "https://tsapi.amap.com/v1/track/terminal/polygonsearch"; 19 | public static final String TERMINAL_DISTRICTSEARCH_URL = "https://tsapi.amap.com/v1/track/terminal/districtsearch"; 20 | 21 | public static final String TERMINAL_LASTPOINT_URL = "https://tsapi.amap.com/v1/track/terminal/lastpoint"; 22 | 23 | public static final String TRACE_ADD_URL = "https://tsapi.amap.com/v1/track/trace/add"; 24 | public static final String TRACE_DELETE_URL = "https://tsapi.amap.com/v1/track/trace/delete"; 25 | public static final String TRACE_LIST_URL = "https://tsapi.amap.com/v1/track/trace/list"; 26 | public static final String POINT_UPLOAD_URL = "https://tsapi.amap.com/v1/track/point/upload"; 27 | public static final String TERMINAL_TRSEARCH_URL = "https://tsapi.amap.com/v1/track/terminal/trsearch"; 28 | 29 | public static final String COLUMN_ADD_URL = "https://tsapi.amap.com/v1/track/terminal/column/add"; 30 | public static final String COLUMN_DELETE_URL = "https://tsapi.amap.com/v1/track/terminal/column/delete"; 31 | public static final String COLUMN_UPDATE_URL = "https://tsapi.amap.com/v1/track/terminal/column/update"; 32 | public static final String COLUMN_LIST_URL = "https://tsapi.amap.com/v1/track/terminal/column/list"; 33 | public static final String TRACE_COLUMN_ADD_URL = "https://tsapi.amap.com/v1/track/point/column/add"; 34 | public static final String TRACE_COLUMN_DELETE_URL = "https://tsapi.amap.com/v1/track/point/column/delete"; 35 | 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/com/github/amap/track/Point.java: -------------------------------------------------------------------------------- 1 | package com.github.amap.track; 2 | 3 | import java.io.Serializable; 4 | import java.math.BigDecimal; 5 | import java.util.HashMap; 6 | import java.util.Map; 7 | 8 | import com.github.amap.track.util.JsonUtil; 9 | 10 | public class Point implements Serializable { 11 | private static final long serialVersionUID = -5097501594512162140L; 12 | private double x; 13 | private double y; 14 | private Long locatetime; 15 | //附加信息 16 | private final Map props = new HashMap<>(); 17 | 18 | public Point( ) { 19 | 20 | } 21 | 22 | public Point(double x, double y, Long locatetime) { 23 | this.x = x; 24 | this.y = y; 25 | this.locatetime = locatetime; 26 | } 27 | public Point(double x, double y, Long locatetime, Map props) { 28 | this.x = x; 29 | this.y = y; 30 | this.locatetime = locatetime; 31 | setProps(props); 32 | } 33 | 34 | // 剩下的速度这些属相暂时不实现 35 | public double getX() { 36 | return x; 37 | } 38 | 39 | public void setX(double x) { 40 | this.x = x; 41 | } 42 | 43 | public double getY() { 44 | return y; 45 | } 46 | 47 | public void setY(double y) { 48 | this.y = y; 49 | } 50 | 51 | public long getLocatetime() { 52 | return locatetime; 53 | } 54 | 55 | public void setLocatetime(Long locatetime) { 56 | this.locatetime = locatetime; 57 | } 58 | 59 | public String getXY() { 60 | BigDecimal bx = new BigDecimal(x); 61 | BigDecimal by = new BigDecimal(y); 62 | return bx.setScale(6, BigDecimal.ROUND_HALF_UP).toString() + "," 63 | + by.setScale(6, BigDecimal.ROUND_HALF_UP).toString(); 64 | } 65 | 66 | public void setXY(String string) { 67 | String[] split = string.split(","); 68 | x = Double.parseDouble(split[0]); 69 | y = Double.parseDouble(split[1]); 70 | } 71 | 72 | 73 | public Map getProps() { 74 | return props; 75 | } 76 | 77 | public void setProps(Map props) { 78 | synchronized (this) { 79 | this.props.clear(); 80 | if(props!=null) { 81 | props.forEach((k, v)->{ 82 | this.props.put(k, v); 83 | }); 84 | } 85 | } 86 | } 87 | 88 | public String toJSON() { 89 | Map object = new HashMap<>(); 90 | object.put("location", getXY()); 91 | object.put("locatetime", getLocatetime()); 92 | object.put("props", JsonUtil.toJson(props)); 93 | 94 | return JsonUtil.toJson(object); 95 | } 96 | 97 | @Override 98 | public String toString() { 99 | return "Point [x=" + x + ", y=" + y + ", locatetime=" + locatetime + ", props=" + props + "]"; 100 | } 101 | 102 | 103 | } 104 | -------------------------------------------------------------------------------- /src/test/java/com/github/amap/track/AMapTrackClientTest.java: -------------------------------------------------------------------------------- 1 | package com.github.amap.track; 2 | 3 | import java.text.SimpleDateFormat; 4 | import java.util.List; 5 | 6 | import org.junit.Test; 7 | 8 | public class AMapTrackClientTest { 9 | public static String key = "faa9506acbe20b4397ef7230959a7475"; 10 | 11 | @Test 12 | public void testCreateService() { 13 | AMapTrackClient client = new AMapTrackClient(key); 14 | Service service = client.createService("testservice", "thisistestservice"); 15 | System.out.println("servie已经新建:" + service); 16 | } 17 | 18 | @Test 19 | public void testGetService() { 20 | AMapTrackClient client = new AMapTrackClient(key); 21 | Service service = client.getService(null, "testservice"); 22 | System.out.println("servie已经获取:" + service); 23 | } 24 | 25 | @Test 26 | public void testDeleteService() { 27 | AMapTrackClient client = new AMapTrackClient(key); 28 | Service service = client.getService(null, "testservice"); 29 | service.delete(); 30 | System.out.println("servie已经删除:" + service); 31 | } 32 | 33 | @Test 34 | public void testListService() { 35 | AMapTrackClient client = new AMapTrackClient(key); 36 | List listService = client.listService(); 37 | for (Service service2 : listService) { 38 | System.out.println("servie:" + service2); 39 | } 40 | } 41 | 42 | public static void main(String[] args) throws Exception{ 43 | AMapTrackClient client = new AMapTrackClient(key); 44 | Service service = client.getService(null, "testservice"); 45 | Terminal terminal = service.listTerminal("wangyao"); 46 | System.out.println(terminal); 47 | Trace trace = terminal.createDefaultTrace(); 48 | System.out.println(trace); 49 | 50 | SimpleDateFormat format2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 51 | 52 | /*trace.uploadPoint(new Point(114.81287273562437, 38.07960082833725, format2.parse("2019-02-14 20:19:50").getTime())); 53 | trace.uploadPoint(new Point(114.79585450331517, 38.08354028790167, format2.parse("2019-02-14 20:35:04").getTime())); 54 | trace.uploadPoint(new Point(114.81235877024601, 38.026622851352776, format2.parse("2019-02-14 20:50:14").getTime())); 55 | trace.uploadPoint(new Point(114.82123160138842, 38.00700509894373, format2.parse("2019-02-14 21:05:23").getTime())); 56 | trace.uploadPoint(new Point(114.81182582715873, 37.973364452373204, format2.parse("2019-02-14 21:21:06").getTime())); 57 | trace.uploadPoint(new Point(114.79856042890127, 37.97460471857192, format2.parse("2019-02-14 21:37:29").getTime()));*/ 58 | 59 | List points = trace.trsearch(null, null, true, 10000, 1, 990).getPoints(); 60 | String path = "var path = ["; 61 | String path2 = "var path2 = ["; 62 | for (Point point : points) { 63 | path += "["+point.getXY()+"],"; 64 | } 65 | path = path.substring(0, path.length()-1)+"]"; 66 | points = trace.trsearch(null, null, true, 50, 1, 990).getPoints(); 67 | for (Point point : points) { 68 | path2 += "["+point.getXY()+"],"; 69 | } 70 | path2 = path2.substring(0, path2.length()-1)+"]"; 71 | 72 | System.out.println(path); 73 | System.out.println(path2); 74 | } 75 | 76 | } 77 | 78 | 79 | 80 | 81 | -------------------------------------------------------------------------------- /src/main/java/com/github/amap/track/util/HttpUtil.java: -------------------------------------------------------------------------------- 1 | package com.github.amap.track.util; 2 | 3 | import java.io.IOException; 4 | import java.io.UnsupportedEncodingException; 5 | import java.net.URISyntaxException; 6 | import java.util.ArrayList; 7 | import java.util.List; 8 | import java.util.Map; 9 | 10 | import org.apache.http.HttpEntity; 11 | import org.apache.http.NameValuePair; 12 | import org.apache.http.client.entity.UrlEncodedFormEntity; 13 | import org.apache.http.client.methods.CloseableHttpResponse; 14 | import org.apache.http.client.methods.HttpGet; 15 | import org.apache.http.client.methods.HttpPost; 16 | import org.apache.http.client.methods.HttpRequestBase; 17 | import org.apache.http.client.utils.HttpClientUtils; 18 | import org.apache.http.client.utils.URIBuilder; 19 | import org.apache.http.impl.client.CloseableHttpClient; 20 | import org.apache.http.impl.client.HttpClients; 21 | import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; 22 | import org.apache.http.message.BasicNameValuePair; 23 | import org.apache.http.util.EntityUtils; 24 | 25 | /** 26 | * HTTP请求辅助类 27 | * 28 | * 29 | */ 30 | @SuppressWarnings("unused") 31 | public abstract class HttpUtil { 32 | 33 | /** 34 | * HTTP连接池 35 | */ 36 | private static PoolingHttpClientConnectionManager pool; 37 | 38 | /** 39 | * 连接池最大连接数 40 | */ 41 | private static final int MAX_TOTAL = 50; 42 | 43 | /** 44 | * 连接池默认路由连接总数 45 | */ 46 | private static final int DEFAULT_MAX_PER_ROUTE = 5; 47 | 48 | /** 49 | * 字符集编码 50 | */ 51 | private static final String CHARSET = "UTF-8"; 52 | 53 | /** 54 | * 初始化数据 55 | */ 56 | static { 57 | pool = new PoolingHttpClientConnectionManager(); 58 | pool.setMaxTotal(MAX_TOTAL); 59 | pool.setDefaultMaxPerRoute(DEFAULT_MAX_PER_ROUTE); 60 | } 61 | 62 | /** 63 | * 通过连接池获取HttpClient 64 | * 65 | * @return HttpClient 66 | */ 67 | private static CloseableHttpClient getHttpClient() { 68 | return HttpClients.custom().setConnectionManager(pool).build(); 69 | } 70 | 71 | /** 72 | * GET请求 73 | * 74 | * @param url 地址 75 | * @return 结果 76 | */ 77 | public static String get(String url) { 78 | return getResult(new HttpGet(url)); 79 | } 80 | 81 | /** 82 | * GET请求 83 | * 84 | * @param url 地址 85 | * @param params 参数 86 | * @return 结果 87 | */ 88 | public static String get(String url, Map params) { 89 | String result = null; 90 | try { 91 | URIBuilder ub = new URIBuilder(); 92 | ub.setPath(url); 93 | List pairs = covertParamsToNVPS(params); 94 | if (pairs != null && pairs.size() > 0) { 95 | ub.setParameters(pairs); 96 | } 97 | result = getResult(new HttpGet(ub.build())); 98 | } catch (URISyntaxException e) { 99 | throw new RuntimeException("", e); 100 | } 101 | return result; 102 | } 103 | 104 | /** 105 | * GET请求 106 | * 107 | * @param url 地址 108 | * @param headers 请求头 109 | * @param params 参数 110 | * @return 结果 111 | */ 112 | public static String get(String url, Map headers, Map params) { 113 | String result = null; 114 | try { 115 | URIBuilder ub = new URIBuilder(); 116 | ub.setPath(url); 117 | List pairs = covertParamsToNVPS(params); 118 | if (pairs != null && pairs.size() > 0) { 119 | ub.setParameters(pairs); 120 | } 121 | HttpGet httpGet = new HttpGet(ub.build()); 122 | if (headers != null && headers.size() > 0) { 123 | for (Object key : headers.keySet()) { 124 | httpGet.addHeader(String.valueOf(key), String.valueOf(headers.get(key))); 125 | } 126 | } 127 | result = getResult(httpGet); 128 | } catch (URISyntaxException e) { 129 | throw new RuntimeException("", e); 130 | } 131 | return result; 132 | } 133 | 134 | /** 135 | * POST请求 136 | * 137 | * @param url 地址 138 | * @return 结果 139 | */ 140 | public static String post(String url) { 141 | return getResult(new HttpPost(url)); 142 | } 143 | 144 | /** 145 | * POST请求 146 | * 147 | * @param url 地址 148 | * @param params 参数 149 | * @return 结果 150 | */ 151 | public static String post(String url, Map params) { 152 | String result = null; 153 | try { 154 | HttpPost httpPost = new HttpPost(url); 155 | List pairs = covertParamsToNVPS(params); 156 | httpPost.setEntity(new UrlEncodedFormEntity(pairs, CHARSET)); 157 | result = getResult(httpPost); 158 | } catch (UnsupportedEncodingException e) { 159 | throw new RuntimeException("", e); 160 | } 161 | return result; 162 | } 163 | 164 | /** 165 | * POST请求 166 | * 167 | * @param url 地址 168 | * @param headers 请求头 169 | * @param params 参数 170 | * @return 结果 171 | */ 172 | public static String post(String url, Map headers, Map params) { 173 | String result = null; 174 | try { 175 | HttpPost httpPost = new HttpPost(url); 176 | if (headers != null && headers.size() > 0) { 177 | for (Object key : headers.keySet()) { 178 | httpPost.addHeader(String.valueOf(key), String.valueOf(headers.get(key))); 179 | } 180 | } 181 | List pairs = covertParamsToNVPS(params); 182 | httpPost.setEntity(new UrlEncodedFormEntity(pairs, CHARSET)); 183 | result = getResult(httpPost); 184 | } catch (UnsupportedEncodingException e) { 185 | throw new RuntimeException("", e); 186 | } 187 | return result; 188 | } 189 | 190 | /** 191 | * 将参数转换为NVP 192 | * 193 | * @param params 参数 194 | * @return NVP集合 195 | */ 196 | private static List covertParamsToNVPS(Map params) { 197 | List pairs = null; 198 | if (params != null && params.size() > 0) { 199 | pairs = new ArrayList(); 200 | for (Object key : params.keySet()) { 201 | pairs.add(new BasicNameValuePair(String.valueOf(key), String.valueOf(params.get(key)))); 202 | } 203 | } 204 | return pairs; 205 | } 206 | 207 | /** 208 | * 处理HTTP请求 209 | * 210 | * @param request 请求对象 211 | * @return 响应结果 212 | */ 213 | private static String getResult(HttpRequestBase request) { 214 | String result = null; 215 | CloseableHttpClient httpClient = null; 216 | CloseableHttpResponse response = null; 217 | try { 218 | httpClient = HttpClients.createDefault(); 219 | // CloseableHttpClient httpClient = getHttpClient(); 220 | response = httpClient.execute(request); 221 | // int status = response.getStatusLine().getStatusCode(); 222 | HttpEntity entity = response.getEntity(); 223 | if (entity != null) { 224 | // long length = entity.getContentLength();// -1 表示长度未知 225 | result = EntityUtils.toString(entity); 226 | } 227 | } catch (IOException e) { 228 | throw new RuntimeException("", e); 229 | } finally { 230 | HttpClientUtils.closeQuietly(response); 231 | HttpClientUtils.closeQuietly(httpClient); 232 | } 233 | return result; 234 | } 235 | 236 | } 237 | -------------------------------------------------------------------------------- /src/main/java/com/github/amap/track/Trace.java: -------------------------------------------------------------------------------- 1 | package com.github.amap.track; 2 | 3 | import java.io.Serializable; 4 | import java.util.ArrayList; 5 | import java.util.List; 6 | import java.util.Map; 7 | import java.util.Optional; 8 | 9 | import com.github.amap.track.util.JsonUtil; 10 | 11 | /** 12 | * 表示猎鹰服务中一个轨迹,可以查询和添加点 13 | * 14 | * @author wy 15 | * 16 | */ 17 | public class Trace extends BaseOpr implements Serializable { 18 | 19 | private static final long serialVersionUID = 2624978752323824201L; 20 | 21 | protected Terminal terminal; 22 | // 高德服务提交了否 23 | private volatile boolean commited = false; 24 | 25 | private Integer trid; 26 | private volatile boolean defaultTrace = false; 27 | 28 | void add() { 29 | Map queryMap = terminal.getBaseParams(); 30 | 31 | String result = postForm(Const.TRACE_ADD_URL, queryMap); 32 | Map resultMap = JsonUtil.toObject(result, Map.class); 33 | 34 | if (resultMap != null && "OK".equals((String) resultMap.get("errmsg"))) { 35 | setTrid((Integer) ((Map) resultMap.get("data")).get("trid")); 36 | setCommited(true); 37 | } else { 38 | throw new AMapTrackException("添加轨迹失败: " + result); 39 | } 40 | 41 | } 42 | 43 | /** 44 | * 对应高德API https://lbs.amap.com/api/track/lieying-kaifa/api/track#t4 删除该轨迹 45 | */ 46 | public void delete() { 47 | Map queryMap = terminal.getBaseParams(); 48 | queryMap.put("trid", trid); 49 | 50 | String result = postForm(Const.TRACE_DELETE_URL, queryMap); 51 | Map resultMap = JsonUtil.toObject(result, Map.class); 52 | 53 | if (resultMap != null && "OK".equals((String) resultMap.get("errmsg"))) { 54 | trid = null; 55 | setCommited(false); 56 | // 如果是默认轨迹则要删除 57 | if (defaultTrace) { 58 | Map props = terminal.getProps(); 59 | props.put("defaultTrid", ""); 60 | props.put("lastPointTime", ""); 61 | terminal.update(terminal.getName(), terminal.getDesc(), props); 62 | defaultTrace = false; 63 | } 64 | } else { 65 | throw new AMapTrackException("删除轨迹失败: " + result); 66 | } 67 | } 68 | 69 | /** 70 | * 给轨迹添加一个点 71 | * 72 | * @param p 73 | */ 74 | public void uploadPoint(Point p) { 75 | List ps = new ArrayList<>(1); 76 | ps.add(p); 77 | uploadPoints(ps); 78 | } 79 | 80 | /** 81 | * 给轨迹添加一组点 82 | * 83 | * @param p 84 | */ 85 | public void uploadPoints(List ps) { 86 | Map queryMap = getBaseParams(); 87 | queryMap.put("points", toJSON(ps)); 88 | String result = postForm(Const.POINT_UPLOAD_URL, queryMap); 89 | Map resultMap = JsonUtil.toObject(result, Map.class); 90 | 91 | if (resultMap != null && "OK".equals((String) resultMap.get("errmsg"))) { 92 | setCommited(true); 93 | } else { 94 | throw new AMapTrackException("添加轨迹点失败: " + result); 95 | } 96 | } 97 | 98 | private String toJSON(List ps) { 99 | StringBuilder sb = new StringBuilder(); 100 | sb.append("["); 101 | if (ps != null && ps.size() > 0) { 102 | for (Point point : ps) { 103 | sb.append(point.toJSON()).append(","); 104 | } 105 | sb.deleteCharAt(sb.length() - 1); 106 | } 107 | sb.append("]"); 108 | return sb.toString(); 109 | } 110 | 111 | /** 112 | * 对应高德API https://lbs.amap.com/api/track/lieying-kaifa/api/grasproad 返回 113 | * 纠偏或者补充后的点 114 | * 115 | * 116 | * @param starttime 可为空 117 | * @param endtime 可为空 118 | * @param recoup 可为空 表示是否填充距离大于gap的点 119 | * @param gap 定义两点之间需要补点的最小距离 50<= gap <=10000 单位m 120 | * @param page 查询第几页 121 | * @param pagesize 每页数据条数 122 | * @return Points 123 | */ 124 | public Points trsearch(Long starttime, Long endtime, Boolean recoup, Integer gap, Integer page, Integer pagesize) { 125 | Map queryMap = getBaseParams(); 126 | if (starttime != null) 127 | queryMap.put("starttime", starttime); 128 | if (endtime != null) 129 | queryMap.put("endtime", endtime); 130 | if (page != null) 131 | queryMap.put("page", page); 132 | if (pagesize != null) 133 | queryMap.put("pagesize", pagesize); 134 | if (gap != null) 135 | queryMap.put("gap", gap); 136 | if (recoup != null && recoup) 137 | queryMap.put("recoup", 1); 138 | 139 | String result = get(Const.TERMINAL_TRSEARCH_URL, queryMap); 140 | Map resultMap = JsonUtil.toObject(result, Map.class); 141 | if (resultMap == null || !"OK".equals((String) resultMap.get("errmsg"))) { 142 | throw new AMapTrackException("获取轨迹失败: " + result); 143 | } 144 | 145 | if (resultMap.get("data") == null) { 146 | return null; 147 | } 148 | 149 | Integer count = (Integer) ((Map) resultMap.get("data")).get("counts"); 150 | List tracks = (List) ((Map) resultMap.get("data")).get("tracks"); 151 | 152 | if (tracks == null || tracks.size() == 0) 153 | return null; 154 | Map sMap = (Map) tracks.get(0); 155 | 156 | Points ss = new Points(); 157 | ss.setTrace(this); 158 | ss.setDistance((Integer) sMap.get("distance")); 159 | 160 | if (sMap.get("time") instanceof Integer) { 161 | int a = (Integer) sMap.get("time"); 162 | ss.setTime(Long.parseLong(a+"")); 163 | } 164 | if (sMap.get("time") instanceof Long) { 165 | ss.setTime((Long) sMap.get("time")); 166 | } 167 | List pos = extractPoints(sMap); 168 | ss.setPoints(pos); 169 | return ss; 170 | } 171 | 172 | private List extractPoints(Map sMap) { 173 | List pos = new ArrayList<>(); 174 | List points = (List) sMap.get("points"); 175 | for (Object object : points) { 176 | Map mp = (Map) object; 177 | if (mp == null) 178 | continue; 179 | Point e = new Point(); 180 | e.setLocatetime((Long) Optional.ofNullable(mp.get("locatetime")).orElse(0L)); 181 | e.setXY((String) mp.get("location")); 182 | Object object2 = mp.get("props"); 183 | 184 | try { 185 | e.setProps((Map) JsonUtil.toObject(mp.get("props").toString(), Map.class)); 186 | } catch (Exception e1) { 187 | e.setProps(null); 188 | } 189 | pos.add(e); 190 | } 191 | return pos; 192 | } 193 | 194 | public Points createPointOpr() { 195 | Points p = new Points(); 196 | p.setTrace(this); 197 | return p; 198 | } 199 | 200 | public boolean isCommited() { 201 | return commited; 202 | } 203 | 204 | void setCommited(boolean commited) { 205 | this.commited = commited; 206 | } 207 | 208 | public Integer getTrid() { 209 | return trid; 210 | } 211 | 212 | void setTrid(Integer trid) { 213 | this.trid = trid; 214 | } 215 | 216 | public Terminal getTerminal() { 217 | return terminal; 218 | } 219 | 220 | void setTerminal(Terminal terminal) { 221 | this.terminal = terminal; 222 | } 223 | 224 | public Map getBaseParams() { 225 | Map baseParams = terminal.getBaseParams(); 226 | baseParams.put("trid", trid); 227 | return baseParams; 228 | } 229 | 230 | public boolean isDefaultTrace() { 231 | return defaultTrace; 232 | } 233 | 234 | void setDefaultTrace(boolean defaultTrace) { 235 | this.defaultTrace = defaultTrace; 236 | } 237 | 238 | @Override 239 | public String toString() { 240 | return "Trace [terminal=" + terminal + ", trid=" + trid + ", defaultTrace=" + defaultTrace + "]"; 241 | } 242 | } 243 | -------------------------------------------------------------------------------- /src/main/java/com/github/amap/track/Terminal.java: -------------------------------------------------------------------------------- 1 | package com.github.amap.track; 2 | 3 | import java.io.Serializable; 4 | import java.util.ArrayList; 5 | import java.util.HashMap; 6 | import java.util.List; 7 | import java.util.Map; 8 | 9 | import com.github.amap.track.util.JsonUtil; 10 | 11 | /** 12 | * 猎鹰服务中的终端,终端可以新建轨迹 13 | * 14 | * @author wy 15 | * 16 | */ 17 | public class Terminal extends BaseOpr implements Serializable { 18 | 19 | private static final long serialVersionUID = -7427564709023099668L; 20 | public static final String DEFAULT_TRID_KEY = "defaultTrid"; 21 | 22 | protected Service service; 23 | // 高德服务提交了否 24 | private volatile boolean commited = false; 25 | 26 | private Integer tid; 27 | private String name; 28 | private String desc; 29 | private final Map props = new HashMap<>(); 30 | 31 | private long createtime; 32 | private long locatetime; 33 | 34 | void add(String name, String desc, Map props) { 35 | Map queryMap = service.getBaseParams(); 36 | queryMap.put("name", name); 37 | queryMap.put("desc", desc); 38 | if (props != null) 39 | queryMap.put("props", JsonUtil.toJson(props)); 40 | 41 | String result = postForm(Const.TERMINAL_ADD_URL, queryMap); 42 | Map resultMap = JsonUtil.toObject(result, Map.class); 43 | 44 | if (resultMap != null && "OK".equals((String) resultMap.get("errmsg"))) { 45 | setTid((Integer) ((Map) resultMap.get("data")).get("tid")); 46 | setName(name); 47 | setDesc(desc); 48 | setProps(props); 49 | setCommited(true); 50 | } else { 51 | throw new AMapTrackException("添加终端失败: " + result); 52 | } 53 | 54 | } 55 | 56 | /** 57 | * 对应高德API https://lbs.amap.com/api/track/lieying-kaifa/api/track#t4 58 | * 59 | * 删除该终端 60 | */ 61 | public void delete() { 62 | Map queryMap = service.getBaseParams(); 63 | queryMap.put("tid", tid); 64 | 65 | String result = postForm(Const.TERMINAL_DELETE_URL, queryMap); 66 | Map resultMap = JsonUtil.toObject(result, Map.class); 67 | 68 | if (resultMap != null && "OK".equals((String) resultMap.get("errmsg"))) { 69 | tid = null; 70 | setCommited(false); 71 | } else { 72 | throw new AMapTrackException("删除终端失败: " + result); 73 | } 74 | } 75 | 76 | /** 77 | * 修改终端信息 78 | * 79 | * @param name 名称 80 | * @param desc 描述 81 | * @param props 属性,必须先要添加属性才能使用 82 | */ 83 | public void update(String name, String desc, Map props) { 84 | Map queryMap = service.getBaseParams(); 85 | queryMap.put("tid", tid); 86 | if (name != null) 87 | queryMap.put("name", name); 88 | if (desc != null) 89 | queryMap.put("desc", desc); 90 | if (props == null || props.size() == 0) { 91 | } else { 92 | queryMap.put("props", JsonUtil.toJson(props)); 93 | } 94 | 95 | String result = postForm(Const.TERMINAL_UPDATE_URL, queryMap); 96 | Map resultMap = JsonUtil.toObject(result, Map.class); 97 | 98 | if (resultMap != null && "OK".equals((String) resultMap.get("errmsg"))) { 99 | setName(name); 100 | setDesc(desc); 101 | setProps(props); 102 | setCommited(true); 103 | } else { 104 | throw new AMapTrackException("修改终端失败: " + result); 105 | } 106 | } 107 | 108 | Terminal list(String name) { 109 | List list = list(null, name, null); 110 | if (list != null && list.size() > 0) { 111 | return list.get(0); 112 | } else { 113 | return null; 114 | } 115 | } 116 | 117 | Terminal list(Integer tid) { 118 | List lists = list(tid, null, null); 119 | if (lists != null && lists.size() > 0) { 120 | return lists.get(0); 121 | } else { 122 | return null; 123 | } 124 | } 125 | 126 | List list(Integer tid, String name, Integer page) { 127 | Map queryMap = service.getBaseParams(); 128 | if (tid != null) 129 | queryMap.put("tid", tid); 130 | if (name != null) 131 | queryMap.put("name", name); 132 | if (page != null) 133 | queryMap.put("page", page); 134 | 135 | String result = get(Const.TERMINAL_LIST_URL, queryMap); 136 | Map resultMap = JsonUtil.toObject(result, Map.class); 137 | 138 | if (resultMap != null && "OK".equals((String) resultMap.get("errmsg"))) { 139 | if (resultMap.get("data") == null) { 140 | return new ArrayList<>(0); 141 | } 142 | 143 | Integer count = (Integer) ((Map) resultMap.get("data")).get("count"); 144 | List list = (List) ((Map) resultMap.get("data")).get("results"); 145 | List results = new ArrayList<>(count); 146 | if (list == null) 147 | return results; 148 | for (Object obj : list) { 149 | Map sMap = (Map) obj; 150 | Terminal ss = new Terminal(); 151 | ss.setService(this.getService()); 152 | ss.setName((String) sMap.get("name")); 153 | ss.setTid((Integer) sMap.get("tid")); 154 | ss.setDesc((String) sMap.get("desc")); 155 | ss.setCreatetime(Long.parseLong(sMap.get("createtime").toString())); 156 | ss.setLocatetime(Long.parseLong(sMap.get("locatetime").toString())); 157 | fillProps(sMap, ss); 158 | ss.setCommited(true); 159 | results.add(ss); 160 | } 161 | return results; 162 | } else { 163 | throw new AMapTrackException("查询终端失败: " + result); 164 | } 165 | } 166 | 167 | private void fillProps(Map sMap, Terminal ss) { 168 | if (sMap.get("props") == null) { 169 | ss.setProps(new HashMap<>()); 170 | } else { 171 | Map props = (Map) sMap.get("props"); 172 | ss.setProps(props); 173 | } 174 | } 175 | 176 | /** 177 | * 为此终端新建一个轨迹 178 | * 179 | * @return 180 | */ 181 | public Trace createTrace() { 182 | Trace trace = new Trace(); 183 | trace.setTerminal(this); 184 | trace.add(); 185 | return trace; 186 | } 187 | 188 | /** 189 | * 创建默认轨迹,就是把新建的轨迹trid存入到Terminal的属性中 190 | * 191 | * @return 192 | */ 193 | public Trace createDefaultTrace() { 194 | String string = props.get("defaultTrid"); 195 | if (string != null && !string.isEmpty()) { 196 | try { 197 | Trace defaultTrace2 = defaultTrace(); 198 | return defaultTrace2; 199 | } catch (AMapTrackException e) { 200 | 201 | } 202 | } 203 | 204 | Trace defaultTrace = createTrace(); 205 | props.put("defaultTrid", defaultTrace.getTrid() + ""); 206 | this.update(name, desc, props); 207 | defaultTrace.setDefaultTrace(true); 208 | return defaultTrace; 209 | } 210 | 211 | /** 212 | * 获取默认轨迹 213 | * 214 | * @return 215 | */ 216 | public Trace defaultTrace() { 217 | Trace trace = new Trace(); 218 | trace.setTerminal(this); 219 | String string = props!=null?props.get("defaultTrid"):null; 220 | if (string == null || string.trim().length() == 0) { 221 | throw new AMapTrackException("没有找到终端的默认轨迹"); 222 | } 223 | int trid = Integer.parseInt(string); 224 | trace.setTrid(trid); 225 | trace.setDefaultTrace(true); 226 | return trace; 227 | } 228 | 229 | protected Map getBaseParams() { 230 | Map queryMap = service.getBaseParams(); 231 | queryMap.put("tid", tid); 232 | 233 | return queryMap; 234 | } 235 | 236 | public Service getService() { 237 | return service; 238 | } 239 | 240 | void setService(Service service) { 241 | this.service = service; 242 | } 243 | 244 | public boolean isCommited() { 245 | return commited; 246 | } 247 | 248 | void setCommited(boolean commited) { 249 | this.commited = commited; 250 | } 251 | 252 | public String getName() { 253 | return name; 254 | } 255 | 256 | Terminal setName(String name) { 257 | this.name = name; 258 | return this; 259 | } 260 | 261 | public String getDesc() { 262 | return desc; 263 | } 264 | 265 | void setDesc(String desc) { 266 | this.desc = desc; 267 | } 268 | 269 | public Map getProps() { 270 | return props; 271 | } 272 | 273 | public void setProps(Map props) { 274 | synchronized (this) { 275 | this.props.clear(); 276 | if(props!=null) { 277 | props.forEach((k, v)->{ 278 | this.props.put(k, v); 279 | }); 280 | } 281 | } 282 | } 283 | 284 | public Integer getTid() { 285 | return tid; 286 | } 287 | 288 | void setTid(Integer tid) { 289 | this.tid = tid; 290 | } 291 | 292 | public long getCreatetime() { 293 | return createtime; 294 | } 295 | 296 | void setCreatetime(long createtime) { 297 | this.createtime = createtime; 298 | } 299 | 300 | public long getLocatetime() { 301 | return locatetime; 302 | } 303 | 304 | void setLocatetime(long locatetime) { 305 | this.locatetime = locatetime; 306 | } 307 | 308 | @Override 309 | public String toString() { 310 | return "Terminal [tid=" + tid + ", name=" + name + ", desc=" + desc + ", props=" + props + ", createtime=" 311 | + createtime + ", locatetime=" + locatetime + "]"; 312 | } 313 | 314 | } 315 | -------------------------------------------------------------------------------- /src/main/java/com/github/amap/track/Service.java: -------------------------------------------------------------------------------- 1 | package com.github.amap.track; 2 | 3 | import java.io.Serializable; 4 | import java.util.ArrayList; 5 | import java.util.HashMap; 6 | import java.util.List; 7 | import java.util.Map; 8 | 9 | import com.github.amap.track.util.JsonUtil; 10 | 11 | /** 12 | * 表示猎鹰服务中Service,使用此类创建Terminal等 13 | * 14 | * @author wy 15 | * 16 | */ 17 | public class Service extends BaseOpr implements Serializable { 18 | private static final long serialVersionUID = -1139965967915347033L; 19 | private AMapTrackClient client; 20 | 21 | // 高德服务提交了否 22 | private volatile boolean commited = false; 23 | 24 | private Integer sid; 25 | private String name; 26 | private String desc; 27 | 28 | void add() { 29 | Map queryMap = new HashMap<>(); 30 | queryMap.put("key", client.key); 31 | queryMap.put("name", name); 32 | queryMap.put("desc", desc); 33 | 34 | String result = postForm(Const.SERVICE_ADD_URL, queryMap); 35 | Map resultMap = JsonUtil.toObject(result, Map.class); 36 | 37 | if (resultMap != null && "OK".equals((String) resultMap.get("errmsg"))) { 38 | sid = (Integer) ((Map) resultMap.get("data")).get("sid"); 39 | setCommited(true); 40 | } else { 41 | throw new AMapTrackException("添加服务失败: " + result); 42 | } 43 | 44 | } 45 | 46 | /** 47 | * 删除这个service 48 | */ 49 | public void delete() { 50 | Map queryMap = new HashMap<>(); 51 | queryMap.put("key", client.key); 52 | queryMap.put("sid", sid); 53 | 54 | String result = postForm(Const.SERVICE_DELETE_URL, queryMap); 55 | Map resultMap = JsonUtil.toObject(result, Map.class); 56 | 57 | if (resultMap != null && "OK".equals((String) resultMap.get("errmsg"))) { 58 | sid = null; 59 | setCommited(false); 60 | } else { 61 | throw new AMapTrackException("删除服务失败: " + result); 62 | } 63 | } 64 | 65 | /** 66 | * 修改service的信息 67 | * 68 | * @param name 69 | * @param desc 70 | */ 71 | public void update(String name, String desc) { 72 | Map queryMap = new HashMap<>(); 73 | queryMap.put("key", client.key); 74 | queryMap.put("sid", sid); 75 | queryMap.put("name", name); 76 | queryMap.put("desc", desc); 77 | 78 | String result = postForm(Const.SERVICE_UPDATE_URL, queryMap); 79 | Map resultMap = JsonUtil.toObject(result, Map.class); 80 | 81 | if (resultMap != null && "OK".equals((String) resultMap.get("errmsg"))) { 82 | setName(name); 83 | setDesc(desc); 84 | setCommited(true); 85 | } else { 86 | throw new AMapTrackException("修改服务失败: " + result); 87 | } 88 | } 89 | 90 | List list() { 91 | List results = new ArrayList<>(); 92 | Map queryMap = new HashMap<>(); 93 | queryMap.put("key", client.key); 94 | String result = get(Const.SERVICE_LIST_URL, queryMap); 95 | Map resultMap = JsonUtil.toObject(result, Map.class); 96 | 97 | if (resultMap != null && "OK".equals((String) resultMap.get("errmsg"))) { 98 | List list = (List) ((Map) resultMap.get("data")).get("results"); 99 | if (list == null) 100 | return results; 101 | for (Object obj : list) { 102 | Map sMap = (Map) obj; 103 | Service ss = new Service(); 104 | ss.setClient(client); 105 | ss.setSid((Integer) sMap.get("sid")); 106 | ss.setName((String) sMap.get("name")); 107 | ss.setDesc((String) sMap.get("desc")); 108 | ss.setCommited(true); 109 | results.add(ss); 110 | } 111 | return results; 112 | } else { 113 | throw new AMapTrackException("查询服务失败: " + result); 114 | } 115 | } 116 | 117 | /** 118 | * 在此Service下新建一个Terminal 119 | * 120 | * @param name 终端名称 121 | * @param desc 描述 122 | * @param props 属性,需要给终端添加属性才能在这里使用 123 | * @return Terminal 124 | */ 125 | public Terminal createTerminal(String name, String desc, Map props) { 126 | Terminal t = new Terminal(); 127 | t.setService(this); 128 | t.add(name, desc, props); 129 | return t; 130 | } 131 | 132 | /** 133 | * 找到当前Service下的制定tid的终端 134 | * 135 | * @param tid 136 | * @return Terminal 137 | */ 138 | public Terminal listTerminal(Integer tid) { 139 | Terminal t = new Terminal(); 140 | t.setService(this); 141 | return t.list(tid); 142 | } 143 | 144 | /** 145 | * 找到当前Service下制定名称的Terminal 146 | * 147 | * @param name 148 | * @return Terminal 149 | */ 150 | public Terminal listTerminal(String name) { 151 | Terminal t = new Terminal(); 152 | t.setService(this); 153 | return t.list(name); 154 | } 155 | 156 | /** 157 | * 列出当前Service下的Terminal 按照制定条件过滤 158 | * 159 | * @param tid 可为空 160 | * @param name 可为空 161 | * @param page 可为空 162 | * @return List 163 | */ 164 | public List listTerminal(Integer tid, String name, Integer page) { 165 | Terminal t = new Terminal(); 166 | t.setService(this); 167 | return t.list(tid, name, page); 168 | } 169 | 170 | /** 171 | * 为当前服务下的终端添加属性,必须现在此处添加属性,终端的props字段里面才可以加入指定的值 172 | * 173 | * @param column 174 | * @param type 175 | * @param canList 176 | */ 177 | public void addPropsForTerminal(String column, String type, boolean canList) { 178 | Map queryMap = new HashMap<>(); 179 | queryMap.put("key", client.key); 180 | queryMap.put("sid", sid); 181 | queryMap.put("column", column); 182 | queryMap.put("type", type); 183 | queryMap.put("list", canList ? "y" : "n"); 184 | 185 | String result = postForm(Const.COLUMN_ADD_URL, queryMap); 186 | Map resultMap = JsonUtil.toObject(result, Map.class); 187 | 188 | if (resultMap != null && "OK".equals((String) resultMap.get("errmsg"))) { 189 | } else { 190 | // throw new AMapTrackException("添加终端属性失败: " + result); 191 | } 192 | } 193 | 194 | /** 195 | * 删除该服务下的终端属性 196 | * 197 | * @param column 198 | */ 199 | public void delPropsForTerminal(String column) { 200 | Map queryMap = new HashMap<>(); 201 | queryMap.put("key", client.key); 202 | queryMap.put("sid", sid); 203 | queryMap.put("column", column); 204 | 205 | String result = postForm(Const.COLUMN_DELETE_URL, queryMap); 206 | Map resultMap = JsonUtil.toObject(result, Map.class); 207 | 208 | if (resultMap != null && "OK".equals((String) resultMap.get("errmsg"))) { 209 | } else { 210 | throw new AMapTrackException("删除终端属性失败: " + result); 211 | } 212 | } 213 | 214 | /** 215 | * 为当前服务下的终端添加属性,必须现在此处添加属性,终端的props字段里面才可以加入指定的值 216 | * 217 | * @param column 218 | * @param type 219 | * @param canList 220 | */ 221 | public void addPropsForTrace(String column, String type) { 222 | Map queryMap = new HashMap<>(); 223 | queryMap.put("key", client.key); 224 | queryMap.put("sid", sid); 225 | queryMap.put("column", column); 226 | queryMap.put("type", type); 227 | 228 | String result = postForm(Const.TRACE_COLUMN_ADD_URL, queryMap); 229 | Map resultMap = JsonUtil.toObject(result, Map.class); 230 | 231 | if (resultMap != null && "OK".equals((String) resultMap.get("errmsg"))) { 232 | } else { 233 | // throw new AMapTrackException("添加终端属性失败: " + result); 234 | } 235 | } 236 | 237 | /** 238 | * 删除该服务下的终端属性 239 | * 240 | * @param column 241 | */ 242 | public void delPropsForTrace(String column) { 243 | Map queryMap = new HashMap<>(); 244 | queryMap.put("key", client.key); 245 | queryMap.put("sid", sid); 246 | queryMap.put("column", column); 247 | 248 | String result = postForm(Const.TRACE_COLUMN_DELETE_URL, queryMap); 249 | Map resultMap = JsonUtil.toObject(result, Map.class); 250 | 251 | if (resultMap != null && "OK".equals((String) resultMap.get("errmsg"))) { 252 | } else { 253 | throw new AMapTrackException("删除终端属性失败: " + result); 254 | } 255 | } 256 | 257 | /** 258 | * 修改该服务下的终端属性 259 | */ 260 | public void updatePropsForTerminal() { 261 | throw new RuntimeException("为实现的接口"); 262 | } 263 | 264 | /** 265 | * 列出该服务下的终端属性 266 | */ 267 | public void listPropsForTerminal() { 268 | throw new RuntimeException("为实现的接口"); 269 | } 270 | 271 | protected Map getBaseParams() { 272 | Map object = new HashMap<>(); 273 | object.put("key", client.key); 274 | object.put("sid", sid); 275 | 276 | return object; 277 | } 278 | 279 | AMapTrackClient getClient() { 280 | return client; 281 | } 282 | 283 | void setClient(AMapTrackClient client) { 284 | this.client = client; 285 | } 286 | 287 | public Integer getSid() { 288 | return sid; 289 | } 290 | 291 | void setSid(Integer sid) { 292 | this.sid = sid; 293 | } 294 | 295 | public String getName() { 296 | return name; 297 | } 298 | 299 | void setName(String name) { 300 | this.name = name; 301 | } 302 | 303 | public String getDesc() { 304 | return desc; 305 | } 306 | 307 | void setDesc(String desc) { 308 | this.desc = desc; 309 | } 310 | 311 | public boolean isCommited() { 312 | return commited; 313 | } 314 | 315 | void setCommited(boolean commited) { 316 | this.commited = commited; 317 | } 318 | 319 | @Override 320 | public String toString() { 321 | return "Service [sid=" + sid + ", name=" + name + ", desc=" + desc + "]"; 322 | } 323 | 324 | } 325 | --------------------------------------------------------------------------------