WebGIS开发入门教程七: 地图服务咋发?GeoServer咋用?

GIS基础理论
Dr.GIS
wowwwai GIS研习社 · 工具流程与项目排障

在这篇《WebGIS开发入门教程七: 地图服务咋发?GeoServer咋用?》里,我们解决一个非常具体的问题:手里有矢量数据、栅格数据或数据库空间表,怎样把它们发布成 WebGIS 前端可以访问的地图服务,并用 GeoServer 管理、预览和调用。

很多同学学到 WebGIS 前端时,会用 Leaflet、OpenLayers 加载在线底图,但一旦换成自己的业务数据,就不知道“服务从哪里来”。GeoServer 正是 WebGIS 开发入门阶段最常用的开源地图服务器之一,它可以把 Shapefile、GeoTIFF、PostGIS 等数据发布为 WMS、WFS、WMTS 等标准服务。

WebGIS开发入门教程 GeoServer发布地图服务流程
GeoServer 发布地图服务的基本链路:数据源、工作区、图层、服务接口与前端调用。

引言:WebGIS开发入门为什么绕不开 GeoServer

WebGIS 的核心不是只把地图画出来,而是让空间数据可以通过网络被查询、渲染和交互。前端库负责显示地图,后端地图服务负责把空间数据转换成浏览器能访问的瓦片、图片或要素。

GeoServer 的作用可以简单理解为:把 GIS 数据“翻译”成标准 Web 地图服务。你不用自己从零实现坐标转换、空间查询、地图切片和样式渲染,只需要正确配置数据源、图层、坐标系和服务参数。

本教程适合 GIS 学生、WebGIS 初学者、刚接触地图服务发布的开发人员。重点不是讲所有理论,而是带你完成一次可复现的 GeoServer 发布地图服务流程。

背景:地图服务到底是怎么“发”出来的

在桌面 GIS 里,我们通常直接打开 Shapefile、GeoPackage、GeoTIFF 或数据库图层。但在 WebGIS 里,浏览器不能直接读取服务器磁盘上的 GIS 文件,也不适合一次性下载大型空间数据。

所以需要一个地图服务器放在中间:

  • 读取空间数据源,例如 Shapefile、PostGIS、GeoTIFF。
  • 根据请求范围、坐标系、比例尺和样式生成地图结果。
  • 通过 HTTP 接口返回给前端,例如 WMS 图片、WFS 要素、WMTS 瓦片。
  • 让 Leaflet、OpenLayers、Cesium 等前端框架加载和展示。

这就是“地图服务发布”的本质。GeoServer 不是单纯上传文件的工具,而是一个把空间数据变成标准服务接口的 GIS 服务平台。

原理:GeoServer 的工作区、数据存储、图层和服务

刚开始使用 GeoServer 时,最容易混淆的是几个概念:工作区、数据存储、图层、样式和服务。理解它们之间的关系,后面配置就不容易乱。

1. 工作区 Workspace

工作区可以理解为项目或业务命名空间。例如你可以创建一个 demo 工作区,把本教程测试数据都放进去。工作区会出现在服务 URL 和图层名称中,例如 demo:roads

2. 数据存储 Store

数据存储是 GeoServer 连接真实数据的位置。它可以是一个 Shapefile 文件,也可以是一个 PostGIS 数据库连接,还可以是一个 GeoTIFF 栅格文件。

常见数据存储包括:

  • Shapefile:适合入门测试和小型矢量数据。
  • PostGIS:适合正式项目、多用户维护和空间查询。
  • GeoTIFF:适合 DEM、影像、栅格专题图。
  • GeoPackage:适合单文件交换和中小型数据管理。

3. 图层 Layer

图层是 GeoServer 对外发布的服务对象。一个数据存储中可能包含一个或多个图层。发布图层时,要确认坐标系、边界范围、样式和服务开关。

4. 样式 Style

样式决定地图显示效果。GeoServer 常用 SLD 文件定义样式,例如线颜色、面填充、点符号、分类渲染等。初学时可以先使用默认样式,能成功预览服务后再调整样式。

