首頁 > 軟體

基於Python實現GeoServer向量檔案批次釋出

2022-07-01 14:01:00

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-bin\data_dir\test_res\"
 
files = getFiles(absolutePath, ".shp")
# 啟動瀏覽器
driver = webdriver.Chrome()
login()
 
for file in files:
    publish_a_layer(workplace, absolutePath, file)
 

以上就是基於Python實現GeoServer向量檔案批次釋出的詳細內容,更多關於Python GeoServer向量檔案發布的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com