GeoServer学习笔记

学习时间:2025年3月30日

官网:https://geoserver.org/

文档地址:https://docs.geoserver.org/2.21.x/en/user/

1 基本概念

1.1 介绍

GeoServer 是一个开源的 Web GIS 服务器,用于发布、管理和共享地理数据。它支持多种 GIS 格式,如 Shapefile、PostGIS、GeoTIFF、KML、GML、GeoJSON、WMS/WFS 等,并能够将这些数据以 Web 服务的形式提供给地图应用(如 Mapbox、OpenLayers、Leaflet、QGIS)。

GeoServer 是用 Java 语言开发的,基于 Spring 框架 构建,并使用 GeoTools 作为核心 GIS 处理库。它是一个标准的 Java Web 应用,通常运行在 Tomcat、Jetty 等 Servlet 容器中。

1.2 核心功能

功能 描述
数据发布 支持矢量(Shapefile、PostGIS、GeoJSON)和栅格(GeoTIFF、NetCDF)
Web 地图服务 提供 WMS(地图)、WFS(矢量数据)、WCS(栅格数据)、WMTS(瓦片地图)
数据存储 兼容 PostGIS、Oracle Spatial、MySQL、SQL Server
投影转换 支持 CRS 坐标转换(EPSG:4326、EPSG:3857 等)
权限管理 用户认证,基于角色的访问控制(LDAP、OAuth)
性能优化 结合 GeoWebCache 进行瓦片缓存
扩展插件 可扩展 WPS(Web 处理服务)、3D 建模、时间序列数据

GeoServer 是 OGC(开放地理空间联盟)标准的实现,广泛用于企业 GIS、政府机构、科研单位等。

1.3 支持的数据格式

支持矢量数据和栅格数据。

在 GIS(地理信息系统)中,数据主要分为 矢量数据(Vector Data)栅格数据(Raster Data)。不同的数据格式适用于不同的应用场景,如 Web 地图、遥感影像分析、空间数据库等。

  • Shapefile(.shp)

  • PostGIS(PostgreSQL GIS 扩展)

  • GeoJSON

  • GML / KML

  • CSV / Excel

  • GeoTIFF(遥感影像)

  • NetCDF(气象数据)

  • JPEG2000

1.3.1 矢量数据

矢量数据用 点(Point)、线(Line)、面(Polygon) 来表示地理对象,例如道路、建筑物、河流、行政边界等。

① Shapefile

Shapefile是ESRI(环境系统研究所)开发的一种矢量数据格式,广泛用于 GIS 软件(如 ArcGIS、QGIS)。

  • 文件结构:Shapefile 实际上由多个文件组成:
    • .shp(几何数据)
    • .shx(索引)
    • .dbf(属性表,类似 Excel)
    • .prj(坐标系信息,可选)
② PostGIS

③ GeoJSON

GeoJSON(Geographic JSON)是一种基于 JSON(JavaScript Object Notation) 的地理数据格式,主要用于存储和交换 矢量数据(点、线、面、多边形)

它广泛应用于 Web GIS 开发,例如 Mapbox、Leaflet、OpenLayers、GeoServer 等都支持 GeoJSON 作为数据格式。

GeoJSON 主要包含以下几种几何类型(geometry):

  • Point(点)
  • MultiPoint(多点)
  • LineString(线)
  • MultiLineString(多条线)
  • Polygon(多边形)
  • MultiPolygon(多个多边形)
  • GeometryCollection(几何集合)

此外,GeoJSON 还支持 Feature(地理要素)和 FeatureCollection(要素集合)。

基本格式:type-geometry-properties

1
2
3
4
5
6
7
8
9
10
{
"type": "Feature", // 地理要素
"geometry": {
"type": "Point", // 几何类型
"coordinates": [116.4074, 39.9042] // 经纬度
},
"properties": { // 自定义属性
"name": "Beijing"
}
}

示例

  • Point
1
2
3
4
5
6
7
8
9
10
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [116.4074, 39.9042]
},
"properties": {
"name": "Beijing"
}
}
  • LineString
1
2
3
4
5
6
7
8
9
10
11
12
13
{
"type": "Feature",
"geometry": {
"type": "LineString",
"coordinates": [
[116.4074, 39.9042],
[121.4737, 31.2304]
]
},
"properties": {
"name": "Beijing to Shanghai"
}
}
  • Polygon
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
"type": "Feature",
"geometry": {
"type": "Polygon",
"coordinates": [
[
[116.4, 39.9],
[116.5, 39.9],
[116.5, 40.0],
[116.4, 40.0],
[116.4, 39.9]
]
]
},
"properties": {
"name": "Beijing Area"
}
}
  • FeatureCollection
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 表示多个城市的点数据
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [116.4074, 39.9042]
},
"properties": { "name": "Beijing" }
},
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [121.4737, 31.2304]
},
"properties": { "name": "Shanghai" }
}
]
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// 包含不同地理类型
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [116.4074, 39.9042]
},
"properties": {
"name": "Beijing"
}
},
{
"type": "Feature",
"geometry": {
"type": "LineString",
"coordinates": [
[116.4074, 39.9042],
[121.4737, 31.2304]
]
},
"properties": {
"name": "Beijing to Shanghai"
}
}
]
}
④ GML

全称Geography Markup LanguageXML 格式的矢量数据,用于数据交换(如 WFS 服务)。比 GeoJSON 复杂,适合大规模 GIS 数据存储。

1
2
3
<gml:Point>
<gml:coordinates>116.4074,39.9042</gml:coordinates>
</gml:Point>
⑤ KML

