From ed8c7a5effd0d423ce1118b680ecdca6fe732609 Mon Sep 17 00:00:00 2001
From: 13693261870 <252740454@qq.com>
Date: 星期三, 02 七月 2025 16:43:13 +0800
Subject: [PATCH] Merge branch 'master' of http://192.168.11.205:9000/r/P2022036_Service

---
 src/main/java/com/lf/server/controller/data/WmtsController.java |  151 +++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 137 insertions(+), 14 deletions(-)

diff --git a/src/main/java/com/lf/server/controller/data/WmtsController.java b/src/main/java/com/lf/server/controller/data/WmtsController.java
index 5a82156..4abbf2d 100644
--- a/src/main/java/com/lf/server/controller/data/WmtsController.java
+++ b/src/main/java/com/lf/server/controller/data/WmtsController.java
@@ -1,26 +1,36 @@
 package com.lf.server.controller.data;
 
 import com.lf.server.annotation.SysLog;
-import com.lf.server.entity.all.StaticData;
-import com.lf.server.helper.GdalHelper;
+import com.lf.server.config.PropertiesConfig;
 import com.lf.server.helper.StringHelper;
+import com.lf.server.helper.WebHelper;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.io.ClassPathResource;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.server.ServerHttpRequest;
+import org.springframework.http.server.ServerHttpResponse;
+import org.springframework.http.server.ServletServerHttpRequest;
+import org.springframework.http.server.ServletServerHttpResponse;
+import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.ServletOutputStream;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.FileInputStream;
 import java.io.InputStream;
+import java.io.OutputStream;
 import java.nio.charset.StandardCharsets;
