package com.terra.proxy.controller; import cn.hutool.json.JSONObject; import com.terra.proxy.bean.TiandiantuMergeInfo; import com.terra.proxy.mapper.ServiceMapper; import com.terra.proxy.properties.TerraProperties; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.imageio.ImageIO; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.awt.*; import java.awt.image.BufferedImage; import java.io.*; import java.net.URI; import java.net.URISyntaxException; import java.util.List; import java.util.Map; @RestController @RequestMapping("/") @CrossOrigin public class TiantiduMergeController { private Logger log = LoggerFactory.getLogger(TiantiduMergeController.class); @Autowired private TerraProperties properties; @Resource ServiceMapper mapper; /** * 获取天地图影像类融合地址 * * @param ditu 底图 * @param zhujigroup 注记图层组,用,号隔开 */ @RequestMapping(value = "/tianditumerge/getmergeaddress", method = RequestMethod.GET) public String getmergeaddress(HttpServletRequest request, String ditu, String zhujigroup, int resourceid) { StringBuilder sb = new StringBuilder(); TiandiantuMergeInfo t = new TiandiantuMergeInfo(); t.setBasemap(ditu); t.setZhujimapgroup(zhujigroup); t.setResourceid(resourceid); int result = mapper.addtianditumerge(t); if (result > 0) { sb.append(properties.getProxy().getHost()).append("/ter").append("/" + t.getMergeid() + "/getinfo_w"); JSONObject JSON = new JSONObject(); JSON.put("url", sb.toString()); return JSON.toString(); } return null; } /** * 获取天地图影像类融合地址 * * @param ditu 底图 * @param zhujigroup 注记图层组,用,号隔开 */ @RequestMapping(value = "/arcgis/getarcgismergeaddress", method = RequestMethod.GET) public String getarcgismergeaddress(HttpServletRequest request, String ditu, String zhujigroup, int resourceid) { StringBuilder sb = new StringBuilder(); TiandiantuMergeInfo t = new TiandiantuMergeInfo(); t.setBasemap(ditu); t.setZhujimapgroup(zhujigroup); t.setResourceid(resourceid); int result = mapper.addtianditumerge(t); if (result > 0) { sb.append(properties.getProxy().getHost()).append("/arcgis/rest/services").append("/" + t.getMergeid() + "/merge"); JSONObject JSON = new JSONObject(); JSON.put("url", sb.toString()); return JSON.toString(); } return null; } /** * arcgis融合代理服务,根据mergeid寻找 注册的图层,http请求返回图片数组,合成返回前端 * * @param request * @param mergeid * @return * @throws IOException * @throws URISyntaxException */ @RequestMapping(value = "/ter_/{id}/getinfo_w/**", produces = MediaType.IMAGE_JPEG_VALUE, method = RequestMethod.GET) public void getarcgisimageinfo(HttpServletRequest request, HttpServletResponse httpresponse, @PathVariable(value = "id") int mergeid) throws IOException, URISyntaxException { //根据mergeid获取关联的图层 List list = mapper.querytianditumerge(mergeid); String pathinfo = request.getQueryString(); String pstring = "/wmts?" + pathinfo; Map map = list.get(0); map.get("BASEMAP"); String basepstring = concataddress(map.get("BASEMAP").toString(), pstring); String str1 = map.get("BASEMAP").toString().concat(basepstring); String[] zhujis = map.get("ZHUJIMAPGROUP").toString().split(","); BufferedImage img = new BufferedImage(256, 256, BufferedImage.TYPE_INT_RGB); Graphics g = img.getGraphics(); process(str1, g); for (int i = 0; i < zhujis.length; i++) { String temp = concataddress(zhujis[i], pstring); if (!zhujis[i].isEmpty()) { zhujis[i] = zhujis[i].concat(temp); process(zhujis[i], g); } } g.dispose(); ImageIO.write(img, "png", httpresponse.getOutputStream()); } /** * 天地图融合代理服务,根据mergeid寻找 注册的图层,http请求返回图片数组,合成返回前端 * * @param request * @param mergeid * @return * @throws IOException * @throws URISyntaxException */ @RequestMapping(value = "/arcgis/rest/services/{id}/merge/**", method = RequestMethod.GET) public void getinfo(HttpServletRequest request, HttpServletResponse httpresponse, @PathVariable(value = "id") int mergeid, String extstr) throws IOException, URISyntaxException { //根据mergeid获取关联的图层 List list = mapper.querytianditumerge(mergeid); String pathinfo = request.getQueryString(); String t = request.getRequestURI(); if (t.contains("MapServer")) { extstr = t.substring(t.indexOf("merge/MapServer") + 15); } if (t.contains("ImageServer")) { extstr = t.substring(t.indexOf("merge/ImageServer") + 17); } String[] ext = extstr.split("/"); Map map = list.get(0); String str1 = map.get("BASEMAP").toString(); String[] zhujis = map.get("ZHUJIMAPGROUP").toString().split(","); HttpResponse response = null; CloseableHttpClient httpClient = HttpClientBuilder.create().build(); //解决 if (pathinfo != null && pathinfo.contains("f=json")) { HttpGet httpGet = new HttpGet(str1.concat("?f=json")); response = httpClient.execute(httpGet); HttpEntity entitiy = response.getEntity(); if (entitiy != null) { entitiy.writeTo(httpresponse.getOutputStream()); } } else { if (extstr.contains("query")) { StringBuilder sb = new StringBuilder(zhujis[0]); sb.append("/").append(extstr).append("?").append(pathinfo); HttpGet httpGet = new HttpGet(sb.toString()); response = httpClient.execute(httpGet); } else { StringBuilder sb = new StringBuilder(str1); sb.append(extstr); str1 = sb.toString(); if (pathinfo != null) { sb.append("?").append(pathinfo); } HttpGet httpGet = new HttpGet(sb.toString()); response = httpClient.execute(httpGet); } BufferedImage img = new BufferedImage(256, 256, BufferedImage.TYPE_INT_RGB); Graphics g = img.getGraphics(); process(str1, g); for (int i = 0; i < zhujis.length; i++) { if (!zhujis[i].isEmpty()) { zhujis[i] = zhujis[i].concat(extstr); process(zhujis[i], g); } } g.dispose(); HttpEntity entitiy = response.getEntity(); if (entitiy != null) { ImageIO.write(img, "png", httpresponse.getOutputStream()); } } } private byte[] fileconverterToByteArray(File file) { byte[] data = null; try { FileInputStream fis = new FileInputStream(file); ByteArrayOutputStream baos = new ByteArrayOutputStream(); int len; byte[] buffer = new byte[1024]; while ((len = fis.read(buffer)) != -1) { baos.write(buffer, 0, len); } data = baos.toByteArray(); fis.close(); baos.close(); } catch (Exception e) { e.printStackTrace(); } return data; } public void process(String url, Graphics g) throws URISyntaxException, ClientProtocolException, IOException { URI uri = new URI(url); HttpResponse response = null; CloseableHttpClient httpClient = HttpClientBuilder.create().build(); HttpGet httpGet = new HttpGet(uri); response = httpClient.execute(httpGet); InputStream inputStream = response.getEntity().getContent(); BufferedImage buffer = ImageIO.read(inputStream); g.drawImage(buffer.getScaledInstance(256, 256, Image.SCALE_DEFAULT), 0, 0, null); } public String concataddress(String str, String pstring) { str = str.substring(str.lastIndexOf("/") + 1, str.length()); str = str.replace("_w", ""); pstring = pstring.replace("LAYER=getinfo", "LAYER=" + str); return pstring; } }