全称Keyhole Markup Language,是Google Earth / Google Maps 使用的 XML 格式,可用于存储点、线、面、图标、样式等。

1
2
3
4
5
6
<Placemark>
<name>Beijing Airport</name>
<Point>
<coordinates>116.4074,39.9042</coordinates>
</Point>
</Placemark>

1.3.2 栅格数据

栅格数据(Raster Data)使用 像素(Pixel) 存储地理信息,适用于遥感影像、高度数据等。

① GeoTIFF

TIFF 格式的地理数据,存储卫星影像、高程数据。

② NetCDF

专门用于存储时间序列数据(如气象、海洋数据)

③ JPEG2000

压缩比的 栅格数据格式,适用于 网络地图

1.3.3 总结

数据类型 适用场景 推荐使用
Shapefile 本地 GIS 分析 ArcGIS、QGIS
PostGIS 大规模 GIS 数据 Web GIS、数据库
GeoJSON Web GIS Mapbox、Leaflet
KML Google Earth 3D 可视化
GeoTIFF 遥感影像 QGIS、GIS 计算
NetCDF 气象、海洋 Python、科学计算

1.4 提供的Web服务

GeoServer 支持 OGC 标准,主要提供以下Web服务:

服务 标准 功能 URL 示例
Web Map Service(WMS) OGC WMS 渲染地图图层(PNG/JPEG) http://localhost:8080/geoserver/ows[wms]?service=WMS
Web Feature Service(WFS) OGC WFS 获取矢量数据(GeoJSON / GML) http://localhost:8080/geoserver/ows[wfs]?service=WFS
Web Coverage Service(WCS) OGC WCS 获取栅格数据(GeoTIFF) http://localhost:8080/geoserver/ows[wcs]?service=WCS
Web Map Tile Service(WMTS) OGC WMTS 提供地图瓦片(TMS 格式) http://localhost:8080/geoserver/gwc/service/wmts

注:

  • /ows:通用 OGC 服务入口(WMS/WFS/WCS),需要通过 service= 参数来指定使用的是 WMS、WFS 还是 WCS。
  • /gwc :GeoServer 内嵌的 GeoWebCache(GWC)服务接口,用于提供 瓦片缓存服务,核心用于高性能地图渲染,用于WMTSTMS

1.4.1 WMS

WMS 提供地图渲染服务,将地理数据以 栅格图像(PNG、JPEG 等) 返回给客户端。适用于展示静态地图,不支持矢量数据查询或交互。

获取 WMS 服务的能力描述:

1
http://localhost/geoserver/{workspace}/wms?service=WMS&request=GetCapabilities

一个URL示例:

1
2
3
4
5
6
7
8
9
10
11
http://localhost/geoserver/{workspace}/wms?
service=WMS&
version=1.1.1&
request=GetMap&
layers={workspace}:{layer}&
styles=&
bbox=-180,-90,180,90&
width=256&
height=256&
srs=EPSG:4326&
format=image/png

在 Mapbox 中,可以使用 raster 栅格数据源加载 WMS 服务:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
map.addSource('wms-source', {
'type': 'raster',
'tiles': [
'http://localhost/geoserver/cite/wms?service=WMS&version=1.1.1&request=GetMap&layers=cite:your_layer&styles=&bbox=-180,-90,180,90&width=256&height=256&srs=EPSG:4326&format=image/png'
],
'tileSize': 256
});

map.addLayer({
'id': 'wms-layer',
'type': 'raster',
'source': 'wms-source',
'paint': {}
});

1.4.2 WFS

WFS 提供 矢量数据服务(GeoJSON、GML),支持空间查询和交互。适用于动态交互,如点击获取要素信息、编辑地理数据。

获取 WFS 服务的能力描述:

1
http://localhost/geoserver/{workspace}/wfs?service=WFS&request=GetCapabilities

Mapbox 支持 geojson 作为数据源,可以通过 WFS 获取矢量数据并添加到 geojson 数据源中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
map.value.addSource('parking-stand-location-source', {
type: 'geojson',
data: 'http://localhost/geoserver/{workspace}/ows?service=WFS&version=1.0.0&request=GetFeature&typeName={workspace}:{layer}&outputFormat=application/json'
});

map.value.addLayer({
id: "parking-stand-location-layer",
type: "symbol",
source: "parking-stand-location-source",
"minzoom": 13.8,
layout: {
"text-field": ["get", "RESOURCE_C"],
"text-size": 13,
"text-font": ["Open Sans Semibold", "Arial Unicode MS Bold"],
"text-offset": ["get", "textOffset"],
"text-anchor": "top",
"text-allow-overlap": false,
"visibility": "visible"
}
});

注:url中ows可以替换成wfs

1.4.3 WCS

WCS 提供 栅格数据服务(DEM、高程数据、遥感影像),可以下载或处理数据。适用于分析高程、气象数据等。

Mapbox 不支持 WCS。

1.4.4 WMTS

WMTS 提供 瓦片地图(Tile Map) 服务,将地图切片为多个小块,提高加载速度。适用于高效地图渲染,尤其是大范围地图数据。

Mapbox 支持 raster 图层来加载栅格瓦片,以及支持vector图层加载矢量瓦片。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
map.addSource('wmts-source', {
'type': 'raster',
'tiles': [
'http://localhost/geoserver/gwc/service/wmts?layer=cite:your_layer&tilematrixset=EPSG:3857&Service=WMTS&Request=GetTile&Version=1.0.0&Format=image/png&TileMatrix={z}&TileRow={y}&TileCol={x}'
],
'tileSize': 256
});

map.addLayer({
'id': 'wmts-layer',
'type': 'raster',
'source': 'wmts-source',
'paint': {}
});

