geoserver
总 —— 配置建议
数据源选择
1、优先选择 PostGIS 作为数据源。PostgreSQL 具有优秀的空间索引、属性索引能力,可以提供快速的数据查询
2、次选 GeoPackage。若网络带宽很有限,或其他原因无法使用 PostGIS,
3、再次 Shapefile。 若需要在界面中展示数十万、上百万条数据,并且不涉及属性过滤,只是查看其几何形状
QGIS配色相关
透明度设置
qgis中要设置样式透明度需要从填充配置的内部去改,如下图修改透明图是有效的
但是从总体设置处改是无法应用到 sld 当中的,如下图的修改是不生效的(对于 SLD 来说)
安装配置
Windows
jdk环境配置
geoserver以tomcat作为服务容器,所以需要依赖 jdk8 或者 jdk11
jdk8的下载地址(点击登录下载,oracle官方地址)
1、安装jdk
2、配置环境变量
新建系统变量 JAVA_HOME,地址 jdk 安装目录
3、环境变量 Path 中添加 %JAVA_HOME%\bin、%JAVA_HOME%\jre\bin
4、cmd中执行 java、javac、java -version 查看环境是否配置成功
geoserver安装
安装一体化包(基于 jetty 推荐)
一体化包比较大,2.19.2 的 geoserver 包有 99M 大小,这个版本是基于 jetty 搭建的
下载这个包后,直接解压,并进入其 bin 目录下运行 startup.bat 即可(要有 java 8 或者 java 11 的环境)
此处注意:1、最好使用 cmd 来运行这个 bat 文件;2、windows下运行 .bat 文件,linux 下运行 .sh 文件
基于tomcat安装
war包版本
解压掉 geoserver 的压缩包,复制里面的 geoserver.war 到 tomcat 的 webapp 下
进入 tomcat 的 bin 目录
运行 startup.bat。此处注意:1、最好使用 cmd 来运行这个 bat 文件;2、windows下运行 .bat 文件,linux 下运行 .sh 文件
Linux(centos7.9)
Linux环境配置(本次的环境使用 centos 7.9 最小安装演示)
1、安装 net-tools(不装就用 ip addr show)、vim (个人习惯,可以不装。不装的话将后面所有 vim 命令换成 vi 即可)
安装net-tools
# yum install -y net-tools.x86_64
安装vim
# yum install -y vim
2、修改本机名及ip地址(把 ip 和 机器名固定下来,最好让客户的网管来做这个事)
1)、查看当前的网卡名,查看有ip地址对应的网卡名(如此处的eth0)
# ifconfig
不装 net-tools 的话就用如下命令查看 ip 地址
# ip addr show
2)、修改网络配置
# vim /etc/sysconfig/network-scripts/ifcfg-eth0
修改:
- BOOTPROTO —— “static” 或者 “none”
最后添加:
- IPADDR —— “ip地址”
- GATEWAY —— “网关”
- NETMASK —— “255.255.255.0”
- DNS1 —— “dns地址”
- DNS2 —— “备用dns地址”
原始如下
修改后如下
3)、重启网卡
# systemctl restart network
4)、修改机器名,步骤一
# vim /etc/hostname
原始如下
修改后如下
5)、修改机器名,步骤二
vim /etc/sysconfig/network
原始如下
修改后如下
5)、修改机器名,步骤三,添加 ip 和域名的映射
vim /etc/hosts
6)、使修改立即生效(其实是改临时的机器名,效果一样)
# hostname geoserver
3、开放端口 8080,依次执行
# firewall-cmd --zone=public --add-port=8080/tcp --permanent
# firewall-cmd --reload
# firewall-cmd --list-all
基于 tomcat 安装
1、下载 jdk8
2、丢到服务器上并解压(丢到 /usr/local/src)
3、配置环境变量,此处我的 jdk 解压后的目录为 “/usr/local/src/jdk1.8.0_301”。添加环境变量步骤如下
1)、编辑 profile
# vim /etc/profile
进入后如下
跳转到最后面,添加
JAVA_HOME=/usr/local/src/jdk1.8.0_281
CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME CLASSPATH PATH
2)、使用环境变量生效
# source /etc/profile
4、下载 tomcat8
完整安装包如下
5、丢到服务器上,并解压开( 此处我丢到了 /usr/local/src )
tar -zxvf apache-tomcat-8.5.70-deployer.tar.gz
6、将 geoserver 的 war 包同样丢到解压后的 tomcat 的 webapps 下(war包下载地址见本文上方 windows 安装处)
7、查看 8080 端口是否被占用
# netstat -anp | grep 8080
8、进入 tomcat --> bin 启动 tomcat
# ./startup.sh
9、安装完成后,在客户端访问 http://192.168.1.64:8080/geoserver 查看是否可以访问
10、也可以正常登录
geoserver
geoserver 是 2001年纽约的The Open Planning Project (TOPP)孵化的,基于 java 编写的开源 gis 服务器,它实现了 OGC 的 WMS、WMTS、WFS、WPS 服务类型
geoserver 有两种安装类型,“一体化安装” 和 “基于tomcat 安装”
geoserver 的开发者还开源了另一个项目 GeoTools,这是一个开源的 GIS java 工具包,旨在增强对 shapefile、oracle 等数据库的支持
性能调优
JVM内存调整
调整可用内存,防止大数据发布或频繁请求时的堆栈溢出,建议修改为机器内存总量的 25%
进入 tomcat 的 bin 目录下,编辑(编辑前先备份一下)catalina.bat 文件
在文件开头(@echo off下)添加如下内容
set JAVA_OPTS=-server -Xms256m -Xmx2048m
如:
内容含义如下
- -server —— 以服务运行
- -Xms —— 最小内存占用(一般建议 256M)
- -Xmx —— 最大内存占用(一般建议最大内存的 25%)
修改完后重启 tomcat
启用 CORS
修改文件 “webapps/geoserver/WEB-INF/web.xml”
tomcat 取消如下内容的注释
<filter>
<filter-name>cross-origin</filter-name>
<filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
<init-param>
<param-name>cors.allowed.origins</param-name>
<param-value>*</param-value>
</init-param>
<init-param>
<param-name>cors.allowed.methods</param-name>
<param-value>GET,POST,PUT,DELETE,HEAD,OPTIONS</param-value>
</init-param>
<init-param>
<param-name>cors.allowed.headers</param-name>
<param-value>*</param-value>
</init-param>
</filter>
tomcat 8 大概在 193行左右,原始如下图
修改后如下图
第二处修改处如下,大概在 222行这里,同样解除注释,原始如下
修改后如下
jetty 如下配置,取消注释以下 <filter> 和 <filter-mapping>
<filter>
<filter-name>cross-origin</filter-name>
<filter-class>org.eclipse.jetty.servlets.CrossOriginFilter</filter-class>
<init-param>
<param-name>chainPreflight</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>allowedOrigins</param-name>
<param-value>*</param-value>
</init-param>
<init-param>
<param-name>allowedMethods</param-name>
<param-value>GET,POST,PUT,DELETE,HEAD,OPTIONS</param-value>
</init-param>
<init-param>
<param-name>allowedHeaders</param-name>
<param-value>*</param-value>
</init-param>
</filter>
jetty 做容器的话,将 170 行左右的内容解除注释
第二处修改处如下(与 tomcat 相同),大概在 222行这里,同样解除注释,原始如下
修改后如下
日志级别调整
日志记录的过于频繁会显著影响服务器的性能,但是 debug 又要依赖于日志,所以在日常运行时,可以将日志调整为低记录级别
日志记录级别的调整进入全局设置
其中,日志处的内容如下
几个级别含义如下:
- DEFAULT_LOGGING —— geoserver 默认开启的日志记录级别,相当于 GEOSERVER… 和 GEOTOOLS 的 INFO 级别
- GEOSERVER_DEVELOPER_LOGGING —— 详细的日志记录级别,包括有关 geoserver 和 VFNY 的全部调试信息,geoserver的开发人员使用
- GEOTOOLS_DEVELOPER_LOGGING —— 同上,不过记录的是 geotools 的全部调试信息,geotools 开发人员用
- PRODUCTION_LOGGING —— 最小记录级别,生产环境推荐。只会记录 geoserver 和 geotools 的 warn 及以上级别
- VERBOSE_LOGGING —— 最详细级别,包含了 geoserver 和 geotools 的全部调试信息
此处将日志记录级别调整为 “PRODUCTION_LOGGING” 级别,以减少日志与服务的IO争夺
另外也可以禁止 “记录到 stdout” 来禁止将日志输出到 tomcat 的控制台
此处调整后的参数如下图
将 tomcat 主页修改为 geoserver 主页
1、以文本形式打开 tomcat --> conf --> server.xml
2、拖到最下面,找到 <host> <\host>标签,并在其中添加如下内容。其中 docBase 属性就是指向主页要访问的目录(因为在 webapps 目录下,所以直接输入目录名即可)
<Context path="" docBase=“geoserver” debug=“0” reloadable=“true” />
原始如下
修改后如下
3、以文本形式打开 tomcat --> conf --> web.xml ,拖到最下方,在 <welcome-file-list> <\welcome-file-list> 标签若存在 index.html,则无须添加条目,若不存在则添加如下图中的 index.html 对应的条目
4、重启 tomcat ,浏览器输入 localhost:8080,查看是否跳转到了 geoserver 的主页
允许目录访问(一般不要开)
以文本形式打开 tomcat --> conf --> web.xml ,搜索 listings,将其值改为 true,默认在 121 行
原始如下
修改后如下
Feature type cache size调整依据
featuretypes 的含义:featuretypes 又叫特征类型,是"数据存储"的描述类型,如当使用 shapefile 时,一个 feature type 与其 “数据存储” 是一对一的关系(即一个 shapfile 的数据存储就对应一个 feature type),当数据存储使用 postgis 时,feature type 与其的对应关系就是多对一
注意:featuretypes 是按照 工作区来区分的
处于性能提升的考虑,geoserver 会把数据库连接和schema缓存到内存中,参数 “Feature type cache size” 的值应当大于并发连接的 featuretypes(特征类型) 的数量。
Tomcat修改端口
进入 tomcat 的 conf 目录,找到server.xml
大概在70行,找到 port=“8080” 改成你需要的端口即可
geoserver配置
千万别做的事
1、可以删除 tomcat —> webapps 里面的非 geoserver 东西,但是 geoserver.war 和 geoserver 的目录一定不要删任何一个
建议尽量这么做
1、若数据源是 shapefile ,尽量保持 “数据存储” 和 “图层名”(即服务名)保持一致
2、若数据源是 pgsql,则 “图层名”(即服务名)尽量以 "数据存储-服务名"形式命名
开启 JSONP
若不开启 jsonp 则 wfs 服务的 返回格式无法使用 “text/javascript” 的格式
开启方式,进入 webapps/geoserver/WEB-INF/web.xml ,修改大概 43 ~ 48 行内容(解除注释就行),原始如下
修改后如下
修改完后重启 tomcat
开启 WMS 与 WMTS 的集成(不太建议)
功能:当调用的 WMS 服务存在切片时,直接返回切片而不让服务器重新生成
注:GWC的集成与 openlayers 预览不兼容,因为 openlayers 的请求图片边界与 GWC 图层的不匹配,openlayers 会使用图层的 bounding box 来计算切片原点,当 bounding box 与 gridset 相同时,openlayers 也可调用 GWC 的切片数据
开启方式:
进入 geoserver --> caching defaults ,如下图,开启
- “Enable direct integration with GeoServer WMS” —— 这个参数是 用来集成 WMS 和 WMTS
- “Explicitly require TILED Parameter” —— 这个参数是用来控制是否要在 url 里明确添加 “tiled=true” 请求参数,若勾选则需要添加,不勾选则默认自动添加
调用条件(如下条件全部满足才可调用切片)
1、geoserver端
- 开启了 “Enable direct integration with GeoServer WMS” 参数
- 图层中勾选了 “Enable tile caching for this layer” 参数
2、客户端
- 请求只引用一个图层
- 请求中的参数 width、height 与图层中的尺寸配置相同
- 请求的坐标系(CRS)与图层配置中的某个 gridsets 相同
- 请求的图像与现存的网格边界(grid bounds)对齐
- 包含的参数有相应的参数过滤器
3、geoserver 和 客户端共同
- 请求的 url 中明确传入 “tiled=true” ( 当配置 “Explicitly require TILED Parameter” 勾选时,若不勾选则无须显示的添加)
启动
启动 geoserver 见安装的后半部分,此处略
geoserver主页
浏览器打开 http://localhost:8080/geoserver 会进入 geoserver 的主页
此处注意:
1、若修改了 tomcat 的端口,则地址中的 8080 修改为对应的端口
2、若开启了 tomcat 的 https 访问,则地址中的 8080 换成 8443 (如果修改了,那换成对应的)
3、直接访问 http://localhost:8080/ 不会跳转到 geoserver 的主页,而是进入 tomcat 的主页 或者 jetty 的主页(jetty 这个是被阉割的,所以主页会提示找不到)
geoserver 默认账号密码是 admin / geoserver
登录后的管理界面如图
GeoWebCache
切片前配置
1、配置切片的存储目录,修改 web.xml 文件,其地址为 geoserver --> WEB-INF —> web.xml
在<web-app>跟元素下,添加如下内容
<context-param>
<param-name>GEOWEBCACHE_CACHE_DIR</param-name>
<param-value>你的geowebcache切片的目录</param-value>
</context-param>
原始如下
修改后如下
重启 tomcat,在定义的存储目录下生成如下文件
geoserver中的集成页面
geoserver 中的 Tile Caching 就是基于 GeoWebCache 完成的
支持的操作如下图,其主要信息如下:
- Disk Quota —— 磁盘配额,若为设置则为 N/A 即无限制
- Disk Used —— 当磁盘配额激活时生效,显示当前磁盘使用量
- Enabled —— 是否对当前图层启用了切片
- Preview —— 对当前层进行预览(非WMS方式)
- Actions —— 控制生成、删除切片
如下方式可以快速删除对应图层的切片
独立控制页面
http://localhost:8080/geoserver/gwc/demo
发布WMTS
常用的切图方法:
- GDAL —— TMS切片
- Mapnik —— 后端的数据处理框架,Python、NodeJS适用
- GeoWebCache —— GeoServer适用,网络服务类型
使用 QGIS 切图发布(mbtiles类型)
关于切图的建议:
- 图块大小优先选择 512 * 512 以避免出现部分区域数据空白的情况
- 图片类型尽量选择 jpg,质量可以通过调整压缩率来调整。若使用 png 则切片会大 6 倍左右(有透明通道的情况下)
- 底图的范围要比项目展示数据的范围大一些,否则在预览数据边界时会前端会疯狂提示404(找不到切片资源, 因为周围没数据)
1、安装 mbtiles 插件(见后方的插件安装)
2、QGIS中进行配图
3、工具箱搜索 mbtiles ,选择栅格工具
4、调整参数,着重注意
- Extent —— 切片范围
- Minimum Zoom —— 最小缩放比例
- Maximum Zoom —— 最大缩放比例
- TileFormat —— 切片类型(PNG支持透明度、JPG不支持透明度,但是一般PNG更大)
5、mbtiles类型的数据需要使用插件进行发布(或者也可以前端使用插件,直接读取 mbtiles 文件)
基于 PostGIS 发布
1、创建数据存储,新建 postgis 数据源
2、设置数据存储名及连接参数
其他所有参数均保留默认,保存完后 自动读取 pg 的当前 schema 中的表,可以直接在此处选择发布
发布过程同普通发布一样,调整服务名 数据范围等参数
3、确认发布
4、创建一个切片方案
5、设置切片方案的名称、坐标系、范围、切片尺寸(建议512*512)、添加切片的层级
6、回到图层属性中,进入 “Tile Caching”
7、勾选图片(jpg、img)、选择切片方案并保存(如果需要则调整样式)
8、进入切片目录(gwc目录 http://localhost:8080/geoserver/gwc)
9、进入图层列表
10、选择刚才的图层,点击 “Seed this layer”
11、设置参数,参数含义如下
- Number of tasks to use —— 切片的并行线程数(小于逻辑核心数即可)
- Type of operation —— 生成切片的方法(全部生成、生成缺失、全部删除)
- Grid Set —— 坐标系
- Format —— 图片格式(建议使用 jpg)
- Zoom start 、Zoom stop —— 切片的缩放范围
- Modifiable Parameters —— 配色方案
12、设置完成后,点击submit,切片进程显示方式如下
发布WFS
其实在发布矢量数据的WMS时候就自动发布了WFS,只不过默认开启的是 basic 的形式(只读形式的 WFS),只需要添加写入的权限即可
另:WFS的数据源并不只支持 SDE,即使数据源是 shapefile 也可以在前端进行修改,但是还是建议用 SDE(postgis)的数据源,毕竟数据库支持 mvcc
发布WFS的必要操作步骤
1、设置 Data
2、每个工作区添加一个单独的权限,若某工作区之前已经添加了权限,则无须再次添加
3、下图中的红框都要进行调整,调整依据如下:
- Workspace —— 设置要修改权限的工作区
- Layer and group —— 这个可以选择 * 即工作区内所有支持WFS的图层
- Access mode —— 改成 Write
- Grant access to any role —— 勾选上,赋予所有角色权限
4、保存之后,WFS即可立即支持写入操作,无须重启 geoserver
5、默认的 WFS 地址( http://localhost:8080/geoserver/ows?service=wfs&version=1.1.0&request=GetCapabilities ),一般把这个参数给到前端就行了。如果前端经验不是很丰富,可能需要提供内部的工作区名和图层名
6、(可选)这个地址也可以用软件调用,然后抓一下网络请求,把网络请求给前端(如果前端拿到这个还调不出来,那就不用管了,只要保证用 QGIS 或者 ArcGIS 能调出来就行)
发布注记数据
注记在 geoserver 中是以样式文件(SLD)存储的,可以使用 QGIS 先配置好注记和配色,然后将样式导出为 SLD 文件,直接应用到服务即可(注记可以支持掩膜)
注记配置过程可见本文的”样式配置“
1、QGIS中注记及配色
2、应用到 geoserver 后如下
发布图层组
图层组相当于arcmap的mxd,将多个图层组织到一起进行发布,目前仅支持WMS服务
1、创建图层组
2、调整"工作区"、手动输入"边界"、手动输入"坐标系"、设置"模式"、添加图层
图层组模式
- single —— 将图层组作为具有自己名称的图层公开,其子图层依旧作为 WMS 中的顶级条目
- opaque container —— 将图层组作为具有自己名称的图层公开,其子图层不可被单独的作为 WMS 服务调用
- named tree —— 具有命名的树状结构,可以公开其内部的子图层
- container tree —— 作为一个容器,但是没有名称,也就没有办法被当作服务调用
- Earth Observation tree —— 该组不进行渲染
注意:图层从上到下的顺序与ArcGIS的图层是反的,即越靠下的图层在实际渲染时越靠上
3、新建的图层组可以从 Layer View 中进行查看
矢量切片
矢量切片的优势
- 渲染由客户端完成,代表渲染的样式可以在客户端自由修改
- 矢量瓦片的体积比切片要小的多,网络传输更快
- 可以达到很高的显示精度
- 客户端可以拿到矢量数据,代表客户端可以通过矢量数据做非常复杂的渲染
1、下载插件
2、将解压后的数据放到 tomcat --> geoserver --> web-inf --> lib
3、重启 geoserver,进入矢量服务的 Tile Caching 支持了 4 种矢量切片格式(application/vnd.mapbox-vector-tile 是效率最高的)
4、此处我仅开启 mvt 格式的矢量切片
5、配置完后从 Tile Layers 里的预览方式里已经可以看到支持矢量切片了
6、从预览界面可以看到,图层正常加载,并且请求的数据类型确实为 mvt 的矢量切片,并且请求方式也确实为 wmts
7、跳转到切片界面
8、开始切片
9、切片正常生成
geoserver插件
下载地址
mbtiles
下载(下载 plunin 那个就行, store 那个可以不下)
将 mbtiles 解压出来
将解压出来的 jar 包全部复制,粘贴到 tomcat —> webapp --> geoserver --> WEB-INF --> lib 中,有提示需要替换就替换
如:apache-tomcat-8.5.56\webapps\geoserver\WEB-INF\lib
重启 tomcat 即可,打开 geoserver --> 新建数据存储 此处可以看到 mbtiles 类型
wps
wps插件从 geoserver 的官网下载
同样安装的时候把插件解压开,安装过程同 mbtiles
tomcat预配置(碰不到服务器的时候先配这个)
启用管理员账户
打开文件 tomcat-users.xml,该文件位于 tomcat 安装目录的 conf 下
在倒数第二行添加如下内容
<user username="admin" password="你的密码" roles="manager-gui"/>
在修改另一个文件 context.xml,位于 apache-tomcat-8.5.56\webapps\manager\META-INF
浏览器打开 http://localhost:8080/manager/html
调整允许上传文件大小
修改 web.xml 文件,位于 apache-tomcat-8.5.56\webapps\manager\WEB-INF
调整下图的值,适当扩大即可
数据处理部分(非常规方法)
gdal环境配置
1、下载gdal核心控件
一溜下一步安装完
2、配置环境变量,添加三个环境变量
GDAL —— C:\Program Files\GDAL
GDAL_DATA —— C:\Program Files\GDAL\gdal-data
GDAL_DRIVER_PATH —— C:\Program Files\GDAL\gdalplugins
path 中添加 %GDAL%
3、打开 cmd 运行 gdalinfo 查看是否正常
如上图提示 org_MSSQLSpatial.dll 找不到指定模块,如果用不到 ms sql 的话,直接把这个文件删掉就行。这个文件位于 C:\Program Files\GDAL\gdalplugins
删掉上述文件,重新运行在cmd中 gdalinfo
4、下载 gdal 的 whl 包
5、解压 gdal压缩包,安装扩展即可
6、查看 gdal 扩展是否安装成功(python -m pip show gdal)
img转tif(gdal)
geoserver 默认无法发布 .img 格式的影像
将 img 转换为 tif 的代码如下
from osgeo import gdal
img = r"E:\DEM\DEM30.img"
tif = r"D:\temp\tif\DEM30.tif"
# 读取数据
img_ds = gdal.Open(img)
# 转出为 tif 模式
gdal.Translate(tif, img_ds, format="GTiff")
实例
点使用图片
将图片保存到 geoserver 的工作空间的 styles 内部(如:D:\softs\apache-tomcat-8.5.56-windows-x64\apache-tomcat-8.5.56\webapps\geoserver\data\workspaces\Test\styles)
<?xml version="1.0" encoding="ISO-8859-1"?>
<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">
<NamedLayer>
<Name>Point as graphic</Name>
<UserStyle>
<Title>GeoServer SLD Cook Book: Point as graphic</Title>
<FeatureTypeStyle>
<Rule>
<PointSymbolizer>
<Graphic>
<ExternalGraphic>
<OnlineResource
xlink:type="simple"
xlink:href="smileyface.png" />
<Format>image/png</Format>
</ExternalGraphic>
<Size>32</Size>
</Graphic>
</PointSymbolizer>
</Rule>
</FeatureTypeStyle>
</UserStyle>
</NamedLayer>
</StyledLayerDescriptor>
修改postgis字段名
1、原始数据如下,测试修改 1个属性字段(new_osm_id)和1个几何字段(geom)
服务可以正常访问,并且属性正常显示
2、将 new_osm_id 改为 new_new_new_new_osm_id
图形可显示,但是属性查询失败
重启 geoserver 服务及属性均可正常访问
3、修改几何字段 geom new_geom
服务无法访问
重启 geoserver,服务可正常访问
Geojson可正常返回(WFS服务也正常)
索引是否正常
1)、修改几何字段,空间索引会自动更新。但是不确定只是修改了索引指向的字段名还是进行了索引重建
2)、修改属性字段,属性索引也会自动更新
先创建 btree 索引
修改字段名后
结论:
1、 无论属性或几何字段均可通过 sql 去修改字段名
alter table xxx rename old_field_name to new_field_name
2、属性或几何字段修改完可以选择在页面上对数据进行“重载”或者直接重启 geoserver(tomcat),服务(WMS、WFS)即可正常访问
3、无论修改的是几何字段还是属性字段,索引都会自动改变到对应字段上