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();
}
相关推荐
王中阳Go27 分钟前
Go 后端转 AI:非科班怎么补?一张 3 列路线表(可保存)
开发语言·人工智能·后端·python·golang·大语言模型
IT_陈寒29 分钟前
Vite热更新失效?你可能也踩了这个坑
前端·人工智能·后端
SL_staff33 分钟前
运维救火实录:钉钉考勤API变更引发工资计算异常,我们用JVS-Logic可视化逻辑引擎实现分钟级热修复
java·mysql·全栈
SunnyDays101139 分钟前
Java 查找并高亮 Word 文字:精确查找及正则表达式模糊查找
java·查找文字·word 文档·高亮文字·正则匹配查找·模糊查找
geats人山人海1 小时前
java 4继承
java·开发语言
行百里er1 小时前
Redis 模块——JSON、向量搜索与时序
redis·后端
光依旧1 小时前
发版就掉请求?Spring Boot优雅停机的四步
运维·spring boot·nginx·高可用·优雅停机·mcp server
众链网络1 小时前
Agent 的成本大头不在“写“,在“判断“:拆解专用决策模型的三层架构
java·开发语言·人工智能·微服务
周小董1 小时前
[1371]jdk管理工具
java·开发语言
青春逝如流水1 小时前
Java 中线程的创建方式:从基础到现代
java·开发语言·多线程·ai文章