1.4.5 总结

服务 数据类型 主要用途 Mapbox 加载方式
WMS 栅格图像(PNG/JPEG) 静态地图展示 raster 图层
WMTS 预渲染瓦片(Tail) 高效地图渲染 raster 图层
WFS 矢量数据(GeoJSON/GML) 交互式地图 geojson 图层
WCS 栅格数据(DEM/遥感) 数据分析 不支持

1.5 部署

这里讲解Linux的部署,将二进制包解压后,运行:

1
nohup /path/to/geoserver/bin/startup.sh > /dev/null 2>&1 &

此外需要添加跨域配置:在/webapps/geoserver/WEB-INF/web.xml添加以下内容:

1
2
3
4
5
6
7
8
<filter>
<filter-name>cross-origin</filter-name>
<filter-class>org.eclipse.jetty.servlets.CrossOriginFilter</filter-class>
<init-param>
<param-name>allowedOrigins</param-name>
<param-value>*</param-value>
</init-param>
</filter>

修改默认的端口:在根目录下的start.ini

1
2
## Connector port to listen on
jetty.http.port=8888

2 Data

注:这里以发布shapefile为例。

image-20250404102524686

2.1 工作区 Workspaces

工作区是一种逻辑上的分组,用于组织不同的数据集,避免命名冲突。每个工作区都有一个唯一的 Namespace URI

一个 Workspaces 可以包含多个 Stores(数据存储)。

示例:创建一个工作区

image-20250404102802681

image-20250404103012826

2.1.1 命名空间 Namespace URI

Namespace URI(命名空间 URI) 是用于唯一标识一个 工作区(Workspace) 的名称空间。它不是一个实际的网址,而是一个标识符,通常采用 URI(统一资源标识符)的格式,例如 http://www.opengeospatial.net/cite

作用:

  1. 避免名称冲突:在 GeoServer 中,不同的数据存储可能会有相同的图层名称。Namespace URI 确保这些图层不会因为重名而产生冲突。
  2. WMS/WFS 服务中的 XML 命名空间:当通过 WMS或 WFS请求数据时,返回的 XML会包含这个命名空间,以确保数据的唯一性。
  3. 组织数据:Namespace URI 使得 GeoServer 可以在不同工作区之间区分图层和服务。

2.1.2 默认工作区 Default Workspace

该选项表示是否将此工作区设置为 GeoServer 的 默认工作区

  • 如果启用,则在 WMS/WFS 请求中,未指定命名空间的图层会默认使用此工作区中的图层。例如:
1
http://localhost/geoserver/wms?service=WMS&request=GetMap&layers=your_layer

如果 your_layer 存在于默认工作区,则可以省略 workspace:layer 形式的引用。

  • 如果不启用,则需要指定工作区cite
1
2
3
http://localhost/geoserver/cite/wms?service=WMS&request=GetMap&layers=cite:your_layer

http://localhost/geoserver/cite/wfs?service=WFS&request=GetFeature&typeName=cite:your_layer

2.1.3 隔离工作区 Isolated Workspace

启用该选项后,该工作区将被隔离,无法访问其他工作区的数据

适用于多租户(multi-tenant)环境,比如不同的用户或组织使用各自的工作区,不希望它们相互访问数据。

2.1.4 设置 Settings

这个复选框控制是否 启用 该工作区。

如果取消勾选,该工作区中的所有数据存储、图层和服务都会被禁用,无法通过 WMS/WFS/WMTS 访问。

2.1.5 服务控制 Services

这里列出了可以为该工作区启用的 OGC 标准服务。

详见:

2.2 数据存储 Stores

数据存储是 GeoServer 访问数据的方式,可以是文件(如 Shapefile)、数据库(如 PostGIS)、远程 WFS 服务等。

支持的数据源:

image-20250404111450893

  • 一个 Store 可以包含多个 Layers(一对多);
  • 一个 Store 只能属于一个 Workspace(一对一)

创建数据存储示例

image-20250404112201814

2.3 图层 Layers

图层是地理数据的具体表示,如矢量数据(点、线、面)或栅格数据(遥感影像、DEM)。

  • 一个 Store 可以包含多个 Layers(一对多)。
  • 一个 Layer 只能来源于一个 Store(一对一)。
  • 一个 Layer 可以属于多个 Layer Groups(多对多)。

创建图层

创建图层的时候,从数据存储中选择一个进行创建:

image-20250404112436264

下面只介绍两个非常重要的设置。

2.3.1 CRS

image-20250404112814780

GeoServer 支持多个坐标参考系(Coordinate Reference Systems, CRS/Spatial Reference System, SRS),需要在发布图层时告诉它数据用的是什么坐标系,并声明希望客户端看到的坐标系是什么。

① Native SRS 原生SRS

上传到 GeoServer 的原始数据本身使用的坐标系。这个坐标系通常来自数据文件,比如:

  • Shapefile 的 .prj 文件
  • GeoTIFF 的坐标信息
  • PostGIS 表的 SRID

注意:GeoServer 不会自动转换坐标系,它默认原始数据就是用的 Native SRS。

② Declared SRS 声明SRS

表示希望在发布时告诉客户端,这个图层的坐标系是哪个。它可以和 Native SRS 不同

GeoServer 在服务输出时,会使用 Declared SRS 告诉客户端:“这图层是这个坐标系的”,哪怕实际上不是,这就涉及下面的核心内容。

③ SRS handling 坐标系处理

这是核心配置项,它控制 GeoServer 在 Native SRS ≠ Declared SRS 时的行为。