5. WMS、WFS、WMTS

GeoServer 支持多种 OGC 标准服务。入门阶段最常用的是:

  • WMS:返回地图图片,适合快速显示地图。
  • WFS:返回矢量要素,适合前端查询、点击、高亮和属性展示。
  • WMTS:返回瓦片,适合高并发和大范围浏览。

如果你只是想把图层显示在网页地图上,先用 WMS 最简单。如果需要前端拿到真实几何和属性,再考虑 WFS。如果数据量大、访问频繁,再考虑切片和缓存。

步骤:用 GeoServer 发布一个 Shapefile 地图服务

下面以 Shapefile 为例,演示一次完整的 GeoServer 发布地图服务流程。正式项目中推荐使用 PostGIS,但 Shapefile 更适合入门理解。

步骤一:准备数据

准备一个完整的 Shapefile 数据集,至少应包含以下文件:

  • .shp:几何数据。
  • .shx:几何索引。
  • .dbf:属性表。
  • .prj:坐标系信息。

如果缺少 .prj 文件,GeoServer 可能无法自动识别坐标系,后续地图叠加容易出现位置偏移。

建议先在 QGIS 或 ArcGIS Pro 中打开数据,检查:

  • 图层能否正常显示。
  • 坐标系是否明确。
  • 属性表字段是否存在乱码。
  • 数据范围是否合理。
  • 几何是否存在明显错误。

步骤二:登录 GeoServer 管理后台

启动 GeoServer 后,在浏览器访问管理后台地址,常见形式为:

http://localhost:8080/geoserver

默认情况下,本机测试环境常用账号为:

用户名:admin
密码:geoserver

正式服务器一定要修改默认密码,并限制后台访问权限。不要把默认账号暴露在公网环境中。

步骤三:创建工作区

进入 GeoServer 后台,找到 工作区,新建一个工作区,例如:

名称:demo
命名空间 URI:http://www.gisyxs.com/demo

命名空间 URI 不一定必须真实可访问,但应保持唯一,避免多个项目之间图层命名混乱。

步骤四:创建 Shapefile 数据存储

进入 数据存储,选择 添加新的数据存储,选择 Shapefile

常见配置如下:

  • 工作区:选择刚才创建的 demo。
  • 数据源名称:例如 roads_store。
  • Shapefile 文件位置:选择服务器上的 .shp 文件路径。
  • 字符集:根据数据设置,例如 UTF-8、GBK。

如果属性表中文乱码,优先检查这里的字符集。国内历史数据常见 GBK 编码,而新项目建议统一 UTF-8。

步骤五:发布图层

保存数据存储后,GeoServer 通常会提示发布图层。点击发布,进入图层配置页面。

重点检查以下几项:

  • 名称:图层名,建议使用英文、数字和下划线。
  • 标题:可写中文,便于后台识别。
  • 坐标参考系统:确认 EPSG 编码是否正确。
  • 边界框:点击从数据计算、从原生边界计算。
  • 默认样式:先使用 GeoServer 默认样式即可。

边界框非常重要。如果边界框为空或错误,图层预览可能显示空白,前端请求也可能看不到数据。

步骤六:用图层预览验证 WMS 服务

发布完成后,进入 图层预览,找到刚才发布的图层,例如:

demo:roads

点击 OpenLayers 预览。如果能看到地图,说明 WMS 服务基本发布成功。

典型 WMS 请求地址类似:

http://localhost:8080/geoserver/demo/wms?service=WMS&version=1.1.0&request=GetMap&layers=demo:roads&styles=&bbox=...&width=768&height=512&srs=EPSG:4326&format=image/png

不要被 URL 参数吓到。核心参数主要是:

  • service=WMS:请求 WMS 服务。
  • request=GetMap:请求地图图片。
  • layers=demo:roads:请求的图层。
  • srs 或 crs:请求坐标系。
  • bbox:请求地图范围。
  • width 和 height:输出图片尺寸。
  • format=image/png:输出图片格式。

