Spring Boot 实现构建一个轻量级地图瓦片服务

  • 存在瓦片:从本地目录读取对应 PNG 文件并返回;
  • 瓦片缺失:动态生成一张 256×256 的全透明 PNG 图像,避免前端加载错误;
java 复制代码
@GetMapping("/tiles/{z}/{x}/{y}.png")
public ResponseEntity<Resource> getTile(
                                @PathVariable String z,
                                @PathVariable String x,
                                @PathVariable String y) throws IOException {

    String TILE_ROOT = "";
    if ("Windows 10".equals(System.getProperty("os.name"))) {
        TILE_ROOT = "本地地址";
    } else {
        TILE_ROOT = "云端地址/www/java/title/";
    }

    String path = TILE_ROOT + z + "/" + x + "/" + y + ".png";
    File file = new File(path);

    if (file.exists()) {
        InputStreamResource resource = new InputStreamResource(new FileInputStream(file));
        return ResponseEntity.ok()
                .header(HttpHeaders.CONTENT_DISPOSITION, "inline;filename=\"" + y + ".png\"")
                .contentType(MediaType.IMAGE_PNG)
                .body(resource);
    } else {
        // 没有瓦片 → 返回透明图片
        byte[] transparentPng = createTransparentPng(256, 256);
        return ResponseEntity.ok()
                .contentType(MediaType.IMAGE_PNG)
                .body(new ByteArrayResource(transparentPng));
    }
}

   

当瓦片不存在时,调用 createTransparentPng(256, 256) 生成一张 256×256 的全透明 PNG:

java 复制代码
// 创建透明 PNG 的字节数组
private byte[] createTransparentPng(int width, int height) throws IOException {
    BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
    Graphics2D g = image.createGraphics();
    g.setColor(new Color(0, 0, 0, 0)); // 全透明
    g.fillRect(0, 0, width, height);
    g.dispose();
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ImageIO.write(image, "png", baos);
    return baos.toByteArray();
}
相关推荐
_小马快跑_17 分钟前
Java 的 8 大基本数据类型:为何是不可或缺的设计?
java
想用offer打牌1 小时前
高并发下如何保证接口的幂等性
后端·面试·状态机
爱勇宝2 小时前
2026一人公司生存指南:用AI大模型,90天跑出你的第一条现金流
前端·后端·架构
golang学习记2 小时前
Go 并发编程:原子操作(Atomics)完全指南
后端
哈里谢顿2 小时前
`127.0.0.1` 和 `0.0.0.0` 有何区别?通过验证 demo来展示
后端
树獭叔叔2 小时前
08-大模型后训练的指令微调SFT:LoRA让大模型微调成本降低99%
后端·aigc·openai
苏三说技术3 小时前
我终于遇到一台真正懂程序员的显示器!
后端
Re_zero3 小时前
线上日志被清空?这段仅10行的 IO 代码里竟然藏着3个毒瘤
java·后端
花落人散处3 小时前
流式输出——解决 HITL 难题 (SpringAIAlibaba)
后端
洋洋技术笔记3 小时前
Spring Boot条件注解详解
java·spring boot