python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python批量发布Mongo矢量数据

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

作者:Leo_Franklin

这篇文章主要为大家详细介绍了如何利用Python+Selenium实现在 Geoserver批量发布来自Mongo中的矢量数据,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下

首先,声明一下,这里我完成的脚步属于半自动化的,我戏称它为“有监督的半自动化”脚本。具体原因后面会详细说明。

一、安装 Selenium和ChromeDriver

安装Selenium:

pip install selenium

安装ChromeDriver

ChromeDriver下载地址: chromedirver.

注意:下载的版本号要和自己Chrome版本号一样

二、安装Geoserver必要插件

注意:安装的geoserver插件版本要和安装的geoserver版本号完全一致,否则会报错

1.安装Mongodb插件:

以我的本地geoserver版本为例:

解压后得到的jar文件

将得到的jar文件粘贴到这里,重启tomcat服务器即可安装

2.安装矢量插件

这是从官网插件下载后的并且解压后的样子,安装方式同Mongo插件一样

三、关于Selenium中XPath的使用技巧

1.在要操作的网站按F12打开Chrome的调试工具,选择元素选择工具,如下图所示:

2.选择你要操作的元素,如下所示:在这里插入图片描述

3.右键Copy,选择复制完整的XPath路径,这样就可以精准的引用到代码中了。

四、脚本编写

完整代码如下:

from selenium import webdriver
from selenium.webdriver.support.ui import Select
import time
count = 0 # 用于统计带发布图层个数

wd = webdriver.Chrome()
wd.implicitly_wait(5) # 隐藏式等待
wd.get('http://localhost:8080/geoserver/web/') # 链接本地的geoserver
wd.find_element_by_id("username").send_keys("admin") # 填入用户名
wd.find_element_by_id("password").send_keys("geoserver") # 填入密码
wd.find_element_by_css_selector(".positive").click()
time.sleep(1)
wd.find_element_by_xpath('//*[@id="navigation"]/li[2]/ul/li[4]/a/span').click() # 选择图层页
time.sleep(1)
wd.find_element_by_xpath('//*[@id="page"]/div[1]/div[2]/ul/li[1]/a').click() # 新建图层
time.sleep(1)
select = Select(wd.find_element_by_css_selector(".select2-hidden-accessible")) # 选择工作区
time.sleep(1)
select.select_by_index(4) # 这里数字根据需求自行调整

elements = wd.find_elements_by_xpath('/html/body/div[2]/div/div[2]/div[2]/div/div[2]/div/table/tbody/tr[*]/td[2]/span')

# 统计MongoDB中待发布的图层个数
for element in elements:
    print(element.text)
    count = count + 1
print(count)

wd.find_element_by_xpath('//*[@id="navigation"]/li[2]/ul/li[4]/a/span').click() # 退回到图层页

for i in range(1, count): #这里的count可以不用,直接自己指定范围
    wd.find_element_by_xpath('//*[@id="page"]/div[1]/div[2]/ul/li[1]/a').click() # 新建图层
    time.sleep(1)
    select = Select(wd.find_element_by_css_selector(".select2-hidden-accessible")) # 选择工作区
    time.sleep(1)
    select.select_by_index(14) # 这里数字根据需求自行调整
    time.sleep(1)
    wd.find_element_by_xpath('/html/body/div[2]/div/div[2]/div[2]/div/div[2]/div/table/tbody/tr['+ str(i) + ']/td[3]/span/a/span').click() # 点击进入发布配置
    time.sleep(1)
    wd.find_element_by_xpath('/html/body/div[2]/div/div[2]/div[2]/form/div[2]/div[2]/div[1]/div/ul/div/li[2]/fieldset/ul/li[1]/div[2]/a[1]').click() # 选择范围
    time.sleep(6)
    wd.find_element_by_xpath('/html/body/div[2]/div/div[2]/div[2]/form/div[2]/div[2]/div[1]/div/ul/div/li[2]/fieldset/ul/li[2]/a').click()# 选择范围
    time.sleep(6)
    wd.find_element_by_xpath('/html/body/div[2]/div/div[2]/div[2]/form/div[2]/div[1]/ul/li[4]/a/span').click() # 切换到title cacheing
    time.sleep(1)
    wd.find_element_by_xpath("/html/body/div[2]/div/div[2]/div[2]/form/div[2]/div[2]/div/fieldset/ul/li[2]/div/ul/li[6]/div[1]/input").click() # 点击需要添加的矢量切片
    # time.sleep(1)
    wd.find_element_by_xpath("/html/body/div[2]/div/div[2]/div[2]/form/div[2]/div[2]/div/fieldset/ul/li[2]/div/ul/li[6]/div[2]/input").click() # 点击需要添加的矢量切片
    # time.sleep(1)
    wd.find_element_by_xpath("/html/body/div[2]/div/div[2]/div[2]/form/div[2]/div[2]/div/fieldset/ul/li[2]/div/ul/li[6]/div[3]/input").click() # 点击需要添加的矢量切片
    # time.sleep(1)
    wd.find_element_by_xpath("/html/body/div[2]/div/div[2]/div[2]/form/div[2]/div[2]/div/fieldset/ul/li[2]/div/ul/li[6]/div[4]/input").click() # 点击需要添加的矢量切片
    # time.sleep(1)
    wd.find_element_by_xpath("/html/body/div[2]/div/div[2]/div[2]/form/div[2]/div[2]/div/fieldset/ul/li[2]/div/ul/li[7]/input").send_keys(10) # 添加时长
    # time.sleep(1)
    wd.find_element_by_xpath("/html/body/div[2]/div/div[2]/div[2]/form/div[2]/div[2]/div/fieldset/ul/li[2]/div/ul/li[8]/input").send_keys(10) # 添加时长
    # time.sleep(1)
    wd.find_element_by_css_selector("#page div.button-group.selfclear > a:nth-child(1)").click()
    time.sleep(1)

解释一下:代码中出现了time.sleep(6),6秒,大家可能会觉得等待的时间有些长,但是这是博主在实践中觉得可行的时间。因为有的地方数据量太大,geoserver计算边框时会耗时较长,导致崩溃,如果大家的数据量较小,则可以把,这里的时间调小,或者没有。

这里Mongon的链接之类的工作都是在,之前手动操作的,没有做自动化,毕竟也没有多少,这就是半自动化,而监督是脚本执行过程中如果还是避免不了,计算时间过长,则相应图层手动发布,之后的调整代码for循环的range后再次执行即可。

再给大家晒一下geoserver计算边框时长超过的后果:

到此这篇关于Python+Selenium实现在Geoserver批量发布Mongo矢量数据的文章就介绍到这了,更多相关Python批量发布Mongo矢量数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文