步骤七:在 OpenLayers 中调用 GeoServer WMS

如果你的 WebGIS 前端使用 OpenLayers,可以用 WMS 图层方式加载 GeoServer 服务。示例代码如下:

const geoserverWmsLayer = new ol.layer.Image({
  source: new ol.source.ImageWMS({
    url: 'http://localhost:8080/geoserver/demo/wms',
    params: {
      'LAYERS': 'demo:roads',
      'TILED': true
    },
    ratio: 1,
    serverType: 'geoserver'
  })
});

map.addLayer(geoserverWmsLayer);

如果前端页面和 GeoServer 不在同一个域名、端口或协议下,可能会遇到跨域问题。开发测试时常见解决方式是配置 GeoServer 的 CORS,或通过 Nginx 做同源反向代理。

步骤八:在 Leaflet 中调用 GeoServer WMS

Leaflet 加载 WMS 也很直接:

var roadsLayer = L.tileLayer.wms('http://localhost:8080/geoserver/demo/wms', {
  layers: 'demo:roads',
  format: 'image/png',
  transparent: true,
  version: '1.1.0'
});

roadsLayer.addTo(map);

如果叠加到底图上位置不对,优先检查数据坐标系、前端地图坐标系、WMS 请求版本和坐标轴顺序。

常见坑:GeoServer 发布地图服务看不到图层怎么办

1. 图层预览是空白

图层预览空白通常不是 GeoServer “坏了”,而是范围、坐标系或样式出现问题。

  • 检查图层边界框是否已计算。
  • 检查数据真实范围是否异常,例如经纬度数据却显示成几百万坐标值。
  • 检查 EPSG 编码是否正确。
  • 检查样式是否把线或面设置成透明。
  • 检查数据是否为空图层。

2. WMS 能预览,前端加载不到

这种情况通常是前端请求问题,而不是发布失败。

  • 浏览器控制台是否有跨域 CORS 错误。
  • GeoServer 地址是否能从前端所在机器访问。
  • 图层名是否包含工作区前缀,例如 demo:roads。
  • WMS version、crs、srs 参数是否和前端库配置匹配。
  • 前端地图视图是否定位到图层所在范围。

3. 中文属性乱码

Shapefile 的中文乱码多半与 DBF 编码有关。发布数据存储时要设置正确字符集。若仍然乱码,建议在 QGIS 中另存为 UTF-8 编码的 GeoPackage 或导入 PostGIS。

4. 图层叠加位置偏移

位置偏移常见原因是坐标系不一致。WebGIS 常用底图多为 Web Mercator,即 EPSG:3857;而业务数据可能是 EPSG:4326、CGCS2000、高斯投影或地方坐标系。

处理思路是:

  • 先在桌面 GIS 中确认数据原始坐标系。
  • 不要随意“指定坐标系”冒充“投影转换”。
  • 需要转换时使用 QGIS、ArcGIS Pro、GDAL 或 PostGIS 正确重投影。
  • 前端地图和 GeoServer 请求坐标系要保持可转换。

5. 数据发布后访问很慢

GeoServer 直接渲染大数据时,WMS 请求可能变慢。尤其是复杂面、大量线要素、未建索引的 PostGIS 表、复杂 SLD 样式,都会影响性能。

  • 矢量数据尽量导入 PostGIS,并创建空间索引。
  • 按比例尺控制样式显示规则。
  • 大范围浏览使用 GeoWebCache 缓存瓦片。
  • 简化过密线面数据,避免前端一次请求过多细节。

方法比较:WMS、WFS、WMTS 该怎么选

服务类型 返回内容 适合场景 注意事项
WMS 地图图片 快速展示专题图、叠加业务图层 前端拿不到完整几何,交互查询需要额外请求
WFS 矢量要素和属性 点击查询、编辑、空间分析、前端高亮 数据量大时容易慢,需要过滤和分页
WMTS 地图瓦片 高并发浏览、底图、稳定专题图 实时性较弱,样式或数据变化后需要更新缓存
GeoJSON 接口 矢量 JSON 小数据量前端展示、简单接口开发 大数据量会导致浏览器卡顿

