本文介绍了在 Linux(或 Windows 11 搭配 WSL)环境下,利用 Docker 进行 GeoServer 的开发与部署,从而实现本地调试与容器化管理,并使用 Cesium 加载 WMS 地图服务。

容器化部署

在开始之前,确保系统已正确安装 Docker。

1. 创建文件结构

在任意目录下新建一个文件夹,例如:

mkdir geoserver && cd geoserver

创建以下目录结构:

geoserver/
 ├─ docker-compose.yml
 ├─ data/           # GeoServer 配置与工作空间(自动生成)
 └─ mydatasets/     # 存放 shapefile、tiff 等数据

2. 编写 docker-compose.yml

将以下内容保存为 docker-compose.yml

services:
  geoserver:
    image: docker.osgeo.org/geoserver:2.28.x  # 使用的镜像,指定 GeoServer 版本
    container_name: geoserver  # 容器名称,方便管理
    ports:
      - "8080:8080"  # 映射端口,将宿主机 8080 映射到容器 8080
    volumes:
      - ./data:/opt/geoserver_data  # 数据卷挂载,将宿主机 ./data 目录映射到容器配置目录
      - ./mydatasets:/mnt/data  # 数据卷挂载,将宿主机 ./mydatasets 目录映射到容器数据目录
    environment:
      - CORS_ENABLED=true  # 容器环境变量,开启跨域访问
    restart: unless-stopped  # 容器重启策略,除非手动停止,否则出错会自动重启

3. 启动 GeoServer

在该目录下执行:

docker compose up -d

启动后,浏览器访问 http://localhost:8080/geoserver,首次运行时 GeoServer 会自动初始化 ./data 目录,默认用户名密码为:admin / geoserver

在这里插入图片描述

地图服务发布

GeoServer 的层级关系可以简明概括如下:

  • 工作空间(Workspace):顶层命名空间,用于区分不同项目或主题的数据。
  • 数据存储(Data Store):指向具体的数据源,如 Shapefile、PostGIS 等,管理底层数据。
  • 图层(Layer):可发布的最小数据单元,对应一个空间数据集,可通过 WMS/WFS 访问。
  • 图层组(Layer Group):将多个图层组合发布,便于客户端一次性显示多个图层。

简言之:工作空间 → 数据存储 → 图层 → 图层组,层层组织,便于管理和发布空间数据。

1. 工作空间

点击左侧边栏的 “工作空间”,然后选择 “添加新的工作空间”

GeoServer 中创建工作空间时需填写以下内容:

  • Name(名称):工作空间的唯一标识,用于分组图层。建议使用简短的小写英文(如 chinademo)。
  • Namespace URI(命名空间 URI):全局唯一标识,格式类似网址,不必能访问(如 http://localhost/geoserver/china)。

建议:

  • Name 与 Namespace URI 保持一致性,例如 Name 为 china,对应 URI 为 http://example.com/geoserver/china
  • Namespace URI 统一加上 /geoserver/ 前缀以区分来源;
  • 按项目或专题划分工作空间,便于管理与服务发布。

在这里插入图片描述

2. 存储仓库

点击左侧边栏的 “存储仓库”,然后选择 “添加新的存储仓库”

根据需要新建矢量数据源(如 Shapefile)或其他类型数据源。

在这里插入图片描述

填写以下关键项:

  • 工作空间:选择已创建的工作空间;
  • 数据源名称:为数据源命名;
  • Shapefile 文件位置:指定文件路径。

确保 GeoServer 的 /mydatasets 文件夹中有目标数据并已通过 Docker 挂载。

路径填写示例:file:///mnt/data

在这里插入图片描述

3. 图层

点击左侧边栏的 “存储仓库”,然后选择 “添加新的资源”

选择对应的 工作空间:存储仓库 来添加目标图层。

在这里插入图片描述

可直接从数据中计算边框(经纬度范围)

在这里插入图片描述

添加完成后,点击左侧边栏的 “图层预览”,选择刚添加的图层,并使用 OpenLayers 查看。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4. 图层组

点击左侧边栏的 “图层组”,然后选择 “添加新图层组”

为图层组命名,并添加已有图层(上方图层优先显示)。

可点击“生成边界”自动计算范围。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

创建完成后,可在“图层预览”中查看结果:

在这里插入图片描述

WMS 服务调用

本示例展示了如何在 Cesium 中加载 GeoServer 内置的 WMS 图层(以 ne:countries 为例)。
Cesium 通过 WebMapServiceImageryProvider 连接 GeoServer 提供的 WMS 服务,实现地图影像的动态加载与展示。

  • GeoServer 服务地址http://localhost:8080/geoserver/ne/wms
  • 图层名称ne:countries(Natural Earth 内置示例数据)
  • 坐标系EPSG:4326
<!DOCTYPE html>
<html lang="zh">

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Cesium 加载 GeoServer WMS 示例</title>
    <script>
        // 设置 Cesium 资源加载的基础路径
        window.CESIUM_BASE_URL = 'https://cdn.bootcdn.net/ajax/libs/cesium/1.130.1';
    </script>
    <!-- 引入 Cesium JS 核心库 -->
    <script src="https://cdn.bootcdn.net/ajax/libs/cesium/1.130.1/Cesium.min.js"></script>
    <!-- 引入 Cesium 基础样式 -->
    <link href="https://cdn.bootcdn.net/ajax/libs/cesium/1.130.1/Widgets/widgets.min.css" rel="stylesheet">
    <style>
        html,
        body,
        #cesiumContainer {
            width: 100%;
            height: 100%;
            margin: 0;
            padding: 0;
        }
    </style>
</head>

<body>
    <div id="cesiumContainer"></div>
    <script>
        // 配置常量
        const GEOSERVER_URL = 'http://localhost:8080/geoserver/ne/wms';
        const WMS_LAYER = 'ne:countries';
        const WMS_PARAMS = {
            service: 'WMS',
            version: '1.1.0',
            request: 'GetMap',
            transparent: true,
            format: 'image/png',
            srs: 'EPSG:4326'
        };

        Cesium.Ion.defaultAccessToken = null;

        const viewer = new Cesium.Viewer('cesiumContainer', {
            imageryProvider: false,                // 不加载默认影像
            terrainProvider: new Cesium.EllipsoidTerrainProvider(), // 使用默认椭球体地形

            /* 关闭 Cesium 默认 UI 控件 */
            animation: false,           // 动画控件
            timeline: false,            // 时间轴
            baseLayerPicker: false,     // 图层选择器
            homeButton: false,          // 首页按钮
            geocoder: false,            // 地名搜索
            sceneModePicker: false,     // 2D/3D 切换
            navigationHelpButton: false,// 帮助按钮
            fullscreenButton: false,    // 全屏按钮
            vrButton: false,            // VR 模式按钮
            infoBox: false,             // 信息框
            selectionIndicator: false,  // 选择指示器

            // 隐藏 Cesium 默认 logo
            creditContainer: document.createElement('div')
        });


        // 创建 WMS 影像提供器
        const wmsProvider = new Cesium.WebMapServiceImageryProvider({
            url: `${GEOSERVER_URL}?`,
            layers: WMS_LAYER,
            parameters: WMS_PARAMS
        });

        // 添加到影像层
        viewer.imageryLayers.addImageryProvider(wmsProvider);
    </script>
</body>

</html>

在这里插入图片描述

总结

本文通过 Docker 容器化部署 GeoServer,并结合 Cesium 前端加载 WMS 服务,完整展示了从地图数据发布到浏览器端可视化的基本流程。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