选项 含义 推荐使用情况
Force declared 强制使用声明 SRS(Declared SRS),不做任何坐标转换 数据和声明一致时使用(最常用 )
Reproject to declared 将原始数据从 Native SRS 转换为 Declared SRS 数据坐标系和声明不一致时使用
Keep native 不处理,保留原生坐标系,客户端自己搞定坐标投影逻辑 高级应用,慎用

2.3.2 Bounding Boxes

image-20250404113711285

Bounding Boxes(边界框) 配置,是 GeoServer 图层发布时用来描述图层地理范围的(图层包含的最小矩形区域)。它们对客户端地图裁剪、图层预览、坐标转换、性能优化等都很重要。

定义为:

1
[Min X, Min Y, Max X, Max Y]
  • 在地理坐标系中:X = 经度(Longitude),Y = 纬度(Latitude)
  • 在投影坐标系中:单位可能是米(比如 EPSG:3857)
① Native Bouding Box

这是指根据数据原始坐标系(Native SRS)计算出的边界框。

  • 按钮1:Compute from data:让 GeoServer 扫描实际数据(矢量或栅格),自动计算出真实的空间范围。

  • 按钮2:Compute from SRS bounds:忽略实际数据,直接使用这个 SRS(比如 EPSG:4326)在 EPSG 注册表里的“标准范围”作为 BBOX。

比如 EPSG:4326 标准范围就是:

1
[-180, -90, 180, 90]

这个值可能会比数据大,导致范围不准确,不建议直接使用,除非真的不知道数据范围。

② Lat/Lon Bounding Box

这是以 EPSG:4326(WGS84,经纬度) 表达的图层范围,无论数据原始坐标系是什么

  • GeoServer 需要这个值用于 OGC 服务中的 GetCapabilities 文档。
  • 所有客户端都能理解这个范围,适合用于地图定位等用途。

按钮:Compute from native bounds:使用 Native Bounding Box 进行坐标转换(投影)成 EPSG:4326,然后作为 Lat/Lon 边界框。这是推荐的做法,因为这样客户端拿到的经纬度范围才是正确的。

③ 可能存在的问题

Bounding Box 设错会导致一些实际问题,比如:

错误类型 影响 可能原因
范围过大 不能正确 zoom 到图层,初始视图太大 只用了默认 [-180, -90, 180, 90]
范围过小 数据显示不全,部分要素丢失 手动填的范围太小
坐标系不匹配 数据偏移,加载后不在预期位置 Native SRS 和 Declared SRS 处理错误
地图无法加载 服务器返回错误 没有计算 BBOX,导致 GetCapabilities 无效

2.4 图层组 Layer Groups

图层组是多个图层的集合,允许在地图服务(WMS/WFS)中一次性加载多个图层。

  • 一个 Layer Group 可以包含多个 Layers(一对多)。
  • 一个 Layer 可以属于多个 Layer Groups(多对多)。

2.5 样式 Styles

样式(SLD)用于控制图层的渲染方式,如颜色、符号、线型等。

SLD(Styled Layer Descriptor) 是一种基于 XML 的标准,用于定义地图图层的样式。它是 OGC制定的标准,主要用于 WMS 服务,控制地图上要素的渲染方式

SLD 是基于 XML 的,一般包含以下部分:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?xml version="1.0" encoding="UTF-8"?>
<StyledLayerDescriptor version="1.0.0"
xmlns="http://www.opengis.net/sld"
xmlns:ogc="http://www.opengis.net/ogc"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.opengis.net/sld StyledLayerDescriptor.xsd">

<!-- 定义样式 -->
<NamedLayer>
<Name>MyLayer</Name>
<UserStyle>
<Title>My Custom Style</Title>

<!-- 规则 -->
<FeatureTypeStyle>
<Rule>
<Title>Red Polygon</Title>

<!-- 指定填充颜色 -->
<PolygonSymbolizer>
<Fill>
<CssParameter name="fill">#FF0000</CssParameter> <!-- 红色填充 -->
<CssParameter name="fill-opacity">0.5</CssParameter> <!-- 透明度50% -->
</Fill>
<Stroke>
<CssParameter name="stroke">#000000</CssParameter> <!-- 黑色边框 -->
<CssParameter name="stroke-width">2</CssParameter> <!-- 边框宽度 -->
</Stroke>
</PolygonSymbolizer>

</Rule>
</FeatureTypeStyle>

</UserStyle>
</NamedLayer>
</StyledLayerDescriptor>

又如,线条(line)的SLD样式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?xml version="1.0" encoding="UTF-8"?>
<StyledLayerDescriptor version="1.0.0"
xsi:schemaLocation="http://www.opengis.net/sld StyledLayerDescriptor.xsd"
xmlns="http://www.opengis.net/sld"
xmlns:ogc="http://www.opengis.net/ogc"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<!-- a Named Layer is the basic building block of an SLD document -->
<NamedLayer>
<Name>default_line</Name>
<UserStyle>
<!-- Styles can have names, titles and abstracts -->
<Title>Styled Line</Title>
<Abstract>A sample style that draws a customized line</Abstract>
<!-- FeatureTypeStyles describe how to render different features -->
<!-- A FeatureTypeStyle for rendering lines -->
<FeatureTypeStyle>
<Rule>
<Name>rule1</Name>
<Title>Styled Line</Title>
<Abstract>A solid line with custom color and width</Abstract>
<LineSymbolizer>
<Stroke>
<CssParameter name="stroke">#777070</CssParameter>
<CssParameter name="stroke-width">2</CssParameter>
</Stroke>
</LineSymbolizer>
</Rule>
</FeatureTypeStyle>
</UserStyle>
</NamedLayer>
</StyledLayerDescriptor>

