基于Python实现GeoServer矢量文件批量发布

 更新时间:2022年07月01日 11:19:37   作者:Toblerone_Wind  
由于矢量图层文件较多,手动发布费时费力,python支持的关于geoserver包又由于年久失修,无法在较新的geoserver版本中正常使用。本文为大家准备了Python自动化发布矢量文件的代码,需要的可以参考一下

0. 前言

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

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

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

Python+Selenium实现在Geoserver批量发布Mongo矢量数据

1. 环境

1.1 基础环境

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

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

pip install selenium

1.2 谷歌浏览器驱动

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

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

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

这里和我的谷歌浏览器最匹配的驱动是

下载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.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)
 

以上就是基于Python实现GeoServer矢量文件批量发布的详细内容,更多关于Python GeoServer矢量文件发布的资料请关注脚本之家其它相关文章!

相关文章

  • 基于Django drf框架序列化视图

    基于Django drf框架序列化视图

    这篇文章主要为大家介绍了基于Django drf框架序列化视图,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • python中的 sorted()函数和sort()方法区别

    python中的 sorted()函数和sort()方法区别

    这篇文章主要介绍了python中的 sorted()函数和sort()方法,首先看sort()方法,sort方法只能对列表进行操作,而sorted可用于所有的可迭代对象。具体内容需要的小伙伴可以参考下面章节
    2022-02-02
  • 在Python中移动目录结构的方法

    在Python中移动目录结构的方法

    这篇文章主要介绍了在Python中移动目录结构的方法,需要的朋友可以参考下
    2016-01-01
  • python中append函数用法讲解

    python中append函数用法讲解

    在本篇文章里小编给大家整理的是一篇关于python中append函数用法讲解内容,有兴趣的朋友们可以学习下。
    2020-12-12
  • Python中Parser的用法小结

    Python中Parser的用法小结

    argparse 模块还会自动生成帮助和使用手册,并在用户给程序传入无效参数时报出错误信息,本文给大家介绍Python中Parser的用法小结, 感兴趣的朋友一起看看吧
    2023-12-12
  • python3中calendar返回某一时间点实例讲解

    python3中calendar返回某一时间点实例讲解

    在本篇内容里小编给大家整理了关于python3中calendar返回某一时间点实例讲解内容,有兴趣的朋友们可以参考学习下。
    2020-11-11
  • 关于 Python json中load和loads区别

    关于 Python json中load和loads区别

    这篇文章主要介绍了关于 Python json中load和loads区别,文章也有简单的说明它们之间的相同点,然后详细介绍不同点,需要的朋友可以参考一下文章的具体内容
    2021-11-11
  • Python异步之迭代器如何使用详解

    Python异步之迭代器如何使用详解

    这篇文章主要为大家介绍了Python异步之迭代器如何使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • Python利用字典将两个通讯录文本合并为一个文本实例

    Python利用字典将两个通讯录文本合并为一个文本实例

    这篇文章主要介绍了Python利用字典将两个通讯录文本合并为一个文本实例,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • python合并已经存在的sheet数据到新sheet的方法

    python合并已经存在的sheet数据到新sheet的方法

    今天小编就为大家分享一篇python合并已经存在的sheet数据到新sheet的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12

最新评论