# TileServer **Repository Path**: nwpu-pilab/tile-server ## Basic Information - **Project Name**: TileServer - **Description**: 瓦片服务示例代码与数据 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-06-30 - **Last Updated**: 2025-08-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # TileServer - 瓦片服务与Tile Manager文档 ## 概述 本文档介绍瓦片服务的HTTP协议接口、Tile Manager的瓦片管理机制以及CloudServer点云服务的使用方法。 ## 1. 瓦片服务HTTP协议 ### 1.1 服务架构 瓦片服务基于HTTP服务器实现,支持跨域访问和多种瓦片格式。主要组件包括: - **HttpService**: HTTP服务器核心,处理路由和请求转发 - **DomManager**: DOM瓦片管理器,处理具体的瓦片业务逻辑 - **CloudServer**: 点云数据服务,提供实时点云数据的HTTP接口 - **消息系统**: 基于GSLAM Messenger的异步消息处理 ### 1.2 HTTP路由 系统支持以下HTTP路由: #### 基础路由 - `GET /dom` - 获取当前任务的DOM信息 - `POST /dom` - 更新当前任务的DOM瓦片数据 #### 任务相关路由 - `GET /dom/[taskid]` - 获取指定任务的DOM信息 - `POST /dom/[taskid]` - 更新指定任务的DOM瓦片数据 - `POST /dom/[taskid]/updated` - 处理指定任务的瓦片更新通知 #### 瓦片获取路由 - `GET /dom/[taskid]/tiles/[z]-[x]-[y].png` - 获取指定任务的指定坐标的瓦片PNG图片 #### 点云数据路由 - `GET /livecloud` - 获取最新的点云数据 相关的代码可以查看`src/TileServer/src/DomManager.cpp`的`POST`和`GET`函数,以及`src/TileServer/src/CloudServer.cpp`的点云处理函数。 ### 1.3 请求处理流程 1. **路由匹配**: HTTP服务器根据URL路径匹配相应的处理函数 2. **消息发布**: 将HTTP请求包装为消息发布到GSLAM消息系统 3. **异步处理**: DomManager订阅消息并异步处理请求 4. **瓦片获取**: 从TileManager获取指定坐标的瓦片数据 5. **图像转换**: 将瓦片数据转换为PNG格式 6. **响应返回**: 返回PNG图像数据 ### 1.4 瓦片获取示例 ```cpp // HTTP请求示例 GET /dom/task123/tiles/15-12345-67890.png // 响应: PNG图像数据 Content-Type: image/png Access-Control-Allow-Origin: * ``` ## 2. CloudServer点云服务 ### 2.1 概述 CloudServer提供实时点云数据的HTTP接口,支持点云数据的发布、存储和获取。点云数据以PLY格式进行序列化,支持LZ4压缩。 ### 2.2 核心功能 - **点云发布**: 通过GSLAM Messenger发布点云数据到 `sbt.out.pcd` 主题 - **点云存储**: 自动缓存最近的点云数据(最多100个) - **HTTP接口**: 提供 `/livecloud` 端点获取最新点云数据 - **数据格式**: 支持PLY格式,包含点坐标和颜色信息 ### 2.3 数据格式 点云数据包含以下信息: - **Frame**: 包含位姿信息的帧对象 - **Points**: 3D点坐标数组 (Point3f) - **Colors**: RGB颜色数组 (Point3ub) ### 2.4 使用示例 #### 2.4.1 启动CloudServer ```cpp #include "TileServer/src/CloudServer.h" // 启动点云服务 startCloudServer(); ``` #### 2.4.2 发布点云数据 ```cpp #include // 创建frame auto frame = std::make_shared(0, 0); frame->setPose(GSLAM::SE3::exp(GSLAM::Vector6d(1.0, 2.0, 3.0, 0.1, 0.2, 0.3))); // 其中前三个是平移向量,坐标系是ECEF;后三个是旋转向量,分别表示x,y,z轴的旋转量 // 创建点云数据 std::vector points; std::vector colors; // 添加点云数据 for (int i = 0; i < 1000; ++i) { points.emplace_back(GSLAM::Point3f(i, i, i)); colors.emplace_back(GSLAM::Point3ub(255, 0, 0)); // 红色 } // 发布点云数据 sv::Svar cloudData = sv::Svar({frame, sv::Svar::create(points), sv::Svar::create(colors)}); GSLAM::Messenger::instance().publish("sbt.out.pcd", cloudData); ``` #### 2.4.3 通过HTTP获取点云数据 ```cpp #include "TileServer/src/httplib.h" // 创建HTTP客户端 httplib::Client client("localhost", 8080); // 发送GET请求 auto result = client.Get("/livecloud"); if (result && result->status == 200) { // 解析JSON响应 auto json_response = nlohmann::json::parse(result->body); if (json_response["code"] == "Success" && json_response.contains("cloud")) { std::string hex_data = json_response["cloud"]; // 从十六进制字符串还原点云数据 sv::Svar cloudData = frame_cloud_from_buffer_lz4(sv::SvarBuffer::fromHex(hex_data)); // 提取数据 GSLAM::FramePtr frame = cloudData[0].as(); std::vector points = cloudData[1].as>(); std::vector colors = cloudData[2].as>(); std::cout << "获取到点云数据,包含 " << points.size() << " 个点" << std::endl; } } ``` ### 2.5 数据序列化 CloudServer使用PLY格式序列化点云数据: ``` ply format binary_little_endian 1.0 comment pose: [位姿信息] element vertex [点数] property float32 x property float32 y property float32 z property uchar red property uchar green property uchar blue end_header [压缩标志] [点云数据] ``` ## 3. Tile Manager瓦片管理 ### 3.1 架构设计 Tile Manager采用文件系统存储,支持多种瓦片类型和压缩格式: - **TileManagerFileSystem**: 基础文件系统瓦片管理器 - **多投影支持**: 支持Mercator、GCJ02、Baidu、Tudou等投影 ### 3.2 瓦片存储结构 #### 文件命名规则 ``` {folder}/{z}_{x}_{y}.tile ``` 示例: ``` tilecache/15_12345_67890.tile ``` #### 目录结构 ``` project_home/ ├── taskid/ │ ├── terrainfusion/ │ │ └── tilecache/ └── area.txt ``` ### 3.3 核心接口 程序提供了两种瓦片管理器,分别是`TileManagerCached`、`TileManagerFileSystemLZ4`。其核心的方法都是`setTile`和`getTile`。 `TileManagerCached`实现了LRU缓存,当set或者get的时候,会优先从缓存中获取,如果缓存中没有,则从文件系统中获取,并缓存到内存中。 `TileManagerFileSystemLZ4`实现了文件系统存储和LZ4压缩,当set或者get的时候,会直接从文件系统中获取,并进行LZ4压缩。 ## 4. 使用示例 ### 4.1 启动瓦片服务 ```cpp // 创建HTTP服务 HttpService httpService; httpService.listen("0.0.0.0", 8080); // 启动DOM管理器和CloudServer startDomManager(); startCloudServer(); ``` ### 4.2 瓦片操作 ```cpp // 创建瓦片管理器 auto tileManager = std::make_shared>("tilecache"); // 设置瓦片 auto tile = std::make_shared(); tileManager->setTile(x, y, z, tile); // 获取瓦片 auto tile = tileManager->getTile(x, y, z); ``` ### 4.3 HTTP客户端访问 ```javascript // 获取瓦片图片 fetch('/dom/task123/tiles/15-12345-67890.png') .then(response => response.blob()) .then(blob => { const url = URL.createObjectURL(blob); // 显示瓦片 }); // 获取DOM信息 fetch('/dom/task123') .then(response => response.json()) .then(data => { console.log('DOM信息:', data); }); ``` ## 5. 示例程序 ### 5.1 编译 请确保已安装依赖(如OpenCV、C++17及以上编译器),然后在项目根目录下编译: ```bash mkdir build && cd build cmake .. make -j8 ``` ### 5.2 运行 直接运行生成的可执行文件: ```bash cd bin-linux ./TileServer ``` ### 5.3 功能说明 - 程序会自动在 `./test/terrainfusion/tilecache/` 目录下写入一个 256x256 的纯白RGB瓦片(z=0, x=0, y=0)。 - 自动创建 `area.txt`,设置瓦片范围。 - 启动HTTP服务,监听8080端口。 - 启动CloudServer点云服务,提供 `/livecloud` 接口。 - 执行点云发布和获取测试,验证CloudServer功能。 ### 5.4 浏览器访问 启动后,你可以在浏览器中访问: ``` http://localhost:8080/dom/test/tiles/0-0-0.png ``` 即可看到刚才写入的白色瓦片图片。 也可以通过以下接口获取点云数据: ``` http://localhost:8080/livecloud ``` 返回JSON格式的点云数据,包含十六进制编码的PLY格式点云。 ### 5.5 主要代码逻辑 - **TileManagerFileSystemLZ4** 用于瓦片的读写和压缩存储 - **DomManager** 负责瓦片业务逻辑 - **CloudServer** 负责点云数据的发布、存储和HTTP接口 - **HttpService** 提供HTTP接口,支持跨域 - 通过 `GSLAM::Messenger` 发布 `sbt.project_home`,DomManager自动获取项目路径 - 通过 `GSLAM::Messenger` 发布 `sbt.out.pcd`,CloudServer自动接收点云数据 ### 5.6 目录结构 ``` project_root/ # 所有项目根目录 ├── test/ # 测试项目名称 │ └── terrainfusion/ # 默认目录名 │ └── tilecache/ # 瓦片缓存目录 │ └── 0_0_0.tile # 瓦片文件 │ └── area.txt # 瓦片范围文件 ```