2.6 发布示例

2.6.1 WMS发布示例

前提:一个工作区airport,包含一个Layer Group,名称为airport-region,其中有PointPolygonLine等要素的图层。各图层的原生SRS和声明SRS均为EPSG:4326。边界框根据图层实际的显示范围进行计算。其中有一个“世界图层”(范围为-180,-90,180,90),作为背景。

  • 使用WMS服务发布这个图层组,然后基于Mapbox客户端进行请求。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
map.value.addSource('airport-source', {
type: 'raster',
tiles: [
'http://localhost:8888/geoserver/airport/wms?service=WMS&version=1.1.0&request=GetMap&layers=airport:airport-region&bbox={bbox-epsg-3857}&width=256&height=256&srs=EPSG:3857&format=image/png; mode=8bit'
],
tileSize: 256
});

map.value.addLayer({
id: 'airport-layer',
type: 'raster',
source: 'airport-source',
paint: {}
});

其中参数:

参数名 说明
http://localhost:8888/geoserver/airport/wms GeoServer 的 WMS 接口地址。请求的是 airport 工作区下的 WMS 服务。wms可以替换为ows
service=WMS 告诉 GeoServer 这是一个 Web Map Service(WMS) 请求。
version=1.1.0 使用的 WMS 版本,这里是 1.1.0(也常见 1.3.0)。
request=GetMap 请求类型是获取地图图像(也可以是 GetCapabilities、GetFeatureInfo 等)。
layers=airport:airport-region 指定图层名,格式是 工作区:图层名称。这里是 airport 工作区下的 airport-region 图层。
bbox={bbox-epsg-3857} 指定地图要显示的区域范围(边界框)。这是个 Mapbox 会自动替换的占位符,使用的是 EPSG:3857 投影。实际请求时会变成类似:bbox=12600000,2600000,12700000,2700000 这样的格式。
width=256&height=256 输出图像的像素宽度和高度。常用于瓦片图层,表示一张图像大小是 256x256 像素。
srs=EPSG:3857 指定坐标参考系统,这里是 Web 地图常用的墨卡托投影(Web Mercator)。
format=image/png; mode=8bit 输出图像的格式为 PNG,附带参数 mode=8bit,代表用 8 位颜色图像(对性能和带宽更友好)。

注意:Mapbox 默认只会使用 EPSG:3857 投影坐标系来进行瓦片请求,EPSG:4326 协议的 bbox(经纬度坐标)并不是自动支持的,因此 {bbox-epsg-4326} 不会自动替换。


WMS提供的形式还有:

image-20250404211940135

2.6.2 WFS发布示例

前提:一个工作区airport,包含一个Layer,名称为ParkingStandLocation_point,其中有一个属性RESOURCE_C,表示一个编号,现在使用symbol图层将这些编号按位置渲染出来。

代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
map.value.addSource('parking-stand-location-source', {
type: 'geojson',
data: 'http://localhost:8888/geoserver/airport/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=airport:ParkingStandLocation_points&outputFormat=application/json'
});

map.value.addLayer({
id: "parking-stand-location-layer",
type: "symbol",
source: "parking-stand-location-source",
"minzoom": 13.8,
layout: {
"text-field": ["get", "RESOURCE_C"], // 获取属性
"text-size": 13,
"text-font": ["Open Sans Semibold", "Arial Unicode MS Bold"],
"text-anchor": "top",
"text-allow-overlap": false,
"visibility": "visible"
}
});

其中参数为:

参数 含义
http://localhost:8888/geoserver/airport/ows GeoServer 的通用 OWS(OGC Web Services)入口地址,适用于 WMS、WFS、WCS 等服务。可以替换为wfs
service=WFS 指定服务类型为 WFS。WFS 用于获取矢量数据(要素,如点、线、面等),而非地图图像。
version=1.0.0 使用的 WFS 协议版本,这里是 1.0.0。常见还有 1.1.0 和 2.0.0。
request=GetFeature 请求的是“获取要素”操作,这是 WFS 最核心的功能。
typeName=airport:ParkingStandLocation_points 要获取的图层,格式为 工作区:图层名称。这里是 airport 工作区下的 ParkingStandLocation_points 图层。
outputFormat=application/json 输出格式为 GeoJSON,这是一种常用的矢量数据格式,可以直接在前端(如 Mapbox)中使用。

此外输出格式还有:

image-20250404212115889

3 Tile Caching

image-20250404212356060

瓦片缓存(Tile Caching) 相关的一组菜单项属于 GeoWebCache(GWC) 的管理部分。这些内容主要是为了提高地图服务性能,通过提前渲染和缓存“瓦片”地图图像。

3.0 瓦片(Tile)、栅格(Raster)和矢量(Vector)

3.0.1 基本概念

RasterVector 是一种数据格式,Tile 是一种切片机制。较小的栅格缓存之后,就变成了瓦片。

Raster(矢量略)

栅格是一种数据格式,表示地图或图像为一个像素网格(类似照片)。每个像素有一个值:颜色、温度、高程、NDVI 等。

  • 常见格式:GeoTIFF、JPEG、PNG、GRID 等。
  • 特点:
    • 整体加载,可能是大尺寸图像。
    • 分辨率固定,通常包含空间参考信息(投影、坐标系)。

Tile

瓦片是一种 地图发布机制:把地图数据切成很多小块(瓦片),通常是 256×256 像素。每个瓦片就是一个小图像,常是 PNG/JPEG(或者Geojson/pbf等)。按照 zoom/x/y 三维方式组织(瓦片编号)。栅格和矢量数据都可以使用瓦片进行发布

  • 特点:
    • 按需加载,快速显示。
    • 专门用于 WebGIS,配合前端库如 Mapbox、Leaflet 等。
    • 支持缓存,可预生成(seeding)。

