【GIS】GeoServer:地图服务容器发布与调用
本文介绍了在 Linux(或 Windows 11 搭配 WSL)环境下,利用 Docker 进行 GeoServer 的开发与部署,从而实现本地调试与容器化管理,并使用 Cesium 加载 WMS 地图服务。
本文介绍了在 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(名称):工作空间的唯一标识,用于分组图层。建议使用简短的小写英文(如
china、demo)。 - 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 服务,完整展示了从地图数据发布到浏览器端可视化的基本流程。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)