3.2 地图服务器架设


3.2 地图服务器架设

本节摘要:发布 OGC 服务要地图服务器。本节讲 GeoServer 等主流服务器、怎么架设、怎么发布服务——把数据变成可访问的服务。

本节导航

阅读完本节,你应当能够:

  1. 选合适的地图服务器
  2. 架设 GeoServer
  3. 发布 WMS/WFS 服务

概念脉络

一、主流地图服务器

服务器 语言 特点
GeoServer Java 开源主流,功能全,支持 OGC 全套
MapServer C 轻量快速,配置文件驱动
QGIS Server C++ QGIS 桌面同引擎,样式兼容
ArcGIS Enterprise 商业 ESRI 生态,企业级

GeoServer 是开源首选,功能全、社区活跃、文档好。

二、架设 GeoServer

图 3-2 地图服务器架构

图 3-2 地图服务器架构

# Docker 部署 GeoServer docker run -p 8080:8080 kartoza/geoserver # 访问 http://localhost:8080/geoserver/web

三、发布服务流程

  1. 建工作区(Workspace):逻辑隔离不同项目
  2. 加数据源(Store):连接 PostGIS/Shapefile 等
  3. 发布图层(Layer):从数据源选表/文件发布
  4. 配样式(SLD):用 SLD 定义符号化(颜色、线宽)
  5. 测试:用 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 发布数据库图层时,数据源配置有几个高频踩坑点:

  1. 字符编码:中文属性乱码通常是数据库连接串或图层编码没设成 UTF-8,PostGIS 数据源里把"Connection timeout"等参数外的编码项设对,属性查询就正常。
  2. 坐标系声明:GeoServer 读取 PostGIS 图层时用 SRID 判断坐标系。如果表里几何 SRID 是 0,发布后图层会无法叠加,需要在 SQL 视图里显式 ST_SetSRID
  3. 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%'

八、发布后的验证清单

发布完成不要直接交付,按清单验证:

  1. 用 Layer Preview 预览 WMS 图层,确认图形位置和底图对齐。
  2. 请求 WFS GetFeature,确认能取到要素,属性字段和中文正常。
  3. 查看 GetCapabilities,确认坐标系和格式声明正确。
  4. 用 OpenLayers 写个最小页面连一下,确认跨域配置没问题。
  5. 测一下 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 调优、负载均衡。
  • 性能:瓦片缓存、空间索引、矢量瓦片、预渲染。

下一节讲瓦片技术——服务加速的关键。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U