2.6节中使用WMS获取的256*256的图片并不是瓦片,而是栅格,下面是详细的区别:

项目 WMS 256×256 栅格 WMTS / XYZ Tile 瓦片
协议 WMS WMTS / XYZ
是否瓦片协议 ❌ 否(没有标准化 tile grid) ✅ 是
是否按 zoom/x/y 编号组织 ❌ 否,需要手动指定 bbox (Mapbox可自动计算EPSG:3857的bbox) ✅ 是
是否可直接用于 Mapbox/Leaflet 瓦片源 ⚠️ 需要手动转换 bbox 协议 ✅ 原生支持
是否支持自动缓存 ❌ 通常不缓存 ✅ 可预缓存
地图服务器负载 高(每次都动态渲染) 低(瓦片可缓存)

3.0.2 栅格瓦片和矢量瓦片区别

项目 栅格瓦片(Raster Tile) 矢量瓦片(Vector Tile)
格式 .png / .jpeg .pbf(Protobuf)
数据类型 图片(已渲染) 原始几何 + 属性
渲染位置 服务器端 渲染后返回图片 客户端 渲染,数据灵活
样式修改 固定样式,必须在服务器改样式重新渲染 样式可动态调整(在客户端通过 JS 控制颜色、线宽等)
文件大小 通常较大 通常较小(压缩过)
加载速度 快速加载但放大模糊 加载略慢但放大不失真
交互性 不支持数据交互(比如点击某区域获取属性) 支持点击、悬停、筛选、tooltip 等
层级控制 每级瓦片固定样式 样式、可见性随 zoom 动态控制
浏览器支持 所有 现代浏览器
对设备要求 低(图片) 高(渲染和内存消耗)
地图精度 低(不可缩放过多) 高(平滑、可无限缩放)

3.1 Tile Layers

3.1.1 基本设置

编辑图层时,有一个Tile Caching选项,启用后,可以开启瓦片缓存。

设置中,最重要的一项是Gridsets 配置区域:设置这个图层支持哪些瓦片投影(Gridset),以及这些投影下使用的 缩放层级(zoom levels) 和切片区域(Grid subset bounds)信息。

image-20250404215235120

① Gridset 网格集
字段 含义
EPSG:4326 表示使用 WGS84(经纬度) 作为瓦片投影
EPSG:900913 实际上是 EPSG:3857 的别名,也就是 Web Mercator(用在 Mapbox、Google Maps、Leaflet 等),这里的”900913” 看起来像 “Google” 的拼音数字(g00g1e)
② Published zoom levels 发布的缩放层级

设置这个图层在该投影下支持的 最小和最大缩放级别(zoom)。例如:Min = 0,Max = 18,表示这个图层在 zoom 0 到 18 之间都可以提供瓦片。

这里的zoom和Mapbox的zoom是对应的,前提是使用的是同一套投影坐标系。

③ Cached zoom levels 已缓存的缩放层级

设置这个图层在该投影下哪些 zoom 层级的瓦片可以进行缓存(实际生成缓存需要通过 GeoServer 的“瓦片预生成工具”seed 进行缓存)。

④ Grid subset bounds 切片区域范围

定义在哪一块地理范围内生成瓦片,避免生成全球瓦片浪费空间。通常只选图层覆盖区域的 bounding box。

3.1.2 Seed/Truncate

要真正生成瓦片缓存,需要执行 Seed(预生成)操作,如下图:

image-20250405121130016

点击进入后:

image-20250405135514481

① 顶部说明
  • 这个界面不会检查参数正确性 → 你必须自己确保输入是正确的,GeoServer 不会自动校验。
  • 不建议生成大于 Zoom Level 20 的瓦片 → Zoom 级别越高,瓦片数量指数增长,占用磁盘空间大,影响性能。
  • 截断 KML 也会同时截断 KMZ 存档 → 如果你删除 KML 瓦片缓存,相关的 KMZ 文件也会一起被删除。
  • 检查日志查看错误信息 → 如果生成失败,查看 GeoServerGeoWebCache 日志排查问题。
② 边界范围

系统提供了两个坐标参考系(CRS)的最大边界,该最大边界来自于该图层的边界。如果不填写下面的 Bounding Box,GeoServer 会使用这些默认值

③ 任务配置
  • Number of tasks to use:设置并行任务数,决定同时生成多少个瓦片任务。
  • Type of operation:操作类型
    • Seed - generate missing tiles:生成缺失的瓦片
    • Truncate - remove tiles:删除已有的瓦片
    • Reseed - regenerate all tiles:删除并重新生成瓦片
  • Grid Set:网格集,这里的网格集来自图层配置里设置好的网格集
  • Format:输出格式
  • Zoom startZoom stop:起始和结束缩放级别
  • Modifiable Parameters:可选参数
  • Bounding box:边界框,留空则使用图层默认的配置
  • Tile failure retries:失败重试次数
  • Pause before retry:重试前等待时间
  • Total failures before aborting:最大失败数

3.2 Caching Defaults

瓦片缓存默认设置页面(Caching Defaults)用来配置瓦片缓存的全局行为,包括支持的服务、瓦片格式、样式是否缓存、元瓦片大小等。

3.2.1 Provided Services

image-20250405142650201