入门阶段推荐顺序是:先发布 WMS 验证图层能显示,再根据业务需要开启 WFS 查询,最后对访问频繁的图层配置 WMTS 或 GeoWebCache。

检查清单:GeoServer 发布地图服务前后要核对什么

每次发布 GeoServer 地图服务,都建议按下面清单检查。这样比反复猜错误更高效。

数据检查

  • 数据能否在 QGIS 或 ArcGIS Pro 中正常打开。
  • 坐标系是否明确,是否有 .prj 或数据库 SRID。
  • 属性字段是否有乱码、超长字段名或异常类型。
  • 几何是否有效,是否存在空几何。
  • 数据范围是否符合实际位置。

GeoServer 配置检查

  • 工作区名称是否清晰。
  • 数据存储连接是否成功。
  • 图层坐标参考系统是否正确。
  • 边界框是否重新计算。
  • 默认样式是否能正常渲染。
  • 图层预览是否能打开。

前端调用检查

  • 服务 URL 是否可访问。
  • 图层名是否写成“工作区:图层名”。
  • 浏览器控制台是否有跨域错误。
  • 地图初始中心点和缩放级别是否落在图层范围内。
  • WMS 版本和坐标系参数是否匹配。
  • 是否需要透明背景叠加到底图上。

FAQ:GeoServer 发布地图服务常见问题

GeoServer 可以直接发布 Shapefile 吗?

可以。GeoServer 支持直接发布 Shapefile,适合入门学习和简单测试。但正式项目更推荐 PostGIS,因为数据库更利于权限管理、空间索引、并发访问和数据维护。

GeoServer 发布的 WMS 和 WFS 有什么区别?

WMS 返回的是地图图片,适合展示;WFS 返回的是矢量要素和属性,适合查询和交互。WebGIS开发入门阶段可以先用 WMS 显示图层,再用 WFS 做点击查询或属性展示。

为什么 GeoServer 图层预览正常,Leaflet 或 OpenLayers 里不显示?

常见原因包括跨域限制、服务地址写错、图层名缺少工作区前缀、前端地图没有定位到图层范围,以及坐标系参数不匹配。先打开浏览器开发者工具,看 Network 和 Console 报错最直接。

GeoServer 需要和 Web 前端部署在同一台服务器吗?

不一定。GeoServer 可以单独部署,前端项目也可以部署在另一台服务器。但跨域、网络访问、防火墙、反向代理和 HTTPS 配置需要统一规划。生产环境常用 Nginx 代理 GeoServer 服务。

GeoServer 发布地图服务一定要切片吗?

不一定。小数据量或实时变化数据可以直接用 WMS。访问频繁、范围大、样式稳定的图层更适合使用 GeoWebCache 或 WMTS 切片,提高浏览速度并减轻服务器压力。

GeoServer 能发布 PostGIS 数据吗?

能,而且这是正式 WebGIS 项目中非常常见的组合。PostGIS 负责存储和空间查询,GeoServer 负责服务发布和地图渲染。发布前要确认空间表有正确 SRID,并为几何字段创建空间索引。

结论:先跑通 WMS,再逐步扩展到 WFS 和瓦片服务

WebGIS开发入门教程七的重点可以归纳为一句话:地图服务不是前端凭空来的,而是由 GeoServer 这类地图服务器把空间数据发布成标准接口。

实际学习时,建议按这个顺序推进:先准备一份坐标系正确的数据,在 GeoServer 中创建工作区和数据存储,发布图层并用图层预览验证 WMS,然后再接入 Leaflet 或 OpenLayers。等显示稳定后,再考虑 WFS 查询、SLD 样式、PostGIS 数据源和 GeoWebCache 瓦片缓存。

只要理解“数据源 → GeoServer 图层 → 标准地图服务 → WebGIS 前端调用”这条链路,后续无论你做城市管网、自然资源、应急指挥还是行业专题图,地图服务发布的思路都是相通的。