golang轻量级MBTiles地图瓦片服务插件库mbtileserver的使用

Golang轻量级MBTiles地图瓦片服务插件库mbtileserver的使用

mbtileserver是一个简单的基于Go的地图瓦片服务器,用于提供存储在mbtiles格式中的地图瓦片。

功能特性

  • 支持pngjpgwebppbf(矢量瓦片)格式的瓦片集
  • 遵循1.0版本的mbtiles规范
  • 提供XYZ瓦片方案访问
  • 为每个瓦片集提供TileJSON 2.1.0端点
  • 提供每个瓦片集的预览地图
  • 提供最小化的ArcGIS瓦片地图服务API

安装

使用以下命令安装:

go install github.com/consbio/mbtileserver@latest

这将创建并安装一个名为mbtileserver的可执行文件。

基本使用

将mbtiles文件放在tilesets目录中并启动服务器:

mbtileserver

完整示例

1. 准备mbtiles文件

假设我们有一个名为world.mbtiles的地图瓦片文件,将其放在./tilesets目录中。

2. 启动服务器

mbtileserver -d ./tilesets -p 8080

3. 访问服务

  • 瓦片服务: http://localhost:8080/services/world/tiles/{z}/{x}/{y}.png
  • TileJSON端点: http://localhost:8080/services/world
  • 地图预览: http://localhost:8080/services/world/map

4. 使用Docker运行

docker run --rm -p 8080:8000 -v $(pwd)/tilesets:/tilesets ghcr.io/consbio/mbtileserver:latest

5. 使用环境变量配置

PORT=8080 TILE_DIR=./tilesets VERBOSE=true mbtileserver

6. 使用HTTPS

mbtileserver -c /path/to/cert.pem -k /path/to/key.pem -p 443 --redirect

代码示例

创建签名(请求授权)

serviceId := "test"
date := "2019-03-08T19:31:12.213831+00:00"
salt := "0EvkK316T-sBLA"
secretKey := "YMIVXikJWAiiR3q-JMz1v2Mfmx3gTXJVNqme5kyaqrY"

key := sha1.New()
key.Write([]byte(salt + secretKey))

hash := hmac.New(sha1.New, key.Sum(nil))
message := fmt.Sprintf("%s:%s", date, serviceId)
hash.Write([]byte(message))

b64hash := base64.RawURLEncoding.EncodeToString(hash.Sum(nil))
fmt.Println(b64hash) // 输出签名

请求头示例

X-Signature-Date: 2019-03-08T19:31:12.213831+00:00
X-Signature: 0EvkK316T-sBLA:YMIVXikJWAiiR3q-JMz1v2Mfmx3gTXJVNqme5kyaqrY

主要API端点

  1. XYZ瓦片API:

    /services/<tileset_id>/tiles/{z}/{x}/{y}.<format>
    
  2. TileJSON API:

    /services/<tileset_id>
    
  3. 地图预览:

    /services/<tileset_id>/map
    
  4. ArcGIS API (需启用):

    /arcgis/rest/services/<tileset_id>/MapServer
    

配置选项

mbtileserver支持多种配置选项,可以通过命令行参数或环境变量设置:

mbtileserver --help

常用选项包括:

  • -d/--dir: 指定mbtiles文件目录
  • -p/--port: 指定服务器端口
  • -c/--cert-k/--key: 指定TLS证书和密钥
  • --enable-arcgis: 启用ArcGIS API
  • --basemap-style-url: 设置预览地图的底图样式URL

性能特点

mbtileserver设计为:

  • 快速响应
  • 能在资源有限的云主机上运行(有限的内存和CPU)
  • 易于安装和操作

我们已经在AWS t2.nano虚拟机上成功托管了多个瓦片集而没有任何问题。


更多关于golang轻量级MBTiles地图瓦片服务插件库mbtileserver的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang轻量级MBTiles地图瓦片服务插件库mbtileserver的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用mbtileserver构建轻量级MBTiles地图瓦片服务

MBTiles是一种用于存储地图瓦片的SQLite数据库格式,而mbtileserver是一个轻量级的Go库/服务,可以快速将MBTiles文件发布为地图瓦片服务。下面我将详细介绍如何使用mbtileserver。

