geoserver
geoserver
下载:https://geoserver.org/release/2.21.x/
1. geoserver安装
本机安装记录
D:\Program Files\GeoServer\bin
admin/geoserver Ahsbd@2022_222
http://localhost:18080/geoserver/web/
端口设置:D:\Program Files\GeoServer\start.ini
jetty.http.port=18080
2.Geoserver采用内置的GeoWebCache发布Arcgis切片
水经注下载的地图瓦片,发布wmts服务
参考;https://blog.csdn.net/GIS_fly/article/details/125018429
https://blog.csdn.net/weixin_42066016/article/details/125315174
2.1 需要用到 GeoWebCache 1.21.0。下载地址:https://sourceforge.net/projects/geowebcache/files/geowebcache/1.21.0/
需要用到 这个war中的2个文件
geowebcache/WEB-INF/geowebcache-arcgiscache-context.xml--> 拷贝到geoserver/WEB-INF/lib/gs-gwc-2.12.0.jar/WEB-INF/里gwc-arcgiscache-1.12.2.jar--> 放到 geoserver/WEB-INF/lib/目录下去
2.2 修改 gs-gwc-2.12.0.jar
使用 压缩软件打开可以直接修改,前提是Geoserver服务关闭了,否则是无法修改
修改过的 gs-gwc-2.21.1.jar --> 直接去替换 geoserver/WEB-INF/lib/
gwc-arcgiscache-1.12.2.jar --> geoserver/WEB-INF/lib/gwc-arcgiscache-1.12.2.jar
然后重启即可
修改 geoserver/WEB-INF/lib/gs-gwc-2.12.0.jar/WEB-INF/ 下的3个xml文件
geowebcache-servlet.xml 文件里面 增加
<import resource="geowebcache-arcgiscache-context.xml"/>geowebcache-core-context.xml 文件里面增加
<bean id="gwcArcGISGridsetConfiguration" class="org.geowebcache.arcgis.layer.ArcGISCacheGridsetConfiguration"/>
注:核心是对
gs-gwc-2.12.0.jar的修改 新增:geowebcache-arcgiscache-context.xml
修改:geowebcache-servlet.xml
geowebcache-core-context.xml

2.3准备arcgis切片数据
解压arcgis切片包(test.tpk),作为切片数据。解压后test文件夹内容如下:

打开geoserver/data/gwc/geowebcache.xml文件,layers节点下添加arcgisLayer节点。
<arcgisLayer>
<name>test</name>
<tilingScheme>E:\\data\\arcgiscache\\cachedata\\test\\conf.xml</tilingScheme>
<tileCachePath>E:\\data\\arcgiscache\\cachedata\\test\\_alllayers</tileCachePath>
<hexZoom>false</hexZoom>
</arcgisLayer>
D:\ProgramData\GeoServer\gwc\geowebcache.xml
<?xml version="1.0" encoding="utf-8"?>
<gwcConfiguration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://geowebcache.org/schema/1.8.0"
xsi:schemaLocation="http://geowebcache.org/schema/1.8.0 http://geowebcache.org/schema/1.8.0/geowebcache.xsd">
<version>1.8.0</version>
<backendTimeout>120</backendTimeout>
<gridSets>
</gridSets>
<layers>
<arcgisLayer>
<name>ah16</name>
<tilingScheme>E:\\mapdownload\\ah16\\conf.xml</tilingScheme>
<tileCachePath>E:\\mapdownload\\ah16\\_alllayers</tileCachePath>
<hexZoom>false</hexZoom>
</arcgisLayer>
<arcgisLayer>
<name>ah16-2</name>
<tilingScheme>E:\\mapdownload\\ah16-2\\conf.xml</tilingScheme>
<tileCachePath>E:\\mapdownload\\ah16-2\\_alllayers</tileCachePath>
<hexZoom>false</hexZoom>
</arcgisLayer>
</layers>
</gwcConfiguration>
(2)重启tomcat服务(即重启geoserver),登录geoserver 
2.4 访问服务