+import java.time.Duration;
+import java.util.Date;
+import java.util.List;
 
 /**
  * WMTS鏈嶅姟
@@ -30,19 +40,19 @@
 @RestController
 @RequestMapping("/wmts")
 public class WmtsController {
+    @Autowired
+    PropertiesConfig config;
+
     private final static Log log = LogFactory.getLog(WmtsController.class);
 
     @SysLog()
-    @ApiOperation(value = "鏌ヨWMTS鍏冩暟鎹�")
+    @ApiOperation(value = "鑾峰彇WMTS鍏冩暟鎹�")
     @ApiImplicitParams({
-            @ApiImplicitParam(name = "token", value = "浠ょ墝", dataType = "String", required = true, defaultValue = "token", paramType = "path")})
-    @GetMapping("select/metas/{token}")
-    public void selectMetas(String service, String version, String request, @PathVariable(name = "token") String token, HttpServletRequest req, HttpServletResponse res) {
+            @ApiImplicitParam(name = "token", value = "浠ょ墝", required = true, dataType = "String", defaultValue = "token", paramType = "path")
+    })
+    @GetMapping("select/{token}/WMTSCapabilities.xml")
+    public void selectWmtsCapabilities(@PathVariable(name = "token") String token, HttpServletRequest req, HttpServletResponse res) {
         try {
-            if (!StaticData.WMTS.equals(service) || !StaticData.CAPABILITY.equals(request)) {
-                return;
-            }
-
             ClassPathResource resource = new ClassPathResource("wmts/web.xml");
             if (!resource.exists()) {
                 return;
@@ -53,7 +63,10 @@
             stream.read(data);
             stream.close();
 
+            String url = req.getRequestURL().toString().replace("WMTSCapabilities.xml", "tile?");
+
             String result = new String(data, StandardCharsets.UTF_8);
+            result = result.replace("{url}", url);
             byte[] bytes = result.getBytes(StandardCharsets.UTF_8);
 
             res.setHeader("Content-Type", "application/xml;charset=UTF-8");
@@ -64,4 +77,114 @@
             log.error(ex.getMessage(), ex);
         }
     }
+
+    @ApiOperation(value = "鑾峰彇WMTS鐡︾墖")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "token", value = "浠ょ墝", required = true, dataType = "String", defaultValue = "token", paramType = "path"),
+            @ApiImplicitParam(name = "layer", value = "鍥惧眰绫诲瀷", required = true, dataType = "String", defaultValue = "img"),
+            @ApiImplicitParam(name = "tilematrix", value = "灞傜骇", required = true, dataType = "Integer"),
+            @ApiImplicitParam(name = "tilerow", value = "琛屽彿", required = true, dataType = "Integer"),
+            @ApiImplicitParam(name = "tilecol", value = "鍒楀彿", required = true, dataType = "Integer")
+    })
+    @GetMapping("select/{token}/tile")
+    public void selectWmtsTile(@PathVariable(name = "token") String token, HttpServletRequest req, HttpServletResponse res) {
+        try {
+            String layer = WebHelper.getReqParamVal(req, "layer");
+            String matrix = WebHelper.getReqParamVal(req, "tilematrix");
+            String row = WebHelper.getReqParamVal(req, "tilerow");
+            String col = WebHelper.getReqParamVal(req, "tilecol");
+            if (StringHelper.isEmpty(layer) || StringHelper.isEmpty(matrix) || StringHelper.isEmpty(layer) || StringHelper.isEmpty(row) || StringHelper.isEmpty(col)) {
+                return;
+            }
+
+            int z = Integer.parseInt(matrix);
+            int x = Integer.parseInt(row);
+            int y = Integer.parseInt(col);
+
+            getWmtsTile(layer, z, x, y, req, res);
+        } catch (Exception ex) {
+            log.error(ex.getMessage(), ex);
+        }
+    }
+
+    /**
+     * 鑾峰彇WMTS鐡︾墖
+     */
+    private void getWmtsTile(String layer, int z, int x, int y, HttpServletRequest req, HttpServletResponse res) throws Exception {
+        ServletServerHttpRequest ssReq = new ServletServerHttpRequest(req);
+        ServletServerHttpResponse ssRes = new ServletServerHttpResponse(res);
+
+        // 妫�鏌ョ紦瀛樻槸鍚﹁繃鏈�
+        if (checkIfNotModify(ssReq, ssRes)) {
+            // 璁剧疆缂撳瓨澶�
+            setBrowerCache(ssRes);
+            return;
+        }
+
+        // 璁剧疆缂撳瓨鍙傛暟
+        setBrowerCache(ssRes);
+        //res.setContentType("image/png")
+
+        // 閫氳繃response瀵硅薄锛岃幏鍙栧埌杈撳嚭娴�
+        ServletOutputStream outputStream = res.getOutputStream();
+        // 瀹氫箟杈撳叆娴侊紝閫氳繃杈撳叆娴佽鍙栨枃浠跺唴瀹�
+        FileInputStream fileInputStream;
+
+        // y = (int) Math.pow(2, z) - y - 1;
+        String path = config.getTilePath() + File.separator + layer + File.separator + z + File.separator + y + File.separator + x + ".png";
+        System.out.println(path);
+
+        File file = new File(path);
+        if (!file.exists() || file.isDirectory()) {
+            ClassPathResource resource = new ClassPathResource("wmts/nofound.png");
+            fileInputStream = new FileInputStream(resource.getFile());
+        } else {
+            System.out.println(path);
+            fileInputStream = new FileInputStream(file);
+        }
+
+        int len = 0;
+        byte[] bytes = new byte[1024];
+        while ((len = fileInputStream.read(bytes)) != -1) {
+            outputStream.write(bytes, 0, len);
+            outputStream.flush();
+        }
+        //outputStream.close()
+        fileInputStream.close();
+
+        // 璁剧疆杩斿洖鍥剧墖绫诲瀷
+        ssRes.getHeaders().set("Content-Type", "image/png");
+
+        OutputStream os = ssRes.getBody();
+        os.write(bytes);
+        os.flush();
+    }
+
+    /**
+     * 璁剧疆娴忚鍣ㄧ紦瀛樺弬鏁�
+     */
+    private void setBrowerCache(ServerHttpResponse res) {
+        HttpHeaders headers = res.getHeaders();
+        headers.setCacheControl("public, must-revalidate");
+
+        headers.setExpires(System.currentTimeMillis() + 24 * 60 * 60 * 1000);
+        headers.setAccessControlMaxAge(Duration.ofHours(24));
+        headers.setETag("\"" + new Date().toString() + "\"");
+        // must-revalidate
+        // response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
+    }
+
+    /**
+     * 楠岃瘉缂撳瓨鍙傛暟
+     */
+    boolean checkIfNotModify(ServerHttpRequest req, ServerHttpResponse res) {
+        List<String> etags = req.getHeaders().getIfNoneMatch();
+        if (0 == etags.size() || StringHelper.isEmpty(etags.get(0))) {
+            return false;
+        }
+
+        res.setStatusCode(HttpStatus.NOT_MODIFIED);
+
+        return true;
+    }
 }

--
Gitblit v1.9.3