Springboot发布/{z}/{x}/{y}.png地图瓦片服务

服务读取本地文件型地图瓦片

import com.sailen.tpm.modules.signal.config.TpmConfig;
import org.springframework.beans.factory.annotation.Autowired;
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 javax.imageio.ImageIO;
import javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Optional;

@RestController
@RequestMapping("/map")
public class MapPublicController {
    

    @GetMapping("/{layer}/{level}/{col}/{row}")
    public void xyz(@PathVariable String layer, @PathVariable String level, @PathVariable String col,
                    @PathVariable String row, HttpServletResponse response) {
        String dataPath = "your data path";
        StringBuffer buffer = new StringBuffer(dataPath);
        buffer.append("/").append(layer)
                .append("/").append(level)
                .append("/").append(col)
                .append("/").append(row);
        try {
            String tilePath = buffer.toString();
            InputStream inputStream = new FileInputStream(tilePath);
            if (Optional.of(inputStream).isPresent()) {
                BufferedImage bi = ImageIO.read(inputStream);
                ImageIO.write(bi, "PNG", response.getOutputStream());
                bi.flush();
                inputStream.close();
            }
        } catch (IOException e) {
            System.out.println(String.format("%s/%d/%d/%s请求瓦片出错!", layer, level, col, row));
        }
    }


}

前台请求,leaflet为例

var map = L.map('map', {
        crs: L.CRS.EPSG3857,
        center: [34.7, 113.6],
        zoom: 12
    })

    L.tileLayer('http://localhost:8080/appname/map/youlayer/{z}/{x}/{y}.png', {
        attribution: '&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
    }).addTo(this.map)

其中appname依据项目context-path自行更改,youlayer根据瓦片文件夹自行设定。

<think>嗯,用户想了解如何在PostGIS中生成或使用栅格瓦片。首先,我需要回顾一下PostGIS处理栅格数据的基本流程。记得PostGIS提供了raster2pgsql工具来导入栅格数据,这个工具可以将栅格文件转换成SQL语句,然后导入到PostgreSQL数据库中[^1]。所以第一步应该是使用这个工具导入数据。 接下来,生成栅格瓦片可能需要用到PostGIS的函数。比如,ST_Tile函数可以将大块的栅格数据切割成小的瓦片,这应该是在数据库中进行的操作。然后,用户可能想通过GeoServer发布这些瓦片,或者使用其他后端服务。之前有资料提到GeoServer和PostGIS结合使用的情况,特别是pgraster插件的应用[^3]。可能需要配置GeoServer来连接PostGIS中的栅格数据,并设置相应的图层。 另外,矢量瓦片的生成也有涉及,比如使用PostGIS的ST_AsMVT函数来生成Mapbox Vector Tiles(MVT)[^2]。不过用户的问题是关于栅格瓦片的,所以可能需要更关注栅格处理的部分。不过有时候可能会有混淆,需要确认用户的需求是栅格还是矢量,但根据问题描述,用户明确提到栅格瓦片。 还需要考虑不同版本的工具兼容性,比如PostGIS 2.4、PostgreSQL 9.6和GeoServer 2.12的搭配使用[^4]。确保步骤中的工具版本匹配,避免兼容性问题。 可能用户在使用过程中会遇到如何优化瓦片生成的问题,或者如何发布这些瓦片为地图服务。需要分步骤说明导入数据、切割瓦片、发布服务的过程。同时,提醒用户注意坐标系统和性能优化,比如建立空间索引。 最后,要生成相关问题,可能涉及性能优化、与其他工具集成、版本差异等,确保覆盖用户可能遇到的后续问题。</think>### PostGIS栅格瓦片生成与使用教程 #### **一、栅格数据导入** 1. **使用`raster2pgsql`工具** 将本地栅格文件(如GeoTIFF)转换为SQL并导入PostgreSQL数据库: ```bash raster2pgsql -s 4326 -I -C -M myraster.tif -F -t 256x256 public.myraster_table | psql -U postgres -d mydb ``` - `-s 4326`: 指定坐标系为WGS84 - `-I`: 为栅格列创建空间索引 - `-t 256x256`: 将栅格自动切割为256x256像素的瓦片[^1] 2. **验证导入** ```sql SELECT rid, ST_Width(rast), ST_Height(rast) FROM public.myraster_table; ``` --- #### **二、栅格瓦片生成** 1. **动态切割瓦片** 使用`ST_Tile`函数按需生成瓦片: ```sql SELECT ST_AsPNG(ST_Tile(rast, 1, 256, 256, x, y)) AS tile FROM public.myraster_table WHERE rid = 1; ``` - `x`和`y`表示瓦片行列号 2. **预生成瓦片金字塔** 通过`ST_Resample`和`ST_Tile`生成多层级瓦片并存储到表中。 --- #### **三、栅格瓦片发布** 1. **GeoServer发布** - 安装PostGIS扩展并配置数据源 - 添加新的“ImageMosaicJDBC”存储,选择`pgraster`作为扩展类型 - 发布图层时启用金字塔优化 2. **自定义服务端渲染** 使用Java/SpringBoot调用PostGIS函数生成瓦片二进制流,通过HTTP接口返回: ```java @GetMapping("/tile/{z}/{x}/{y}.png") public byte[] getTile(@PathVariable int z, @PathVariable int x, @PathVariable int y) { String sql = "SELECT ST_AsPNG(ST_Transform(ST_Tile(rast, "+z+", "+x+", "+y+"), 3857))"; // 执行查询并返回字节流 } ``` [^2] --- #### **四、性能优化建议** - 为栅格表添加GiST索引:`CREATE INDEX idx_rast_gist ON myraster_table USING gist (ST_ConvexHull(rast))` - 使用`ST_Clip`裁剪无效区域 - 配置PostgreSQL并行查询参数 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值