利用Python + Selenium 在 Geoserver 批量發佈來自Mongo中的矢量數據

首先,聲明一下,這裏我完成的腳步屬於半自動化的,我戲稱它爲“有監督的半自動化”腳本。具體原因後面會詳細說明。

一、安裝 Selenium和ChromeDriver

  1. 安裝Selenium:
pip install selenium

不熟悉Selenium的同學,推薦以下學習鏈接:Selenium學習.

  1. 安裝ChromeDriver
    ChromeDriver下載地址: chromedirver.
    注意:下載的版本號要和自己Chrome版本號一樣

二、安裝Geoserver必要插件

注意:安裝的geoserver插件版本要和安裝的geoserver版本號完全一致,否則會報錯

  1. 安裝Mongodb插件:
    以我的本地geoserver版本爲例:
    解壓後得到的jar文件mongo插件
    將得到的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計算邊框時長超過的後果:
在這裏插入圖片描述
最後,寫的不足之處歡迎大家在評論區多多交流與指正!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章