选项 说明
Enable direct integration with GeoServer WMS 启用 GeoServer WMS 与缓存集成,使 GeoWebCache 可拦截并缓存 WMS 请求,提高性能。
Explicitly require TILED Parameter 要求 WMS 请求中必须明确带 TILED=true 参数,避免普通 WMS 请求被缓存。建议启用。
Enable WMS-C Service 启用 OGC WMS-C(瓦片版WMS服务),向支持该标准的客户端提供瓦片。
Enable TMS Service 启用 TMS(Tile Map Service),供如 OpenLayers、Leaflet 等客户端使用。URL格式:http://GEOSERVER/URL/gwc/service/tms/1.0.0,详见3.7.2节
Enable Data Security 启用缓存层的数据访问控制,需结合 GeoServer 权限设置。默认关闭。

3.2.2 Default Tile Image Formats

可以为不同类型的图层分别设置默认的输出格式:

image-20250405142848747

注意:“矢量图层”是指原始数据是矢量数据,而“输出格式”决定了是否还能交互 —— 想交互,选 GeoJSON矢量瓦片(PBF),不要用图片格式。

3.3 Gridsets

暂略

3.4 Disk Quota

磁盘配额设置界面(Disk Quota),用于控制 瓦片缓存的磁盘空间使用上限

image-20250405143041279
项目 说明
Enable disk quota 是否启用磁盘配额控制,启用后会限制缓存所使用的总空间。
Disk quota check frequency 每隔多少秒检查一次磁盘配额状态(单位:秒)。
Maximum tile cache size 设置缓存所能占用的最大磁盘空间。
使用情况条 显示当前缓存使用情况。例如这里是“使用了 35.45 MB / 最大 500.0 MB”。
When enforcing disk quota limits, remove tiles that are: 超出限制时删除哪些瓦片: Least frequently used(默认):删除最少被请求的瓦片(LRU 策略) ;Least recently used:删除最久没有被访问的瓦片
Disk quota store type 存储配额数据的数据库类型,默认是:In process database (H2)。这是嵌入式数据库,适合轻量级使用。如果是生产环境可切换为 PostgreSQL。

3.5 BlobStores

暂略

3.6 GeoWebCache

页面地址:http://ip:port/geoserver/gwc/home

image-20250405143425848

下面对Runtime Statistics部分进行讲解:

项目 说明
Started Sat, 05 Apr 2025 04:06:50 GMT (2 hours),GWC 启动时间,是统计的起始时间。表示 GeoWebCache 已运行了 2 小时
Total number of requests 366 (0/s),总共接收到 366 个瓦片请求(包括缓存命中和未命中的)。括号中是当前实时请求速率,0/s 表示当前时刻没有活动请求。
Total number of untiled WMS requests 0 (0/s),没有非切片的 WMS 请求。说明客户端(如 Mapbox 或 WebGIS)使用的是瓦片服务而非传统 WMS 图层。
Total number of bytes 4606433 字节(约 4.4 Mbps),所有瓦片请求加起来总共传输了约 4.4MB 的数据。
Cache hit ratio 96.25%,表示有 96.25% 的请求直接从缓存中命中返回瓦片,而不是重新生成。命中率越高,GeoServer 压力越小,响应速度越快。

实时窗口统计:这部分显示近几秒的瓦片请求速率:

时间窗口 请求数 平均速率 数据量 带宽
3 秒 4 1.3/s 12492 字节 33.3 kbps
15 秒 5 0.3/s 15608 字节 8.3 kbps
60 秒 7 0.1/s 21838 字节 2.9 kbps

说明当前系统处于比较空闲的状态


Storage Locations:瓦片文件保存位置

Config file: gwc/geowebcache.xml

  • 配置文件路径,记录缓存服务设置、图层绑定等信息。

Local Storage:D:/projects/geoserver-2.21.5-bin/data_dir/gwc

  • 瓦片缓存实际保存在此目录(本地磁盘)。
  • 每个图层一个文件夹,内含瓦片图像,通常按 {z}/{x}/{y}.png 结构组织。

例如:

image-20250405144649425

3.7 发布示例

3.7.1 栅格瓦片发布

前提说明:一个工作区airport,包含一个Layer Group,名称为airport-region,其中有PointPolygonLine等要素的图层。各图层的原生SRS和声明SRS均为EPSG:4326。边界框根据图层实际的显示范围进行计算。其中有一个“世界图层”(范围为-180,-90,180,90),作为背景。

该图层组开启Tile Caching,前端mapbox的zoom级别设置为14-20,因此图层的tile caching设置里的zoom级别同样设置,注意使用90013

image-20250405144906957

预生成瓦片(可选):由于有一个世界背景,因此为了避免生成大量的背景瓦片,需要填写除世界背景外的图层所包含的边界。

image-20250405145117375

也可以不用预生成瓦片,而是让客户端请求某个瓦片时,GeoServer 在 首次请求时动态生成并缓存该瓦片(此时等同于普通的WMS请求),这是 GeoWebCache 的默认行为(惰性缓存或按需瓦片缓存)。


mapbox代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
map.value.addSource('airport-source', {
type: 'raster', // 栅格瓦片
tiles: [ // 瓦片URL
"http://localhost:8888/geoserver/gwc/service/wmts?service=WMTS&request=GetTile&layer=airport:airport-region&tilematrixset=EPSG:900913&tilematrix=EPSG:900913:{z}&TileCol={x}&TileRow={y}&format=image/png"
],
tileSize: 256
});

map.value.addLayer({
id: 'airport-layer',
type: 'raster', // 栅格瓦片
source: 'airport-source',
paint: {} // 这里不能改变瓦片的样式,而是由服务器渲染过后直接加载
});

关键参数解释:

