一: 添加要素
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 }