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-bindata_dirtest_res"
files=getFiles(absolutePath,".shp")
#启动浏览器
driver=webdriver.Chrome()
login()
for file in files:
publish_a_layer(workplace,absolutePath,file)
综上所述,这篇内容就给大家介绍到这里了,希望可以给各位读者带来帮助。