天地图使用 wmts 案例
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
<meta name="keywords" content="天地图"/>
<title>天地图-地图API-范例-叠加其它WMS服务图层</title>
<script type="text/javascript" src="http://api.tianditu.gov.cn/api?v=4.0&tk="></script>
<style type="text/css">
body, html {
width: 100%;
height: 100%;
margin: 0;
font-family: "Microsoft YaHei"
}
#mapDiv {
width: 100%;
height: 400px
}
input, b, p {
margin-left: 15px;
font-size: 14px
}
</style>
<script type="text/javascript">
var map;
var zoom = 6;
var wmsLayer;
function onLoad() {
// 初始化地图对象
map = new T.Map("mapDiv");
// 设置显示地图的中心点和级别
map.centerAndZoom(new T.LngLat(116.40969, 39.89945), zoom);
// 允许鼠标滚轮缩放地图
map.enableScrollWheelZoom();
// WMTS 图层 URL
var imageURL = "http://localhost:18080/geoserver/gwc/service/wmts?" +
"layer=lyq&style=&tilematrixset=EPSG:3857_lyq&Service=WMTS&Request=GetTile&Version=1.0.0&Format=image/png&TileMatrix=EPSG:3857_lyq:{z}" +
"&TileRow={y}&TileCol={x}";
// 创建自定义图层对象
var lay = new T.TileLayer(imageURL, {minZoom: 1, maxZoom: 18});
// 将图层增加到地图上
map.addLayer(lay);
}
</script>
</head>
<body onLoad="onLoad()">
<div id="mapDiv"></div>
</body>
</html>
3.geoserver+shp矢量数据的发布
参考:https://blog.csdn.net/guo45682/article/details/117792157
查询字符集:生成的shp文件通常会有一个后缀名.cpg文件,此文件记录着shp文件的编码格式,可用文本编辑器打开该文件查看
3.1 内容概述
通过geoserver对shp矢量数据进行发布,并使用wms服务进行数据浏览查看。
3.2 shp数据介绍
shape文件由ESRI开发,一个ESRI(Environmental Systems Research Institute)的shape文件包括一个主文件,一个索引文件,和一个dBASE表。其中主文件的后缀就是.shp。 一般来说,一个完成的shp矢量数据需要包含,xx.shp用于记录各要素的坐标信息,xx.dbf用于记录各要素的属性信息,xx.prj用于记录本文件的坐标系,xx.sbn和ss.sbx是空间索引文件,xx.shx是要素的几何特征的索引文件等数据,另外常见的还有xx.cpg文件,用于数据中文的解译文件。
3.3 发布数据
3.3.1 登录GeoServer ,添加数据
- 点击 左侧数据—数据存储
- 点击添加新的数据
- 进入数据类型选择界面,在此界面需要选择正确的数据类型,本次主要是对shp矢量数据,因此点击Shapefile 这个选项。



3.3.2 选择数据源,配置数据参数及注意事项
3.3.3 选择数据源,配置数据参数及注意事项
4.QGIS安装
4.1 安装
下载 安装包 QGIS-OSGeo4W-xx.msi ,双击运行
安装完成后桌面点击 QGIS Desktop 3.26.3 打开服务
4.2 将QGIS界面设置为简体中文
菜单【Settings】->【Options…】打开Options对话框,选择【General】选项卡,找到“Override system locale”前面的复选框并打勾,在“User Interface Translation”下拉框中找到并选择“简体中文”,点击【OK】按钮。退出并重新启动QGIS,看到的即是简体中文界面。 
4.3 编辑shp 文件样式,同时获取sld文件
选择shp文件,然后双击图层管理中的对于图层,或者右击--> 属性,进入图层属性修改


geoservice 发布服务后修改style 可以通过QGIS获取 https://blog.csdn.net/huamh/article/details/109219301
- sld 文件,用于设置geoservice发布的图层样式

