# BDMSG **Repository Path**: zongel/BDMSG ## Basic Information - **Project Name**: BDMSG - **Description**: 短报文发送 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-11-01 - **Last Updated**: 2024-11-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 电压电流分析 ### 日志页面 http://ip:port/analyse/message ### 数据分析展示页面 http://ip:port/analyse ### Excel多sheet导出 * 1.在pom.xml文件中引入easypoi ``` cn.afterturn easypoi-spring-boot-starter 4.5.0 ``` * 2.相关示例代码如下: ``` @RequestMapping("export") public void export(HttpServletResponse response){ // 添加到list中 List> list = new ArrayList<>(); Map map= ConstantUtil.getConstntsMap(); String devices[] = new String[]{"client1022", "client1031", "client1046", "client1049"}; for (String s : devices) { if(map.containsKey(s + "_u")) { cn.hutool.json.JSONObject obju = new cn.hutool.json.JSONObject((String) map.get(s + "_u")); cn.hutool.json.JSONObject obji = new cn.hutool.json.JSONObject((String) map.get(s + "_i")); Double au[] = obju.getJSONObject("data").getJSONArray("au").stream().map(obj -> Double.parseDouble(String.valueOf(obj))).toArray(Double[]::new); Double bu[] = obju.getJSONObject("data").getJSONArray("bu").stream().map(obj -> Double.parseDouble(String.valueOf(obj))).toArray(Double[]::new); Double cu[] = obju.getJSONObject("data").getJSONArray("cu").stream().map(obj -> Double.parseDouble(String.valueOf(obj))).toArray(Double[]::new); Double ai[] = obji.getJSONObject("data").getJSONArray("ai").stream().map(obj -> Double.parseDouble(String.valueOf(obj))).toArray(Double[]::new); Double bi[] = obji.getJSONObject("data").getJSONArray("bi").stream().map(obj -> Double.parseDouble(String.valueOf(obj))).toArray(Double[]::new); Double ci[] = obji.getJSONObject("data").getJSONArray("ci").stream().map(obj -> Double.parseDouble(String.valueOf(obj))).toArray(Double[]::new); Long ts[] = obji.getJSONObject("data").getJSONArray("ts").stream().map(obj -> Long.parseLong(String.valueOf(obj))).toArray(Long[]::new); String[] tr_str = getTs(ts); List list1 = new ArrayList<>(); for (int i = 0; i < au.length; i++) { list1.add(new MyExportEntity(au[i], bu[i], cu[i], ai[i], bi[i], ci[i], tr_str[i])); } // 创建第一个Sheet的数据 Map sheet1Map = new HashMap<>(); sheet1Map.put("title", new ExportParams(s, s)); sheet1Map.put("entity", MyExportEntity.class); sheet1Map.put("data", list1); list.add(sheet1Map); } } if(!list.isEmpty()) { // 导出Excel Workbook workbook = ExcelExportUtil.exportExcel(list, ExcelType.HSSF); try { response.setCharacterEncoding("utf-8"); response.setContentType("application/octet-stream;charset=UTF-8"); response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode("设备电压电流.xls", "utf-8")); response.addHeader("Pargam", "no-cache"); response.addHeader("Cache-Control", "no-cache"); OutputStream os = response.getOutputStream(); workbook.write(os); os.close(); } catch (Exception e) { log.error(e.getMessage()); } }else{ response.setContentType("text/html"); response.setCharacterEncoding("UTF-8"); PrintWriter writer = null; try { writer = response.getWriter(); } catch (IOException e) { throw new RuntimeException(e); } writer.write("
没有数据!
"); writer.flush(); writer.close(); } } ``` ### 瓦片地图图片的URL格式 Bing Maps的瓦片地图图片的URL的格式为: http://ecn.t{0}.tiles.virtualearth.net/tiles/{1}{2}.png? g={4} 参数解释: 参数 解释 说明 {0} 代表Bing Maps的服务器,平衡负载 现在看来取值可以是0~7,也就是8台服务器 {1} 地图类型 卫星地图:a;普通地图:r;混合地图:h {2} 瓦片地图图片键值(quadkey ) 通过对应地图区域的位置、显示尺度等计算而来 {3} 地图图片类型 取值为png | jpeg | jpg {4} 地图版本 其他url参数可以参考bing maps的官方文档。 其他地图供应商的url大同小异。 三、瓦片数据的存储 瓦片数据在文件系统中以下面这种路径形式(z/x/y.jpg,即TileXY方式)存储的: 上图中的图片路径是 2/2/1.jpg,即按照TileXY方式描述的 {地图放大层级}/{X坐标}/{Y坐标}.jpg。它对应的url是: https://ecn.t3.tiles.virtualearth.net/tiles/a123.jpg?g=9675 也就是url中的图片名 a123.jpg(quadkey)和文件夹路径(TileXY)存在换算的映射。 四、quadkey和TileXY之间的映射 根据官方文档:在给定level下,把行号Y和列号X转换为2进制,然后行列交叉存储,再转换为4进制,即得到了相应的quadkey。譬如Level 3的第6行第4列的Tile计算:tileY = 5 = 101 ,tileX = 3 = 011;quadkey = 100111 = 213(4进制) = “213”。反过来计算就是quadkey到TileXY的转换。根据此方法,就很容易写quadkey到TileXY之间的转换代码。