3.2 地图服务器架设
本节摘要:发布 OGC 服务要地图服务器。本节讲 GeoServer 等主流服务器、怎么架设、怎么发布服务——把数据变成可访问的服务。
本节导航
阅读完本节,你应当能够:
- 选合适的地图服务器
- 架设 GeoServer
- 发布 WMS/WFS 服务
概念脉络
一、主流地图服务器
| 服务器 |
语言 |
特点 |
| GeoServer |
Java |
开源主流,功能全,支持 OGC 全套 |
| MapServer |
C |
轻量快速,配置文件驱动 |
| QGIS Server |
C++ |
QGIS 桌面同引擎,样式兼容 |
| ArcGIS Enterprise |
商业 |
ESRI 生态,企业级 |
GeoServer 是开源首选,功能全、社区活跃、文档好。
二、架设 GeoServer
图 3-2 地图服务器架构

# Docker 部署 GeoServer
docker run -p 8080:8080 kartoza/geoserver
# 访问 http://localhost:8080/geoserver/web
三、发布服务流程
- 建工作区(Workspace):逻辑隔离不同项目
- 加数据源(Store):连接 PostGIS/Shapefile 等
- 发布图层(Layer):从数据源选表/文件发布
- 配样式(SLD):用 SLD 定义符号化(颜色、线宽)
- 测试:用 Layer Preview 看 WMS/WFS 输出
四、样式 SLD
SLD(Styled Layer Descriptor)是 OGC 样式标准,XML 格式定义怎么渲染:
<FeatureTypeStyle>
<Rule>
<PointSymbolizer>
<Graphic><Mark><WellKnownName>circle</WellKnownName>
<Fill><CssParameter name="fill">#ff0000</CssParameter></Fill>
</Mark></Graphic>
</PointSymbolizer>
</Rule>
</FeatureTypeStyle>
GeoServer 也支持用 CSS/YSLD 等更简洁的样式语法。
五、生产部署要点
- 反向代理:Nginx 在前,GeoServer 在后,加 HTTPS 和限流
- 缓存:GeoWebCache 内置瓦片缓存,或外层用 CDN
- 监控:监控服务可用性、响应时间、QPS
- 安全:认证授权,敏感图层限访问
- 资源:JVM 堆调大,多实例负载均衡
六、性能优化
- 瓦片缓存(GeoWebCache)减少重复渲染
- 数据库加空间索引加速 WFS
- 大数据用矢量瓦片,避免每次渲染
- 静态图层预渲染成瓦片
⚠️ 常见坑:GeoServer 直接暴露无缓存——每次请求都重新渲染,慢。用 GeoWebCache 瓦片缓存,或预渲染瓦片。
💡 关键直觉:GeoServer 是开源地图服务器首选,连数据源→发布图层→配样式→出服务。生产加反向代理、缓存、监控、安全。
七、连接 PostGIS 数据源
GeoServer 发布数据库图层时,数据源配置有几个高频踩坑点:
- 字符编码:中文属性乱码通常是数据库连接串或图层编码没设成 UTF-8,PostGIS 数据源里把"Connection timeout"等参数外的编码项设对,属性查询就正常。
- 坐标系声明:GeoServer 读取 PostGIS 图层时用 SRID 判断坐标系。如果表里几何 SRID 是 0,发布后图层会无法叠加,需要在 SQL 视图里显式
ST_SetSRID。
- SQL 视图:当一张表不够用、要 JOIN 或按条件过滤时,用 GeoServer 的 SQL View 功能,把一段 SQL 存成虚拟图层,比维护中间表灵活。
-- 一个典型的 SQL 视图定义(在 GeoServer 数据源里配)
SELECT p.id, p.name, p.geom
FROM parcels p
JOIN districts d ON ST_Contains(d.geom, p.geom)
WHERE d.name = '%district%'
八、发布后的验证清单
发布完成不要直接交付,按清单验证:
- 用 Layer Preview 预览 WMS 图层,确认图形位置和底图对齐。
- 请求 WFS GetFeature,确认能取到要素,属性字段和中文正常。
- 查看 GetCapabilities,确认坐标系和格式声明正确。
- 用 OpenLayers 写个最小页面连一下,确认跨域配置没问题。
- 测一下 WMTS/瓦片请求,确认 GeoWebCache 在产生缓存。
九、生产架构示例
一个中等规模 GIS 服务的部署形态通常是三层:
Nginx(80/443,HTTPS + 静态资源 + 缓存)
├── /geoserver → GeoServer 实例(多实例可负载均衡)
└── /tiles → GeoWebCache 瓦片(可切到对象存储)
# Nginx 反向代理 GeoServer 的简化配置
server {
listen 443 ssl;
location /geoserver/ {
proxy_pass http://127.0.0.1:8080/geoserver/;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
要点:GeoServer 进程别直接暴露公网,由 Nginx 统一收口;瓦片层可以前置 CDN,静态瓦片命中后源站压力很小;GeoWebCache 磁盘缓存目录要规划好容量,满了要清理策略。
十、常见故障排查
- 服务启动不了:多半是端口被占或 JVM 堆配置过大。看启动日志,把 CATALINA_OPTS 里的堆内存调到机器一半以内。
- 图层显示空白:先看数据源连接是否成功(数据预览页),再看坐标系是否一致,最后看样式是否把符号设置成了透明。
- 中文乱码:检查数据库连接编码、图层编码、字体是否支持中文。
- 跨域报错:前端直接请求时配置 CORS,GeoServer 自带 CORS 过滤器,确认没被防火墙拦。
十一、多实例与集群
当单个 GeoServer 扛不住时,扩到多实例:
- 水平扩展:多个 GeoServer 实例共享同一个数据库和瓦片目录,前面加负载均衡。GeoServer 的配置(样式、数据源)要同步,可以挂共享存储或自动同步脚本。
- 无状态化:避免把临时文件写进本地磁盘,会话和缓存外置,实例才能任意加减。
- 瓦片预热:上线前对重点区域提前生成瓦片,避免用户首次访问时大量渲染请求压垮服务。
十二、安全与合规
地图服务的安全不只是登录认证:
- 数据脱敏:高精度数据按权限降级输出(如军事设施模糊化、坐标扰动)。
- 服务鉴权:敏感图层走 token 或 IP 白名单,公开图层才放开。
- 合规审查:涉密和测绘成果按国家法规管理,发布前确认数据等级和审批流程。
一节小结
- 主流服务器:GeoServer(首选)、MapServer、QGIS Server、ArcGIS Enterprise。
- 架设:Docker 部署,建工作区→加数据源→发布图层→配样式→测试。
- SLD:OGC 样式标准,XML 定义符号化,GeoServer 也支持 CSS。
- 生产部署:反向代理、GeoWebCache 缓存、监控、安全、JVM 调优、负载均衡。
- 性能:瓦片缓存、空间索引、矢量瓦片、预渲染。
下一节讲瓦片技术——服务加速的关键。