基于Python的GeoServer矢量文件批量发布

本文介绍了如何使用Python结合Selenium自动化发布Geoserver的矢量图层。首先确保环境配置,包括Python、Chrome浏览器和对应的驱动。然后,通过Selenium模拟登录Geoserver,逐个发布指定文件夹下的.shp文件。代码详细展示了从新建数据源到设置坐标系和边界的整个发布流程。
摘要由CSDN通过智能技术生成

0. 前言

由于矢量图层文件较多,手动发布费时费力,python支持的关于geoserver包(geoserver-restconfig)又由于年久失修,无法在较新的geoserver版本中正常使用。

查阅了很多资料,参考了下面这篇博客,我简单写了一个自动化发布矢量文件的代码。

基本流程:获取指定文件夹下所有的.shp文件,在通过模拟正常发布的流程逐个发布。

利用Python + Selenium 在 Geoserver 批量发布来自Mongo中的矢量数据_Leo_Franklin的博客-CSDN博客_geoserver mongodbicon-default.png?t=M5H6https://blog.csdn.net/Leo_Franklin/article/details/106191753

1. 环境

1.1 基础环境

首先你的电脑要有python环境、谷歌浏览器和geoserver2.19左右的版本

接着在命令行中通过如下指令,安装Web自动化测试工具selenium

pip install selenium

1.2 谷歌浏览器驱动

此外,还需要谷歌浏览器的对应驱动。

首先需要查询你的谷歌浏览器的版本,在谷歌浏览器的网址栏输入chrome://version/,第一行就是版本号

在下面这个网址中找到对应版本号的驱动

CNPM Binaries Mirror (npmmirror.com)icon-default.png?t=M5H6https://registry.npmmirror.com/binary.html?path=chromedriver/这里和我的谷歌浏览器最匹配的驱动是

 下载windows版本的驱动

解压后将exe文件放置在main.py文件所在的目录下。

2. 基本流程

2.1 初始化

运行代码后,程序会自动开启一个google浏览器窗口,接着进入geoserver。

2.2 登录

自动输入用户名和密码,并点击登录

2.3 新建数据源

进入新建数据源发布页面

http://localhost:8080/geoserver/web/wicket/bookmarkable/org.geoserver.web.data.store.NewDataPageicon-default.png?t=M5H6http://localhost:8080/geoserver/web/wicket/bookmarkable/org.geoserver.web.data.store.NewDataPage选择shapefile文件格式

2.4 保存数据存储

选择工作区,数据源名称,shapefile文件的位置,设置DBF字符集,点击保存

2.5 发布图层

首先点击发布

 接着设置源坐标系,目标坐标系,原始边界和目标边界

 最后点击保存完成发布

3. 完整代码

main.py

from time import sleep
from selenium import webdriver
import os

# 登录
def login():
    driver.get(baseUrl)
    driver.find_element_by_id("username").send_keys(username) # 填入用户名
    driver.find_element_by_id("password").send_keys(password) # 填入密码
    driver.find_element_by_css_selector(".positive").click()
    sleep(0.8)