参数名 含义
tilematrixset=EPSG:900913 使用的瓦片矩阵集
tilematrix=EPSG:900913:{z} 请求的缩放级别(z)在该坐标系下的标识
TileCol={x} 请求的瓦片列号(X)
TileRow={y} 请求的瓦片行号(Y)

验证:在Network 面板中查看单个瓦片请求的响应头:

image-20250405150817125

image-20250405150901895

3.7.2 WMS结合栅格瓦片发布

WMS请求的“瓦片”(其实是缓存后的栅格)也可以进行缓存,首先开启3.2.1节中的Enable direct integration with GeoServer WMS选项,然后在请求URL后加上TILED=true参数即可。

  • WMS没有开启瓦片缓存前:
1
http://localhost:8888/geoserver/airport/ows?service=WMS&version=1.1.0&request=GetMap&layers=airport:airport-region&bbox={bbox-epsg-3857}&width=256&height=256&srs=EPSG:3857&format=image/png; mode=8bit

只是普通的WMS响应标头:

image-20250405150946755

  • WMS开启瓦片缓存后:
1
http://localhost:8888/geoserver/airport/ows?service=WMS&version=1.1.0&request=GetMap&layers=airport:airport-region&bbox={bbox-epsg-3857}&width=256&height=256&srs=EPSG:3857&format=image/png; mode=8bit&TILED=true

image-20250405151108377

3.7.2 矢量瓦片发布

① WMTS和TMS

WMTSTMS 都是地图服务中的“瓦片地图协议”,用于切片地图的传输,但它们在标准、格式和使用方式上有一些关键区别。

协议名 全称 说明
TMS Tile Map Service 由 OSGeo 下的 TileCache 定义的早期瓦片服务标准,简单、URL 模板式
WMTS Web Map Tile Service 由 OGC(开放地理空间联盟)发布的正式标准,支持 RESTful 和 KVP(Key-Value Pairs) 请求

下面是核心的区别:

对比项 TMS WMTS
发布者 OSGeo OGC(国际标准)
标准化程度 非正式标准(实际被广泛采用) 国际标准,正式规范
URL 风格 RESTful URL,通常是:/z/x/y.format 支持 REST 和 KVP,例如:?SERVICE=WMTS&REQUEST=GetTile&LAYER=...
Y轴方向 Y 从 下往上(TMS 是反着的) 默认从 上往下(Google-style XYZ)
灵活性 URL 简单,方便嵌入 JS 支持多种输出格式、样式、坐标系,适合企业系统
兼容 Mapbox GL JS ✅(需要加 scheme: 'tms' 复杂一点,需要构造 URL 模板
GeoServer 支持 默认开启 默认支持,有 REST 和 KVP 两种模式
元数据支持 无标准的 GetCapabilities 支持 OGC GetCapabilities 元数据接口

3.2.1小节中Enable TMS Service的选项是默认开启的。

② Vector Tiles插件

地址:https://geoserver.org/release/stable/

image-20250406132612413

将其geoserver-2.xx.x-vectortiles-plugin解压后,放置于geoserver-2.xx.x-bin/webapps/geoserver/WEB-INF/lib中,然后重启GeoServer即可。

③ 开启矢量瓦片输出格式

进入图层或图层组的配置页面,将下面的输出格式勾选:

image-20250406132918390

这是 Mapbox Vector Tile(.pbf)格式,专门为地图客户端(比如 Mapbox GL JS、deck.gl、Cesium)设计的。

特点:

项目 描述
格式 二进制 .pbf
编码方式 Protobuf
数据单位 按瓦片分块(z/x/y)切片
空间参考 屏幕内部坐标(0~4096),不是经纬度
优化目标 地图客户端渲染
支持样式渲染 图层样式可配
是否可读/调试 不可直接查看,需要工具解析
④ 代码实现
  • WMTS服务
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
map.value.addSource('airport-source', {
type: 'vector', // 矢量瓦片
tiles: [
'http://localhost:8888/geoserver/gwc/service/wmts?' +
'service=WMTS&request=GetTile&VERSION=1.0.0' +
'&layer=airport:airport-region' + // 工作空间:图层 or 工作空间:图层组
'&style=' +
'&tilematrixset=EPSG:900913' +
'&tilematrix=EPSG:900913:{z}' +
'&tilerow={y}&tilecol={x}' +
'&format=application/vnd.mapbox-vector-tile'
]
});

map.value.addLayer({
id: '1_15_TaxiwayElement_region-layer',
type: 'fill', // 元数据是polygon,则选择fill类型
source: 'airport-source',
"source-layer": '1_15_TaxiwayElement_region', // 这里的图层名称是airport-region图层组中包含的图层的名称
paint: {
"fill-color": "#CDCDCD",
"fill-outline-color": "#9B9B9B",
"fill-opacity": 1
},
});

// ... 继续配置airport-region图层组中其他的图层
// map.value.addLayer(...)

请求结果:

image-20250406133836253

服务器缓存的.pbf矢量瓦片:

image-20250406133915156

  • TMS服务
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
map.value.addSource('airport-source', {
type: 'vector',
tiles: [
'http://localhost:8888/geoserver/gwc/service/tms/1.0.0/airport:airport-region@EPSG:900913@pbf/{z}/{x}/{y}.pbf'
],
scheme: 'tms', // 需要明确指定tms
});

map.value.addLayer({
id: '1_15_TaxiwayElement_region',
type: 'fill',
source: 'airport-source',
"source-layer": '1_15_TaxiwayElement_region',
paint: {
"fill-color": "#CDCDCD",
"fill-outline-color": "#9B9B9B",
"fill-opacity": 1
},
});

image-20250406134617465