maptile/api/mbtiles.go

85 lines
2.4 KiB
Go

package api
import (
"fmt"
"net/http"
"strconv"
"git.zhouxhere.com/zhouxhere/maptile/util/maptool"
"github.com/labstack/echo/v4"
)
// GetMBTilesByName 获取指定名称的MBTiles瓦片
// @Summary 获取指定名称的MBTiles瓦片
// @Description 获取指定名称的MBTiles瓦片
// @Tags MBTiles
// @Accept json
// @Produce json
// @Param name path string true "MBTiles名称"
// @Success 200 {object} model.TileJSON
// @Router /mbtiles/{name} [get]
func (a *API) GetMBTilesByName(c echo.Context) error {
name := c.Param("name")
if ok := a.store.Tile.CheckPool(maptool.MBTilesName, name); !ok {
return c.String(http.StatusBadRequest, "MBTiles not found")
}
data, err := a.store.Tile.GetTileJSON(maptool.MBTilesName, name)
if err != nil {
return c.String(http.StatusBadRequest, "Failed to get metadata")
}
data.Tiles = []string{fmt.Sprintf("http://localhost:8080/api/v1/mbtiles/%s/{z}/{x}/{y}", name)}
return c.JSON(http.StatusOK, data)
}
// GetMBTilesByNameAndZAndXAndY 获取指定名称、z、x、y的MBTiles瓦片
// @Summary 获取指定名称、z、x、y的MBTiles瓦片
// @Description 获取指定名称、z、x、y的MBTiles瓦片
// @Tags MBTiles
// @Accept json
// @Produce application/x-protobuf
// @Param name path string true "MBTiles名称"
// @Param z path string true "z值"
// @Param x path string true "x值"
// @Param y path string true "y值"
// @Success 200 {string} string "成功"
// @Router /mbtiles/{name}/{z}/{x}/{y} [get]
func (a *API) GetMBTilesByNameAndZAndXAndY(c echo.Context) error {
name := c.Param("name")
z := c.Param("z")
zValue, err := strconv.Atoi(z)
if err != nil {
return c.String(http.StatusBadRequest, "Invalid z value")
}
x := c.Param("x")
xValue, err := strconv.Atoi(x)
if err != nil {
return c.String(http.StatusBadRequest, "Invalid x value")
}
y := c.Param("y")
yValue, err := strconv.Atoi(y)
if err != nil {
return c.String(http.StatusBadRequest, "Invalid y value")
}
if ok := a.store.Tile.CheckPool(maptool.MBTilesName, name); !ok {
return c.String(http.StatusBadRequest, "MBTiles not found")
}
data, err := a.store.Tile.GetTile(maptool.MBTilesName, name, zValue, xValue, yValue)
if err != nil {
return c.String(http.StatusNotFound, "Tile not found")
}
if len(data) > 0 && data[0] == 0x1f && data[1] == 0x8b {
c.Response().Header().Set("Content-Encoding", "gzip")
}
return c.Blob(http.StatusOK, "application/x-protobuf", data)
}