一: 添加要素



1 public void create(BoxVo boxVo) throws Exception {
 2     // 创建HTTP客户端
 3     CloseableHttpClient httpclient = HttpClientBuilder.create().setDefaultRequestConfig(ArcGisConstants.REQUEST_CONFIG).build();
 4     // 创建POST请求
 5     HttpPost httpPost = new HttpPost(ArcGisConstants.baseDataUrl + ArcGisConstants.BOX_ADD_FEATURES);
 6     // 查询当前新增的box在ArcGis中是否存在
 7     Map<String, Object> oldFeature = query(boxVo);
 8     if (oldFeature != null && oldFeature.size() > 0) {
 9       LOGGER.info("当前新增的box已经存在, 执行修改操作");
10       update(boxVo);
11       return;
12     }
13     // 运行到这里说明该box在ArcGis中不存在, 执行新增操作
14     // 创建新的空间模型
15     Map<String, Object> geometry = ArcGisUtils.createNewGeometry(boxVo.getLongitude(), boxVo.getLatitude());
16     // 创建新的数据模型
17     Map<String, Object> attributes = ArcGisUtils.createNewBoxAttributes(boxVo, null);
18     // 创建新的容器模型
19     List<Map<String, Object>> features = ArcGisUtils.createNewFeatures(geometry, attributes);
20     // 模型对象转换成json字符串
21     String jsonStr = JsonUtil.jsonObj2Sting(features);
22     // 创建POST请求参数, 必须用NameValuePair
23     List<NameValuePair> params = new ArrayList<>();
24     // 设置传值参数类型为json
25     params.add(new BasicNameValuePair("f", "json"));
26     // 将转换好的字符串添加到参数中
27     params.add(new BasicNameValuePair(ArcGisConstants.FEATURES, jsonStr));
28     // 设置POST请求参数,并将参数格式设置为utf-8
29     HttpEntity entity = new UrlEncodedFormEntity(params, ArcGisConstants.DEFAULT_CHARSET);
30     httpPost.setEntity(entity);
31     // 发送请求
32     HttpResponse response = httpclient.execute(httpPost);
33     // 处理结果集
34     if (response.getStatusLine().getStatusCode() == 200) {
35       // 调用EntityUtils.toString方法最后会自动把inputStream close掉的
36       String str = EntityUtils.toString(response.getEntity());
37       LOGGER.info("ArcGis添加box: box: " + jsonStr + " 结果: " + str);
38       // 释放资源
39       httpclient.close();
40     } else {
41       throw new RuntimeException("ArcGis添加box失败");
42     }
43   }



二: 更改要素



1 public void update(BoxVo boxVo) throws Exception {
 2     // 创建HTTP客户端
 3     CloseableHttpClient httpclient = HttpClientBuilder.create().setDefaultRequestConfig(ArcGisConstants.REQUEST_CONFIG).build();
 4     // 创建post请求
 5     HttpPost httpPost = new HttpPost(ArcGisConstants.baseDataUrl + ArcGisConstants.BOX_UPDATE_FEATURES);
 6     // 查询当前被修改的box在ArcGis中是否存在
 7     Map<String, Object> oldFeature = query(boxVo);
 8     if (oldFeature != null && oldFeature.size() > 0) {
 9       // 得到feature里面的attributes
10       Map<String, Object> oldAttributes = (Map<String, Object>) oldFeature.get(ArcGisConstants.ATTRIBUTES);
11       // 得到attributes里面的objectid
12       Integer objectid = (Integer) oldAttributes.get(ArcGisConstants.OBJECT_ID);
13       if (objectid != null && objectid != 0) {
14         // 创建新的空间模型
15         Map<String, Object> newGeometry = ArcGisUtils.createNewGeometry(boxVo.getLongitude(), boxVo.getLatitude());
16         // 创建新的数据模型
17         Map<String, Object> newAttributes = ArcGisUtils.createNewBoxAttributes(boxVo, objectid);
18         // 创建新的容器模型
19         List<Map<String, Object>> newFeatures = ArcGisUtils.createNewFeatures(newGeometry, newAttributes);
20         // 将模型对象转换成json字符串
21         String jsonStr = JsonUtil.jsonObj2Sting(newFeatures);
22         // 创建POST请求参数, 必须用NameValuePair
23         List<NameValuePair> params = new ArrayList<>();
24         // 设置传值参数类型为json
25         params.add(new BasicNameValuePair("f", "json"));
26         // 将转换好的字符串添加到参数中
27         params.add(new BasicNameValuePair(ArcGisConstants.FEATURES, jsonStr));
28         // 设置POST请求参数,并将参数格式设置为utf-8
29         HttpEntity entity = new UrlEncodedFormEntity(params, ArcGisConstants.DEFAULT_CHARSET);
30         httpPost.setEntity(entity);
31         // 发送请求
32         HttpResponse response = httpclient.execute(httpPost);
33         // 处理结果集
34         if (response.getStatusLine().getStatusCode() == 200) {
35           // 调用EntityUtils.toString方法最后会自动把inputStream close掉的
36           EntityUtils.toString(response.getEntity());
37           LOGGER.info("ArcGis更改box: mapid = " + boxVo.getMapId());
38           // 释放资源
39           httpclient.close();
40         } else {
41           throw new RuntimeException("ArcGis更改box失败");
42         }
43       } else {
44         create(boxVo);
45       }
46     } else {
47       // 如果查出来的结果为null,则将该box添加到arcGis中图层
48       create(boxVo);
49     }
50   }



