GeoServer自动发布本地GeoTiff图像,并配置SSL证书和跨域访问

本文档详细介绍了如何配置和自动化发布GeoServer,包括下载和安装Tomcat与GeoServer,设置SSL证书以支持HTTPS,以及允许跨域访问。使用Python的gsconfig-py3库实现数据自动化发布,并针对中文支持问题进行了源码修改。同时,配置了Tomcat和GeoServer以启用SSL和跨域请求,确保安全且高效的远程访问。
摘要由CSDN通过智能技术生成

一、环境配置

  1. 下载Tomcat。我这里下载的是Tomcat9,Tomcat10在运行GeoServer时会出现无法启动的问题。选择32-bit/64-bit Windows Service Installer

    在安装时要设置Manager的用户名和密码。

  2. 下载GeoServer。选择Web Archive

    解压缩后将geoserver.war文件复制到Tomcat/webapps文件夹下。

  3. 运行Tomcat,在浏览器中输入127.0.0.1:8080即可访问Tomcat的欢迎页面。
    在这里插入图片描述
    点击Manager App,输入刚才设置的密码,即可进入应用管理界面。

    点击/geoserver即可打开GeoServer,若右侧运行中为false,需要先点击启动。

    在页面上方进行登录,默认用户名为admin,密码为geoserver

二、自动化发布

GeoServer提供了Rest API对工作区、数据源等进行设置,详细信息可访问GeoServer Rest查看。

目前有很多GeoServer Rest库可供选择,这里我选用了Python的gsconfig-py3库,这是gsconfig的一个分支,使用方式基本相同,安装命令为

pip install gsconfig-py3

gsconfig文档可访问gsconfig’s documentation查阅。

from geoserver.catalog import Catalog


# 连接Catlog
cat = Catalog("http://127.0.0.1:8080/geoserver/rest/")
# 创建工作区
# workspace = cat.create_workspace("test")
# 获取工作区
workspace = cat.get_workspace("city")
# 发布GeoTiff
tiff = "D:/test.tiff"
cat.create_coveragestore("test", tiff, workspace, overwrite=True)

通过Catlog.create_coveragestore()方法可以自动发布数据到GeoServer,但是这个方法会在geoserver/data目录创建一个文件副本,如果是在本机发布的话,就造成了数据冗余,因此可用下面的方法进行发布。

cat.create_coveragestore_external_geotiff("test", tiff, workspace, overwrite=True)

其中第一个参数name为数据源的名称,第二个参数data为要发布的数据,如果是第二个方法的话,需要在路径前添加file://,第三个参数workspace为要发布的工作区,第四个参数overwrite为如果有同名数据源,是否覆写。

虽然通过gsconfig-py3可以成功发布数据到GeoServer,但这两个对中文的支持都很差,在GeoServer中无法设置中文工作区,通过gsconfig-py3也无法传输中文数据,如果文件路径中有中文或者需要设置中文工作区,就只能修改gsconfig-py3源码,对中文进行编码,这样改写之后可以进行发布,但是通过Catlog.get_workspace()获取工作区时,又会发生中文乱码的问题。gsconfig-py3传输数据都是通过XML进行,改写为JSON格式后,中文可以正常显示。

以上操作过于繁琐,因此我参照gsconfig-py3重写了本项目中需要用到的方法。有其他需求的话可以参考编写。

import json
import requests
from urllib import parse


class Catalog:
    def __init__(self, service_url: str, username: str = "admin", password: str = "geoserver"):
        self.service_url = service_url
        self.session = requests.Session()
        self.session.auth = (username, password)

    # 获取工作区,如果存在会返回工作区名称,不存在会返回None
    def get_workspace(self, name: str):
        rest_url = parse.urljoin(
            self.service_url,
            f"workspaces/{name}"
        )
        headers = {"Accept": "application/json"}
        response = self.session.get(rest_url, headers=headers)
        if response.status_code == requests.codes.ok:
            return json.loads(response.content)["workspace"]["name"]
        else:
            return None

    # 创建工作区,如果工作区存在会返回现有工作区名称。
    def create_workspace(self, name: str):
        if self.get_workspace(name) is not None:
            return self.get_workspace(name)
        rest_url = parse.urljoin(
            self.service_url,
            "workspaces"
        )
        headers = {"Content-Type": "application/json"}
        body = {"workspace": {"name": name}}
        params = {"default": True}
        response = self.session.post(
            rest_url, json=body, headers=headers, params=params)
        response.raise_for_status()
        return self.get_workspace(name)
    
    # 参数依次为工作区名称,文件路径(无需加前缀),数据源名称,图层名称。会覆盖同名数据源,自动发布图层。
    def create_coveragestore_external_geotiff(self, workspace: str, tiff_path: str, store_name: str, layer_name: str):
        assert workspace is not None
        rest_url = parse.urljoin(
            self.service_url,
            f"workspaces/{workspace}/coveragestores/{store_name}/external.geotiff"
        )
        headers = {
            "Content-type": "text/plain"
        }
        params = {"configure": "first", "coverageName": layer_name}
        response = self.session.put(
            rest_url, data=f"file://{parse.quote(tiff_path)}", headers=headers, params=params)
        response.raise_for_status()

三、配置SSL证书

打开Tomcat/conf/server.xml文件,取消注释以下内容并修改。

<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
            maxThreads="150" SSLEnabled="true">
    <SSLHostConfig>
        <Certificate certificateKeystoreFile="conf/localhost-rsa.jks"
                        type="RSA" certificateKeystorePassword="password"/>
    </SSLHostConfig>
</Connector>

其中port为监听HTTPS请求的端口,certificateKeystoreFile为证书文件路径,type为证书加密算法,certificateKeystorePassword为证书密码。

四、允许跨域访问

  1. 允许Tomcat跨域。打开Tomcat/conf/web.xml,在文件尾添加如下配置。
<filter>
    <filter-name>CorsFilter</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>
</filter>
<filter-mapping>
    <filter-name>CorsFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>


2. 允许GeoServer跨域。打开Tomcat/webapps/geoserver/WEB-INF/web.xml文件,取消注释以下内容。

<!-- Uncomment following filter to enable CORS in Tomcat. Do not forget the second config block further down. -->
<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>
···
<filter-mapping>
    <filter-name>cross-origin</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
  1. 修改完成后重启Tomcat即可应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值