基于Python實現(xiàn)GeoServer矢量文件批量發(fā)布
0. 前言
由于矢量圖層文件較多,手動發(fā)布費時費力,python支持的關(guān)于geoserver包(geoserver-restconfig)又由于年久失修,無法在較新的geoserver版本中正常使用。
查閱了很多資料,參考了下面這篇博客,我簡單寫了一個自動化發(fā)布矢量文件的代碼。
基本流程:獲取指定文件夾下所有的.shp文件,在通過模擬正常發(fā)布的流程逐個發(fā)布。
Python+Selenium實現(xiàn)在Geoserver批量發(fā)布Mongo矢量數(shù)據(jù)
1. 環(huán)境
1.1 基礎(chǔ)環(huán)境
首先你的電腦要有python環(huán)境、谷歌瀏覽器和geoserver2.19左右的版本
接著在命令行中通過如下指令,安裝Web自動化測試工具selenium
pip install selenium
1.2 谷歌瀏覽器驅(qū)動
此外,還需要谷歌瀏覽器的對應(yīng)驅(qū)動。
首先需要查詢你的谷歌瀏覽器的版本,在谷歌瀏覽器的網(wǎng)址欄輸入chrome://version/,第一行就是版本號

在這個網(wǎng)址中找到對應(yīng)版本號的驅(qū)動
這里和我的谷歌瀏覽器最匹配的驅(qū)動是

下載windows版本的驅(qū)動

解壓后將exe文件放置在main.py文件所在的目錄下。
2. 基本流程
2.1 初始化
運行代碼后,程序會自動開啟一個google瀏覽器窗口,接著進(jìn)入geoserver。

2.2 登錄
自動輸入用戶名和密碼,并點擊登錄

2.3 新建數(shù)據(jù)源
進(jìn)入新建數(shù)據(jù)源發(fā)布頁面
http://localhost:8080/geoserver/web/wicket/bookmarkable/org.geoserver.web.data.store.NewDataPage
選擇shapefile文件格式
2.4 保存數(shù)據(jù)存儲
選擇工作區(qū),數(shù)據(jù)源名稱,shapefile文件的位置,設(shè)置DBF字符集,點擊保存

2.5 發(fā)布圖層
首先點擊發(fā)布

接著設(shè)置源坐標(biāo)系,目標(biāo)坐標(biāo)系,原始邊界和目標(biāo)邊界

最后點擊保存完成發(fā)布
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)
# 發(fā)布一個圖層服務(wù)
def publish_a_layer(workplace, path, file, defined_srs="EPSG:3857"):
## ------------ 存儲數(shù)據(jù)----------------
# 進(jìn)入數(shù)據(jù)存儲
driver.get(baseUrl+"web/wicket/bookmarkable/org.geoserver.web.data.store.NewDataPage")
# 選擇shapefile格式
driver.find_element_by_link_text("Shapefile").click()
sleep(0.8)
# 選擇工作區(qū)
driver.find_element_by_xpath("http://fieldset/div[1]/div/select").send_keys(workplace)
# 輸入數(shù)據(jù)源名稱
driver.find_element_by_xpath("http://fieldset/div[2]/div/input").send_keys(file)
# 清空原有的連接參數(shù)
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("http://fieldset/div[2]/div/select").send_keys("GB2312")
# 點擊保存
driver.find_element_by_link_text("保存").click()
## ----------------發(fā)布圖層--------------
sleep(0.8)
# 點擊發(fā)布
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)
# 輸入圖層標(biāo)題
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)
# 設(shè)置邊界
driver.find_element_by_link_text("從數(shù)據(jù)中計算").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("從數(shù)據(jù)中計算").click()
driver.find_element_by_link_text("Compute from native bounds").click()
sleep(0.8)
# 發(fā)布圖層
driver.find_element_by_link_text("保存").click()
sleep(1)
# 查找dir目錄中文件后綴為suffix的文件
def getFiles(dir, suffix):
res = []
for root, directory, files in os.walk(dir): # =>當(dāng)前根,根下目錄,目錄下的文件
for filename in files:
name, suf = os.path.splitext(filename) # =>文件名,文件后綴
if suf == suffix:
res.append(name) # =>把一串字符串組合成路徑
return res
# 配置參數(shù)
username = "admin" # 用戶名
password = "geoserver" # 密碼
workplace = "test" # 工作區(qū)名
# geoserver根網(wǎng)址
baseUrl = "http://localhost:8080/geoserver/"
# 發(fā)布文件所在文件夾的絕對路徑
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實現(xiàn)GeoServer矢量文件批量發(fā)布的詳細(xì)內(nèi)容,更多關(guān)于Python GeoServer矢量文件發(fā)布的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python中常用檢測字符串相關(guān)函數(shù)匯總
這篇文章主要介紹了python中常用檢測字符串相關(guān)函數(shù),實例匯總了Python針對字符串?dāng)?shù)字、字母、大小寫等常用檢測函數(shù),非常具有實用價值,需要的朋友可以參考下2015-04-04
解決Python3錯誤:SyntaxError: unexpected EOF while
這篇文章主要介紹了解決Python3錯誤:SyntaxError: unexpected EOF while parsin問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07
Python常用數(shù)據(jù)結(jié)構(gòu)和公共方法技巧總結(jié)
這篇文章主要介紹了Python常用數(shù)據(jù)結(jié)構(gòu)和公共方法技巧總結(jié),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的朋友可以參考一下2022-08-08
使用Keras畫神經(jīng)網(wǎng)絡(luò)準(zhǔn)確性圖教程
這篇文章主要介紹了使用Keras畫神經(jīng)網(wǎng)絡(luò)準(zhǔn)確性圖教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06
用Python實現(xiàn)寫倒序輸出(任意位數(shù))
這篇文章主要介紹了用Python實現(xiàn)寫倒序輸出(任意位數(shù)),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-05-05
python實現(xiàn)逆序輸出一個數(shù)字的示例講解
今天小編就為大家分享一篇python實現(xiàn)逆序輸出一個數(shù)字的示例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-06-06
基于Python實現(xiàn)簡單的人臉識別系統(tǒng)
這篇文章主要介紹了如何通過Python實現(xiàn)一個簡單的人臉識別系統(tǒng),文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Python有一定的幫助,感興趣的可以跟隨小編一起試一試2022-01-01
Python編程使用matplotlib繪制動態(tài)圓錐曲線示例
這篇文章主要介紹了Python使用matplotlib繪制動態(tài)的圓錐曲線示例實現(xiàn)代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-10-10