三: 删除要素



1   public void delete(List<BoxVo> boxVos) throws Exception {
 2     // 创建HTTP客户端
 3     CloseableHttpClient httpclient = HttpClientBuilder.create().setDefaultRequestConfig(ArcGisConstants.REQUEST_CONFIG).build();
 4     // 创建POST请求
 5     HttpPost httpPost = new HttpPost(ArcGisConstants.baseDataUrl + ArcGisConstants.BOX_DELETE_FEATURES);
 6     // 处理请求参数
 7     StringBuffer deleteWhere = new StringBuffer();
 8     // 拼装条件, 按照mapIds进行批量删除
 9     deleteWhere.append("mapid in (");
10     if (boxVos != null && boxVos.size() > 0) {
11       for (int i = 0; i <= boxVos.size() - 1; i++) {
12         deleteWhere.append("'");
13         deleteWhere.append(boxVos.get(i).getMapId());
14         deleteWhere.append("'");
15         if (i != boxVos.size() - 1) {
16           deleteWhere.append(",");
17         }
18       }
19     }
20     deleteWhere.append(")");
21     // 创建POST请求参数, 必须用NameValuePair
22     List<NameValuePair> params = new ArrayList<>();
23     // 设置传值参数类型为json
24     params.add(new BasicNameValuePair("f", "json"));
25     // 将拼装好的条件添加到参数中
26     params.add(new BasicNameValuePair("where", deleteWhere.toString()));
27     // 设置POST请求参数,并将参数格式设置为utf-8
28     HttpEntity entity = new UrlEncodedFormEntity(params, ArcGisConstants.DEFAULT_CHARSET);
29     httpPost.setEntity(entity);
30     // 发送请求
31     HttpResponse response = httpclient.execute(httpPost);
32     if (response.getStatusLine().getStatusCode() == 200) {
33       // 调用EntityUtils.toString方法最后会自动把inputStream close掉的
34       EntityUtils.toString(response.getEntity());
35       LOGGER.info("ArcGis批量删除box: " + deleteWhere.toString());
36       // 释放资源
37       httpclient.close();
38     } else {
39       throw new RuntimeException("ArcGis删除box失败");
40     }
41   }



 四: 查询要素



1   public Map<String, Object> query(BoxVo boxVo) throws Exception {
 2     // 创建HTTP客户端
 3     CloseableHttpClient httpclient = HttpClientBuilder.create().setDefaultRequestConfig(ArcGisConstants.REQUEST_CONFIG).build();
 4     // 创建POST请求
 5     HttpPost httpPost = new HttpPost(ArcGisConstants.baseDataUrl + ArcGisConstants.BOX_QUERY_FEATURES);
 6     // 处理请求参数
 7     String where = "mapid=" + "'" + boxVo.getMapId() + "'";
 8     // 创建POST请求参数, 必须用NameValuePair
 9     List<NameValuePair> params = new ArrayList<>();
10     // 设置传值参数类型为json
11     params.add(new BasicNameValuePair("f", "json"));
12     // 将拼装好的条件添加到参数中
13     params.add(new BasicNameValuePair("where", where));
14     // 返回所有字段
15     params.add(new BasicNameValuePair("outFields", "*"));
16     //设置http Post请求参数
17     HttpEntity entity = new UrlEncodedFormEntity(params, ArcGisConstants.DEFAULT_CHARSET);
18     httpPost.setEntity(entity);
19     // 发送请求
20     HttpResponse response = httpclient.execute(httpPost);
21     // 处理结果集
22     Map<String, Object> oldFeature = new HashMap<>();
23     if (response.getStatusLine().getStatusCode() == 200) {
24       // 调用EntityUtils.toString方法最后会自动把inputStream close掉的
25       String result = EntityUtils.toString(response.getEntity());
26       LOGGER.info("arcgis查询box: box = " + result);
27       // 将旧的对象从result解析出来,得到objectid
28       Map<String, Object> data = new HashMap<>();
29       data = JsonUtil.jsonString2SimpleObj(result, data.getClass());
30       // 得到旧的features集合
31       List<Map<String, Object>> oldFeatures = (List<Map<String, Object>>) data.get(ArcGisConstants.FEATURES);
32       // 获取第一个数据
33       if (oldFeatures.size() > 0) {
34         oldFeature = oldFeatures.get(0);
35       }
36     }
37     // 释放资源
38     httpclient.close();
39     return oldFeature;
40   }