<?xml version="1.0" encoding="UTF-8"?>
<StyledLayerDescriptor xmlns="http://www.opengis.net/sld" version="1.1.0" xmlns:ogc="http://www.opengis.net/ogc" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:se="http://www.opengis.net/se" xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.1.0/StyledLayerDescriptor.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<NamedLayer>
<se:Name>wqt_10_bingqu_2019_100</se:Name>
<UserStyle>
<se:Name>wqt_10_bingqu_2019_100</se:Name>
<se:FeatureTypeStyle>
<se:Rule>
<se:Name>其他</se:Name>
<se:Description>
<se:Title>其他</se:Title>
</se:Description>
<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
<ogc:PropertyIsEqualTo>
<ogc:PropertyName>冰厚</ogc:PropertyName>
<ogc:Literal>其他</ogc:Literal>
</ogc:PropertyIsEqualTo>
</ogc:Filter>
<se:PolygonSymbolizer>
<se:Fill>
<se:SvgParameter name="fill">#e0dddd</se:SvgParameter>
<se:SvgParameter name="fill-opacity">0.53</se:SvgParameter>
</se:Fill>
<se:Stroke>
<se:SvgParameter name="stroke">#232323</se:SvgParameter>
<se:SvgParameter name="stroke-width">1</se:SvgParameter>
<se:SvgParameter name="stroke-linejoin">bevel</se:SvgParameter>
</se:Stroke>
</se:PolygonSymbolizer>
</se:Rule>
<se:Rule>
<se:Name>0~5</se:Name>
<se:Description>
<se:Title>0~5</se:Title>
</se:Description>
<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
<ogc:PropertyIsEqualTo>
<ogc:PropertyName>冰厚</ogc:PropertyName>
<ogc:Literal>0~5</ogc:Literal>
</ogc:PropertyIsEqualTo>
</ogc:Filter>
<se:PolygonSymbolizer>
<se:Fill>
<se:SvgParameter name="fill">#e0dddd</se:SvgParameter>
</se:Fill>
<se:Stroke>
<se:SvgParameter name="stroke">#232323</se:SvgParameter>
<se:SvgParameter name="stroke-width">1</se:SvgParameter>
<se:SvgParameter name="stroke-linejoin">bevel</se:SvgParameter>
</se:Stroke>
</se:PolygonSymbolizer>
</se:Rule>
<se:Rule>
<se:Name>5~10</se:Name>
<se:Description>
<se:Title>5~10</se:Title>
</se:Description>
<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
<ogc:PropertyIsEqualTo>
<ogc:PropertyName>冰厚</ogc:PropertyName>
<ogc:Literal>5~10</ogc:Literal>
</ogc:PropertyIsEqualTo>
</ogc:Filter>
<se:PolygonSymbolizer>
<se:Fill>
<se:SvgParameter name="fill">#b4b4b4</se:SvgParameter>
</se:Fill>
<se:Stroke>
<se:SvgParameter name="stroke">#232323</se:SvgParameter>
<se:SvgParameter name="stroke-width">1</se:SvgParameter>
<se:SvgParameter name="stroke-linejoin">bevel</se:SvgParameter>
</se:Stroke>
</se:PolygonSymbolizer>
</se:Rule>
<se:Rule>
<se:Name>10~15</se:Name>
<se:Description>
<se:Title>10~15</se:Title>
</se:Description>
<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
<ogc:PropertyIsEqualTo>
<ogc:PropertyName>冰厚</ogc:PropertyName>
<ogc:Literal>10~15</ogc:Literal>
</ogc:PropertyIsEqualTo>
</ogc:Filter>
<se:PolygonSymbolizer>
<se:Fill>
<se:SvgParameter name="fill">#ffff00</se:SvgParameter>
</se:Fill>
<se:Stroke>
<se:SvgParameter name="stroke">#232323</se:SvgParameter>
<se:SvgParameter name="stroke-width">1</se:SvgParameter>
<se:SvgParameter name="stroke-linejoin">bevel</se:SvgParameter>
</se:Stroke>
</se:PolygonSymbolizer>
</se:Rule>
<se:Rule>
<se:Name>15~20</se:Name>
<se:Description>
<se:Title>15~20</se:Title>
</se:Description>
<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
<ogc:PropertyIsEqualTo>
<ogc:PropertyName>冰厚</ogc:PropertyName>
<ogc:Literal>15~20</ogc:Literal>
</ogc:PropertyIsEqualTo>
</ogc:Filter>
<se:PolygonSymbolizer>
<se:Fill>
<se:SvgParameter name="fill">#ff9696</se:SvgParameter>
</se:Fill>
<se:Stroke>
<se:SvgParameter name="stroke">#232323</se:SvgParameter>
<se:SvgParameter name="stroke-width">1</se:SvgParameter>
<se:SvgParameter name="stroke-linejoin">bevel</se:SvgParameter>
</se:Stroke>
</se:PolygonSymbolizer>
</se:Rule>
<se:Rule>
<se:Name>20~30</se:Name>
<se:Description>
<se:Title>20~30</se:Title>
</se:Description>
<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
<ogc:PropertyIsEqualTo>
<ogc:PropertyName>冰厚</ogc:PropertyName>
<ogc:Literal>20~30</ogc:Literal>
</ogc:PropertyIsEqualTo>
</ogc:Filter>
<se:PolygonSymbolizer>
<se:Fill>
<se:SvgParameter name="fill">#c800ff</se:SvgParameter>
</se:Fill>
<se:Stroke>
<se:SvgParameter name="stroke">#232323</se:SvgParameter>
<se:SvgParameter name="stroke-width">1</se:SvgParameter>
<se:SvgParameter name="stroke-linejoin">bevel</se:SvgParameter>
</se:Stroke>
</se:PolygonSymbolizer>
</se:Rule>
<se:Rule>
<se:Name>30~40</se:Name>
<se:Description>
<se:Title>30~40</se:Title>
</se:Description>
<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
<ogc:PropertyIsEqualTo>
<ogc:PropertyName>冰厚</ogc:PropertyName>
<ogc:Literal>30~40</ogc:Literal>
</ogc:PropertyIsEqualTo>
</ogc:Filter>
<se:PolygonSymbolizer>
<se:Fill>
<se:SvgParameter name="fill">#c86400</se:SvgParameter>
</se:Fill>
<se:Stroke>
<se:SvgParameter name="stroke">#232323</se:SvgParameter>
<se:SvgParameter name="stroke-width">1</se:SvgParameter>
<se:SvgParameter name="stroke-linejoin">bevel</se:SvgParameter>
</se:Stroke>
</se:PolygonSymbolizer>
</se:Rule>
<se:Rule>
<se:Name>40~50</se:Name>
<se:Description>
<se:Title>40~50</se:Title>
</se:Description>
<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
<ogc:PropertyIsEqualTo>
<ogc:PropertyName>冰厚</ogc:PropertyName>
<ogc:Literal>40~50</ogc:Literal>
</ogc:PropertyIsEqualTo>
</ogc:Filter>
<se:PolygonSymbolizer>
<se:Fill>
<se:SvgParameter name="fill">#00ff00</se:SvgParameter>
</se:Fill>
<se:Stroke>
<se:SvgParameter name="stroke">#232323</se:SvgParameter>
<se:SvgParameter name="stroke-width">1</se:SvgParameter>
<se:SvgParameter name="stroke-linejoin">bevel</se:SvgParameter>
</se:Stroke>
</se:PolygonSymbolizer>
</se:Rule>
<se:Rule>
<se:Name>>50</se:Name>
<se:Description>
<se:Title>>50</se:Title>
</se:Description>
<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
<ogc:PropertyIsEqualTo>
<ogc:PropertyName>冰厚</ogc:PropertyName>
<ogc:Literal>>50</ogc:Literal>
</ogc:PropertyIsEqualTo>
</ogc:Filter>
<se:PolygonSymbolizer>
<se:Fill>
<se:SvgParameter name="fill">#cb3a49</se:SvgParameter>
</se:Fill>
<se:Stroke>
<se:SvgParameter name="stroke">#232323</se:SvgParameter>
<se:SvgParameter name="stroke-width">1</se:SvgParameter>
<se:SvgParameter name="stroke-linejoin">bevel</se:SvgParameter>
</se:Stroke>
</se:PolygonSymbolizer>
</se:Rule>
</se:FeatureTypeStyle>
</UserStyle>
</NamedLayer>
</StyledLayerDescriptor>
5. geoserver 被扫描漏洞的处理方案
最小化暴露 的一个非常有效的安全策略,可以减少攻击面并增强系统的安全性。通过 Nginx 进行反向代理,只转发指定 IP 的请求,限制其他 IP 访问,并且只允许 GET 请求,这些措施会显著降低安全风险。
方案:
- 防火墙和 IP 白名单:通过配置防火墙,仅允许特定 IP 地址(例如地图前端服务器)访问 GeoServer,其他所有请求都被拒绝。
- Nginx 反向代理:使用 Nginx 作为反向代理,将合法请求转发到 GeoServer,且仅暴露瓦片服务接口(
/geoserver/gwc/service/wmts),不暴露其他管理接口。 - 限制 HTTP 方法:通过 Nginx 配置,确保只有
GET请求被转发到 GeoServer,防止其他危险的 HTTP 方法(如POST、DELETE)被滥用。
这种方案的可行性和优点分析
1. 防火墙和 IP 白名单
- 优点:限制外部 IP 访问,只有特定服务器(如前端地图服务器)能够访问 GeoServer。这确保了只有信任的客户端可以请求地图瓦片服务。
- 潜在问题:你需要确保防火墙配置没有误漏,也需要根据服务器变更(如负载均衡、云服务变更)定期更新白名单。
2. Nginx 反向代理
- 优点:
- 转发控制:通过 Nginx,你可以灵活地配置哪些请求被转发到 GeoServer。例如,只转发
/geoserver/gwc/service/wmts请求,其他请求(如管理接口、WMS、WFS 等)都不转发。 - 负载均衡:如果将来需要通过多台 GeoServer 实例来分担负载,Nginx 可以轻松地实现负载均衡。
- 转发控制:通过 Nginx,你可以灵活地配置哪些请求被转发到 GeoServer。例如,只转发
- 潜在问题:
- 如果 Nginx 配置不当,可能会导致某些请求泄漏。需要确保只暴露瓦片服务相关路径,不让其他路径泄露。
- Nginx 配置中需要特别注意 URI 路由,确保路径匹配正确,避免误转发。
3. 限制 HTTP 方法
优点:只允许
GET请求,这减少了潜在的 注入攻击 和 恶意操作,因为 POST、DELETE 等方法通常用于修改数据或执行命令。配置建议:在 Nginx 中,配置如下:
location /geoserver/gwc/service/wmts { limit_except GET { deny all; } }这条规则会确保只有
GET请求能够访问瓦片服务,其他 HTTP 方法会被拒绝。潜在问题:如果瓦片服务本身需要 POST 或其他方法支持(通常不需要),那么需要相应调整配置。
4. HTTPS 加密通信
优点:确保数据传输的安全性,防止中间人攻击(MITM)。
配置建议:配置 Nginx 强制启用 HTTPS,确保数据传输过程中是加密的。
server { listen 443 ssl; server_name example.com; ssl_certificate /path/to/cert.pem; ssl_certificate_key /path/to/key.pem; location /geoserver/gwc/service/wmts { proxy_pass http://localhost:8080; limit_except GET { deny all; } } }
5. 日志监控与安全警告
- 优点:通过 Nginx 配置日志,可以实时监控 GeoServer 的访问情况。可以发现是否存在异常请求、潜在攻击等。
- 建议:配置日志详细程度,并及时设置 报警机制,当请求数量急剧增加或出现不正常的访问模式时,能及时反应。
综合分析:
你提出的方案基本上符合 最小化暴露 和 安全性强化 的最佳实践。只暴露 瓦片服务接口,通过防火墙、IP 白名单、Nginx 反向代理和 HTTP 方法限制,能有效防止不必要的安全风险,并且减少攻击面。
推荐的进一步增强措施:
- 定期审计和更新配置:定期检查和更新 防火墙规则、Nginx 配置,并根据新的安全漏洞及时进行修复。
- 启用日志和监控:确保 Nginx 和 GeoServer 的访问日志启用,并将其与 监控系统(如 Prometheus、ELK Stack)集成,及时捕捉异常流量和请求。
- 定期更新组件:确保 GeoServer 和其依赖的 Jetty、Nginx 等软件定期更新,以避免已知的漏洞被利用。
结论:
通过这种方式,你不仅能实现 最小化暴露,而且通过配置限制 HTTP 方法、控制访问、加密通信等方式增强了整体安全性。这种配置是合理的,只要确保 Nginx 配置正确,定期审计和更新,就能够有效地防范潜在的漏洞风险。