mbtileserver简介

mbtileserver是一个用Go编写的轻量级服务器,用于提供存储在MBTiles格式中的地图瓦片。它具有以下特点:

  • 轻量级,单个可执行文件
  • 支持多种协议(HTTP/HTTPS)
  • 支持CORS
  • 支持gzip压缩
  • 支持多种MBTiles格式(png, jpg, webp, pbf)

安装mbtileserver

二进制安装

从GitHub发布页面下载预编译的二进制文件: https://github.com/consbio/mbtileserver/releases

使用Go安装

go install github.com/consbio/mbtileserver@latest

基本使用

启动服务

最简单的启动方式是指定MBTiles文件所在目录:

mbtileserver -dir /path/to/mbtiles

默认会在8080端口启动服务。

常用参数

mbtileserver \
  -dir /path/to/mbtiles \  # MBTiles文件目录
  -p 8000 \               # 端口号
  -dsn ":memory:" \       # SQLite连接字符串
  -tilePath /tiles/       # 瓦片URL路径

Go代码集成示例

如果你想在自己的Go应用中集成mbtileserver,可以使用它作为库:

package main

import (
	"log"
	"net/http"
	
	"github.com/consbio/mbtileserver/handlers"
)

func main() {
	// 创建服务配置
	config := &handlers.ServerConfig{
		Dir:        "/path/to/mbtiles", // MBTiles文件目录
		Domain:     "localhost",         // 域名
		Port:       "8000",             // 端口
		TilePath:   "/tiles/",          // 瓦片URL路径
		EnableCORS: true,               // 启用CORS
		CacheSize:  32,                 // 缓存大小(MB)
	}

	// 创建服务处理器
	server, err := handlers.NewServer(config)
	if err != nil {
		log.Fatal(err)
	}

	// 设置路由
	mux := http.NewServeMux()
	mux.HandleFunc(config.TilePath, server.TileHandler)
	mux.HandleFunc("/", server.IndexHandler)

	// 启动服务
	log.Printf("Starting server on port %s", config.Port)
	log.Fatal(http.ListenAndServe(":"+config.Port, mux))
}

高级功能

多源支持

mbtileserver可以同时服务多个MBTiles文件:

config := &handlers.ServerConfig{
	Sources: []handlers.TileSource{
		{
			Name:      "streets",
			FilePath:  "/path/to/streets.mbtiles",
			MinZoom:   0,
			MaxZoom:   22,
		},
		{
			Name:      "satellite",
			FilePath:  "/path/to/satellite.mbtiles",
			MinZoom:   0,
			MaxZoom:   20,
		},
	},
}

自定义元数据

你可以覆盖MBTiles文件中的元数据:

config := &handlers.ServerConfig{
	Sources: []handlers.TileSource{
		{
			Name: "custom",
			FilePath: "/path/to/file.mbtiles",
			Metadata: map[string]interface{}{
				"name":        "Custom Map",
				"description": "My custom map tiles",
				"version":     "1.0",
			},
		},
	},
}

前端集成示例

在前端地图库(如Leaflet)中使用mbtileserver:

var map = L.map('map').setView([51.505, -0.09], 13);

L.tileLayer('http://localhost:8000/tiles/{name}/{z}/{x}/{y}.{ext}', {
    name: 'streets',  // MBTiles文件名
    ext: 'png',       // 瓦片格式
    attribution: 'Map data © OpenStreetMap contributors',
    minZoom: 0,
    maxZoom: 22
}).addTo(map);

性能优化建议

  1. 对于大型MBTiles文件,增加缓存大小:

    config.CacheSize = 128 // MB
    
  2. 使用:memory:作为SQLite连接字符串可以提高性能:

    config.DSN = ":memory:"
    
  3. 对于生产环境,考虑在前面添加反向代理(如Nginx)来处理静态文件和缓存。

总结

mbtileserver是一个简单高效的MBTiles服务解决方案,无论是作为独立服务还是集成到Go应用中都非常方便。它的轻量级特性和易用性使其成为快速部署地图瓦片服务的理想选择。

更多详细信息和高级配置,请参考官方文档:https://github.com/consbio/mbtileserver

回到顶部