相关常量类



1 /**
 2  * ArcGis常量类
 3  *
 4  */
 5 @Component()
 6 public class ArcGisConstants implements InitializingBean {
 7   private static final Logger LOG = java.util.logging.Logger.getLogger(ArcGisConstants.class.getName());
 8 
 9   /*
10  * 设置请求参数:
11  *  setConnectionRequestTimeout: 设置从连接池中取连接的超时时间
12  *  setConnectTimeout: 设置连接超时时间
13  *  setSocketTimeout: 设置请求超时时间
14  */
15   public static final RequestConfig REQUEST_CONFIG = RequestConfig.custom().setConnectionRequestTimeout(1000 * 10).setConnectTimeout(1000 * 10).setSocketTimeout(1000 * 10).build();
16 
17   /********** 定义通用常量 **********/
18   public static final String FEATURES = "features";                         // features
19   public static final String GEOMETRY = "geometry";                         // 控件模型
20   public static final String ATTRIBUTES = "attributes";                     // 数据模型
21   public static final String DEFAULT_CHARSET = "UTF-8";                     // 请求的编码格式
22   public static final String DEFAULT_TIME_FORMAT = "yyyy-MM-dd";            // 请求的编码格式
23   public static final String BOX = "box";                                   // 配电箱
24 
25   /********** 定义通用字段 **********/
26   public static final String BOX_ADD_FEATURES = "/0/addFeatures";           // 添加box的url
27   public static final String BOX_UPDATE_FEATURES = "/0/updateFeatures";     // 更改box的url
28   public static final String BOX_DELETE_FEATURES = "/0/deleteFeatures";     // 删除box的url
29   public static final String BOX_QUERY_FEATURES = "/0/query";               // 查询box的url
30   public static final String OBJECT_ID = "objectid";                        // objectid 主要用于图层要素的更新操作
31   public static final String BOX_NAME = "boxname";                         // box名称
32   public static final String BOX_NO = "boxno";                             // box编号
33   public static final String CREATE_TIME = "createtime";                    // 要素创建时间
34   public static final String ADDRESS = "address";                           // 安装地址
35   public static final String PHOTO = "photo";                               // 照片路径
36   public static final String LON = "x";                                     // 经度
37   public static final String LAT = "y";                                     // 纬度
38 
39 
40   /********** 根据租户信息获取到的ArcGis数据图层url, 赋值到baseDataUrl **********/
41   @Value("${portal.url}")
42   @Getter
43   @Setter
44   private String portalUrl;                                                 // 租户url
45 
46   public static String baseDataUrl;                                         // 根据租户信息获取到的ArcGis数据图层url
47 
48   @Override
49   public void afterPropertiesSet() throws Exception {
50     //请求path
51     String path = "/web/tenant/1";
52     Map<String, String> headers = new HashMap<>();
53     //(必填)根据期望的Response内容类型设置
54     headers.put(HttpHeader.HTTP_HEADER_CONTENT_TYPE, ContentType.CONTENT_TYPE_JSON);
55     Request request = new Request(Method.GET, HttpSchema.HTTP + portalUrl, path, null, null, Constants.DEFAULT_TIMEOUT);
56     request.setHeaders(headers);
57     //调用服务端
58     Response response = Client.execute(request);
59     if (response.getStatusCode() == 200) {
60       Map<String, Object> param = new HashMap<>();
61       param = JsonUtil.jsonString2SimpleObj(response.getBody(), param.getClass());
62       Map<String, Object> data = (Map<String, Object>) param.get("data");
63       Map<String, Object> applicationProfile = (Map<String, Object>) data.get("applicationProfileVo");
64       baseDataUrl = (String) applicationProfile.get("mapUrl");
65       LOG.info("数据图层为: " + baseDataUrl);
66     } else {
67       throw new RuntimeException("初始化ArcGis数据链接失败...");
68     }
69   }
70 }



