OSM 离线地图服务私有化部署方案

1. 部署目标与环境

  • 目标:构建完全离线、内网可用的 OSM 瓦片地图服务,为 Filament (Laravel 12) 系统提供底层地图支持。
  • 硬件环境:Dell Precision 7920 工作站 (Xeon Silver 4210R / 32GB 内存 / SSD RAID)。
  • 数据范围:山东省全量矢量数据 (包含招远市全境)。
  • 核心技术栈:Docker, PostgreSQL + PostGIS, Renderd, Apache/Mod_tile。

2. 核心部署流程 (Docker)

为确保数据索引完整且避免镜像自动下载示例数据(卢森堡问题),采用全量导入 + 绝对路径挂载策略。

第一步:环境初始化

确保无脏数据残留。

1
2
docker rm -f osm-server
docker volume rm osm-data-volume

第二步:高性能数据导入 (Import)

针对 Xeon 处理器和 SSD RAID 进行参数调优,最大化利用硬件性能。

  • 源文件shandong-latest.osm.pbf (约 67MB)。
  • 挂载策略:必须将宿主机文件挂载到容器内的 /data/region.osm.pbf,以覆盖默认行为。
  • 性能参数
  • THREADS=18:利用多核并行处理。
  • OSM2PGSQL_CACHE=8000:分配 8GB 内存用于构建空间索引。
1
2
3
4
5
6
7
docker run --rm \
-v /home/wangkai/code/osm/shandong-260128.osm.pbf:/data/region.osm.pbf \
-v osm-data-volume:/var/lib/postgresql/15/main \
-e THREADS=18 \
-e OSM2PGSQL_CACHE=8000 \
overv/openstreetmap-tile-server \
import

第三步:启动服务 (Run)

启动渲染引擎与 Web 服务。

1
2
3
4
5
docker run -p 8080:80 \
-v osm-data-volume:/var/lib/postgresql/15/main \
-d --name osm-server \
overv/openstreetmap-tile-server \
run

3. 服务可用性验证

方式 A:数据库层核验

通过 SQL 确认地理实体是否已入库(以招远地标为例)。

1
2
3
4
-- 验证道路数据
SELECT name, ST_AsText(way) FROM planet_osm_line WHERE name = '罗峰路';
-- 验证区域数据
SELECT name FROM planet_osm_point WHERE name LIKE '%招远%';

方式 B:瓦片服务直连

访问招远市中心坐标对应的瓦片 URL,确认渲染正常。

  • 测试地址http://localhost:8080/tile/15/27331/13146.png
  • 预期结果:返回包含中文街道信息的 PNG 图片。

4. 前端集成方案 (Filament PHP)

在 Laravel/Filament 系统中接入离线底图。核心逻辑是锁定初始视口,确保用户打开地图即聚焦于目标区域。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
use DotsWan\FilamentMap\Fields\Map;

public static function form(Form $form): Form
{
return $form->schema([
Map::make('location')
->label('地理位置选择') // 通用标签
->leafletOptions([
// 指向本地 Docker 瓦片服务
'tileLayer' => 'http://localhost:8080/tile/{z}/{x}/{y}.png',
'attribution' => '© OpenStreetMap contributors',
'maxZoom' => 18,
])
// 【关键配置】初始化聚焦坐标:招远市中心
->defaultLocation([37.3615, 120.4042])
->zoom(15) // 街道级默认缩放
->clickable(true)
]);
}

·

5. 扩展方案:自定义区域切割 (可选)

若需剥离特定行政区划(如仅保留招远市轮廓),可使用 osmium 工具链。

  1. 定义边界:使用 GeoJSON 定义多边形范围,并导出为 zhaoyuan.geojson。
  2. 执行切割
    1
    osmium extract -p zhaoyuan.geojson shandong-latest.osm.pbf -o zhaoyuan.osm.pbf
  3. 重载数据:使用新生成的 .pbf 文件重复“第二步”导入流程。

6. 运维参数

  • 资源占用

  • 磁盘:约 2GB - 3GB (含数据库与基础缓存)。

  • 内存:建议预留 4GB 以上给 Docker 容器。

  • 数据更新:只需下载最新的山东省 PBF 文件,重新执行 Clean -> Import 流程即可(耗时 < 5分钟)。

  • 网络要求:部署过程中需短暂联网下载全球水体数据(约 800MB),之后运行过程完全离线