# 发布一个图层服务
def publish_a_layer(workplace, path, file, defined_srs="EPSG:3857"):
    ## ------------ 存储数据----------------
    # 进入数据存储
    driver.get(baseUrl+"web/wicket/bookmarkable/org.geoserver.web.data.store.NewDataPage")
    # 选择shapefile格式
    driver.find_element_by_link_text("Shapefile").click()
    sleep(0.8)
    # 选择工作区
    driver.find_element_by_xpath("//fieldset/div[1]/div/select").send_keys(workplace)
    # 输入数据源名称
    driver.find_element_by_xpath("//fieldset/div[2]/div/input").send_keys(file)
    # 清空原有的连接参数
    driver.find_element_by_css_selector(".longtext").clear()
    # 输入Shapefile文件的位置
    driver.find_element_by_css_selector(".longtext").send_keys("file:" + path + file + ".shp")
    # 选择DBF的字符集
    driver.find_element_by_xpath("//fieldset/div[2]/div/select").send_keys("GB2312")
    # 点击保存
    driver.find_element_by_link_text("保存").click()
    ## ----------------发布图层--------------
    sleep(0.8)
    # 点击发布
    driver.find_element_by_xpath("/html/body/div[2]/div/div[2]/div[2]/div/div[2]/div/table/tbody/tr/td[3]/span/a").click()
    sleep(0.8)
    # 输入图层命名
    driver.find_element_by_css_selector("input#name").clear()
    driver.find_element_by_css_selector("input#name").send_keys(file)
    # 输入图层标题
    driver.find_element_by_css_selector("input#title").clear()
    driver.find_element_by_css_selector("input#title").send_keys(file)
    # 输入定义SRS
    driver.find_element_by_xpath("/html/body/div[2]/div/div[2]/div[2]/form/div[2]/div[2]/div[1]/div/ul/div/li[1]/fieldset/ul/li[2]/span/input").clear()
    driver.find_element_by_xpath("/html/body/div[2]/div/div[2]/div[2]/form/div[2]/div[2]/div[1]/div/ul/div/li[1]/fieldset/ul/li[2]/span/input").send_keys(defined_srs)
    # 设置边界
    driver.find_element_by_link_text("从数据中计算").click()
    driver.find_element_by_link_text("Compute from native bounds").click()
    driver.find_element_by_id("srsHandling").send_keys("Reproject native to declared")
    driver.find_element_by_link_text("从数据中计算").click()
    driver.find_element_by_link_text("Compute from native bounds").click()
    sleep(0.8)
    # 发布图层
    driver.find_element_by_link_text("保存").click()
    sleep(1)

# 查找dir目录中文件后缀为suffix的文件
def getFiles(dir, suffix): 
    res = []
    for root, directory, files in os.walk(dir):  # =>当前根,根下目录,目录下的文件
        for filename in files:
            name, suf = os.path.splitext(filename) # =>文件名,文件后缀
            if suf == suffix:
                res.append(name) # =>把一串字符串组合成路径
    return res

# 配置参数
username = "admin"       # 用户名
password = "geoserver"   # 密码
workplace = "test"       # 工作区名

# geoserver根网址
baseUrl = "http://localhost:8080/geoserver/"

# 发布文件所在文件夹的绝对路径    
absolutePath = "D:\\geoserver-2.19.1-bin\\data_dir\\test_res\\"

files = getFiles(absolutePath, ".shp")
# 启动浏览器
driver = webdriver.Chrome()
login()

for file in files:
    publish_a_layer(workplace, absolutePath, file)

代码中很多参数都可以自行设置,默认是使用shp文件的名称来命名图层名称

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要实现 Python 自动发布 Geoserver 的功能,可以使用 Geoserver REST API。以下是一个基本的 Python 脚本,可以通过 REST API 发布一个 GeoTIFF 文件: ```python import requests # 设置 Geoserver 的地址和用户名密码 geoserver_url = "http://localhost:8080/geoserver" username = "admin" password = "geoserver" # 发布图层名和工作区 workspace = "myworkspace" layer_name = "mylayer" # GeoTIFF 文件的路径 file_path = "/path/to/myfile.tif" # 构建 REST API 的请求 URL url = f"{geoserver_url}/rest/workspaces/{workspace}/coveragestores/{layer_name}/file.geotiff" # 发送 POST 请求并上传 GeoTIFF 文件 with open(file_path, "rb") as f: headers = {"Content-type": "image/tiff"} r = requests.post(url, auth=(username, password), headers=headers, data=f) # 如果上传成功,会返回 201 状态码 if r.status_code == 201: print("Layer published successfully.") else: print("Failed to publish layer.") ``` 上述代码中,我们首先设置了 Geoserver 的地址和用户名密码,然后指定了发布图层名、工作区和 GeoTIFF 文件的路径。接下来,我们使用 requests 库发送一个 POST 请求,并在请求头中指定上传的文件类型为 image/tiff。最后,根据响应的状态码来判断发布是否成功。 需要注意的是,如果你的 GeoTIFF 文件包含了地理信息,那么你需要在上传之前先设置该图层的坐标参考系和范围。你可以使用 Geoserver 的 REST API 来完成这项工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Toblerone_Wind

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值