相关工具类



1 /**
  2  * arcGis工具类
  3  * 
  4  */
  5 public class ArcGisUtils {
  6   /**
  7    * 处理照片路径
  8    *
  9    * @param attachments
 10    * @return
 11    */
 12   public static StringBuffer processPhotosAddStr(List<Attachment> attachments, String type) {
 13     StringBuffer photoStr = new StringBuffer();
 14     String devType = "";
 15     if (type.equals(ArcGisConstants.BOX)) {
 16       devType = ArcGisConstants.BOX_PHOTOS;
 17     }
 18     if (attachments != null && attachments.size() > 0) {
 19       for (int i = 0; i <= attachments.size() - 1; i++) {
 20         photoStr.append(attachments.get(i).getAddress().split(devType)[1]);
 21         if (i < attachments.size() - 1) {
 22           // 不是最后一张
 23           photoStr.append(",");
 24         }
 25       }
 26     }
 27     return photoStr;
 28   }
 29 
 30   /**
 31    * 创建新的容器模型
 32    *
 33    * @param geometry
 34    * @param attributes
 35    * @return
 36    */
 37   public static List<Map<String, Object>> createNewFeatures(Map<String, Object> geometry, Map<String, Object> attributes) {
 38     List<Map<String, Object>> features = new ArrayList<>();
 39     HashMap<String, Object> feature = new HashMap<>();
 40     feature.put(ArcGisConstants.GEOMETRY, geometry);
 41     feature.put(ArcGisConstants.ATTRIBUTES, attributes);
 42     features.add(feature);
 43     return features;
 44   }
 45 
 46   /**
 47    * 创建新的空间模型: 根据经纬度
 48    *
 49    * @param lon
 50    * @param lat
 51    * @return
 52    */
 53   public static Map<String, Object> createNewGeometry(BigDecimal lon, BigDecimal lat) {
 54     Map<String, Object> newGeometry = new HashMap<>();
 55     if (lon != null) {
 56       newGeometry.put(ArcGisConstants.LON, lon);
 57     } else {
 58       newGeometry.put(ArcGisConstants.LON, 0);
 59     }
 60     if (lat != null) {
 61       newGeometry.put(ArcGisConstants.LAT, lat);
 62     } else {
 63       newGeometry.put(ArcGisConstants.LAT, 0);
 64     }
 65     return newGeometry;
 66   }
 67 
 68   /**
 69    * 创建新的box数据模型
 70    *
 71    * @param boxVo
 72    * @param objectid
 73    * @return
 74    */
 75   public static Map<String, Object> createNewBoxAttributes(BoxVo boxVo, Integer objectid) {
 76     Map<String, Object> newAttributes = new HashMap<>();
 77     if (objectid != null) {
 78       // 对于修改时的objectid必须进行赋值, 这行代码仅针对于修改box时使用
 79       newAttributes.put(ArcGisConstants.OBJECT_ID, objectid);
 80     } else {
 81       // 对于新增时的createtime进行赋值, 这行代码仅针对于新增box时使用
 82       newAttributes.put(ArcGisConstants.CREATE_TIME, new SimpleDateFormat(ArcGisConstants.DEFAULT_TIME_FORMAT).format(new Date()));
 83     }
 84     newAttributes.put(ArcGisConstants.BOX_NAME, boxVo.getName());
 85     newAttributes.put(ArcGisConstants.BOX_NO, boxVo.getChannelNumber());
 86     newAttributes.put(ArcGisConstants.ADDRESS, boxVo.getInstalledAddress());
 87     newAttributes.put(ArcGisConstants.PHOTO, ArcGisUtils.processPhotosAddStr(boxVo.getAttachments(), ArcGisConstants.BOX));
 88     if (boxVo.getLongitude() != null) {
 89       newAttributes.put(ArcGisConstants.LON, boxVo.getLongitude());
 90     } else {
 91       newAttributes.put(ArcGisConstants.LON, 0);
 92     }
 93     if (boxVo.getLatitude() != null) {
 94       newAttributes.put(ArcGisConstants.LAT, boxVo.getLatitude());
 95     } else {
 96       newAttributes.put(ArcGisConstants.LAT, 0);
 97     }
 98     return newAttributes;
 99   }
100 }