• 基于Python的GeoServer矢量文件批量发布


    0. 前言

    由于矢量图层文件较多,手动发布费时费力,python支持的关于geoserver包(geoserver-restconfig)又由于年久失修,无法在较新的geoserver版本中正常使用。

    查阅了很多资料,参考了下面这篇博客,我简单写了一个自动化发布矢量文件的代码。

    基本流程:获取指定文件夹下所有的.shp文件,在通过模拟正常发布的流程逐个发布。

    利用Python + Selenium 在 Geoserver 批量发布来自Mongo中的矢量数据_Leo_Franklin的博客-CSDN博客_geoserver mongodbicon-default.png?t=M5H6https://blog.csdn.net/Leo_Franklin/article/details/106191753

    1. 环境

    1.1 基础环境

    首先你的电脑要有python环境、谷歌浏览器和geoserver2.19左右的版本

    接着在命令行中通过如下指令,安装Web自动化测试工具selenium

    pip install selenium

    1.2 谷歌浏览器驱动

    此外,还需要谷歌浏览器的对应驱动。

    首先需要查询你的谷歌浏览器的版本,在谷歌浏览器的网址栏输入chrome://version/,第一行就是版本号

    在下面这个网址中找到对应版本号的驱动

    CNPM Binaries Mirror (npmmirror.com)icon-default.png?t=M5H6https://registry.npmmirror.com/binary.html?path=chromedriver/这里和我的谷歌浏览器最匹配的驱动是

     下载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.NewDataPageicon-default.png?t=M5H6http://localhost:8080/geoserver/web/wicket/bookmarkable/org.geoserver.web.data.store.NewDataPage选择shapefile文件格式

    2.4 保存数据存储

    选择工作区,数据源名称,shapefile文件的位置,设置DBF字符集,点击保存

    2.5 发布图层

    首先点击发布

     接着设置源坐标系,目标坐标系,原始边界和目标边界

     最后点击保存完成发布

    3. 完整代码

    main.py

    1. from time import sleep
    2. from selenium import webdriver
    3. import os
    4. # 登录
    5. def login():
    6. driver.get(baseUrl)
    7. driver.find_element_by_id("username").send_keys(username) # 填入用户名
    8. driver.find_element_by_id("password").send_keys(password) # 填入密码
    9. driver.find_element_by_css_selector(".positive").click()
    10. sleep(0.8)
    11. # 发布一个图层服务
    12. def publish_a_layer(workplace, path, file, defined_srs="EPSG:3857"):
    13. ## ------------ 存储数据----------------
    14. # 进入数据存储
    15. driver.get(baseUrl+"web/wicket/bookmarkable/org.geoserver.web.data.store.NewDataPage")
    16. # 选择shapefile格式
    17. driver.find_element_by_link_text("Shapefile").click()
    18. sleep(0.8)
    19. # 选择工作区
    20. driver.find_element_by_xpath("//fieldset/div[1]/div/select").send_keys(workplace)
    21. # 输入数据源名称
    22. driver.find_element_by_xpath("//fieldset/div[2]/div/input").send_keys(file)
    23. # 清空原有的连接参数
    24. driver.find_element_by_css_selector(".longtext").clear()
    25. # 输入Shapefile文件的位置
    26. driver.find_element_by_css_selector(".longtext").send_keys("file:" + path + file + ".shp")
    27. # 选择DBF的字符集
    28. driver.find_element_by_xpath("//fieldset/div[2]/div/select").send_keys("GB2312")
    29. # 点击保存
    30. driver.find_element_by_link_text("保存").click()
    31. ## ----------------发布图层--------------
    32. sleep(0.8)
    33. # 点击发布
    34. 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()
    35. sleep(0.8)
    36. # 输入图层命名
    37. driver.find_element_by_css_selector("input#name").clear()
    38. driver.find_element_by_css_selector("input#name").send_keys(file)
    39. # 输入图层标题
    40. driver.find_element_by_css_selector("input#title").clear()
    41. driver.find_element_by_css_selector("input#title").send_keys(file)
    42. # 输入定义SRS
    43. 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()
    44. 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)
    45. # 设置边界
    46. driver.find_element_by_link_text("从数据中计算").click()
    47. driver.find_element_by_link_text("Compute from native bounds").click()
    48. driver.find_element_by_id("srsHandling").send_keys("Reproject native to declared")
    49. driver.find_element_by_link_text("从数据中计算").click()
    50. driver.find_element_by_link_text("Compute from native bounds").click()
    51. sleep(0.8)
    52. # 发布图层
    53. driver.find_element_by_link_text("保存").click()
    54. sleep(1)
    55. # 查找dir目录中文件后缀为suffix的文件
    56. def getFiles(dir, suffix):
    57. res = []
    58. for root, directory, files in os.walk(dir): # =>当前根,根下目录,目录下的文件
    59. for filename in files:
    60. name, suf = os.path.splitext(filename) # =>文件名,文件后缀
    61. if suf == suffix:
    62. res.append(name) # =>把一串字符串组合成路径
    63. return res
    64. # 配置参数
    65. username = "admin" # 用户名
    66. password = "geoserver" # 密码
    67. workplace = "test" # 工作区名
    68. # geoserver根网址
    69. baseUrl = "http://localhost:8080/geoserver/"
    70. # 发布文件所在文件夹的绝对路径
    71. absolutePath = "D:\\geoserver-2.19.1-bin\\data_dir\\test_res\\"
    72. files = getFiles(absolutePath, ".shp")
    73. # 启动浏览器
    74. driver = webdriver.Chrome()
    75. login()
    76. for file in files:
    77. publish_a_layer(workplace, absolutePath, file)

    代码中很多参数都可以自行设置,默认是使用shp文件的名称来命名图层名称

  • 相关阅读:
    图文详解Linux基础经典教程(06)——CentOS安装JDK
    2023高频前端面试题-vue
    比较聚合模型实战文本匹配
    高频微观结构:日内及隔夜动量因子
    【COMP329 LEC1 Agents and Autonomous Systems】
    花菁染料 Cy3.5 酸,Cy3.5 acid,Cyanine3.5 carboxylic acid物化光谱特性及结构式解析
    Vue2(十二):Vuex环境搭建、Vuex工作原理、几个配置项、多组件共享数据、Vuex模块化
    ES6展开运算符“...”
    Vue+element 商品列表、新增、编辑、删除业务实现
    [云原生] K8S声明式资源管理
  • 原文地址:https://blog.csdn.net/qq_42276781/article/details/125540121