0. 前言
由于矢量图层文件较多,手动发布费时费力,python支持的关于geoserver包(geoserver-restconfig)又由于年久失修,无法在较新的geoserver版本中正常使用。
查阅了很多资料,参考了下面这篇博客,我简单写了一个自动化发布矢量文件的代码。
基本流程:获取指定文件夹下所有的.shp文件,在通过模拟正常发布的流程逐个发布。
1. 环境
1.1 基础环境
首先你的电脑要有python环境、谷歌浏览器和geoserver2.19左右的版本
接着在命令行中通过如下指令,安装Web自动化测试工具selenium
pip install selenium
1.2 谷歌浏览器驱动
此外,还需要谷歌浏览器的对应驱动。
首先需要查询你的谷歌浏览器的版本,在谷歌浏览器的网址栏输入chrome://version/,第一行就是版本号
在下面这个网址中找到对应版本号的驱动
CNPM Binaries Mirror (npmmirror.com)https://registry.npmmirror.com/binary.html?path=chromedriver/这里和我的谷歌浏览器最匹配的驱动是
下载windows版本的驱动
解压后将exe文件放置在main.py文件所在的目录下。
2. 基本流程
2.1 初始化
运行代码后,程序会自动开启一个google浏览器窗口,接着进入geoserver。
2.2 登录
自动输入用户名和密码,并点击登录
2.3 新建数据源
进入新建数据源发布页面
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文件的名称来命名图层名称