资讯专栏INFORMATION COLUMN

基于Python实现GeoServer矢量文件批量发布

89542767 / 372人阅读

  小编写这篇文章的主要目的,主要是来给大家做个详细的解答,解答的内容主要是Python的相关内容,包括利用Python实现GeoServer矢量文件的批量发布,具体是怎么样进行操作呢?下面就给大家详细解答下。


  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/,第一行就是版本号

01.png

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


  这里和我的谷歌浏览器最匹配的驱动是

02.png

  下载windows版本的驱动

03.png

  解压后将exe文件放置在main.py文件所在的目录下。


  2.基本流程


  2.1初始化


  运行代码后,程序会自动开启一个google浏览器窗口,接着进入geoserver。

04.png

  2.2登录


  自动输入用户名和密码,并点击登录

05.png

  2.3新建数据源


  进入新建数据源发布页面


  http://localhost:8080/geoserver/web/wicket/bookmarkable/org.geoserver.web.data.store.NewDataPage


  选择shapefile文件格式


  2.4保存数据存储


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

06.png

  2.5发布图层


  首先点击发布

07.png

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

08.png

  最后点击保存完成发布


  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-bindata_dirtest_res"
  files=getFiles(absolutePath,".shp")
  #启动浏览器
  driver=webdriver.Chrome()
  login()
  for file in files:
  publish_a_layer(workplace,absolutePath,file)

  综上所述,这篇内容就给大家介绍到这里了,希望可以给各位读者带来帮助。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/128441.html

相关文章

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

      小编写这篇文章的一个主要目的,主要是来给大家做一个解答,解答的内容是Python+Selenium,具体的一个内容解释是什么呢?比如,我们可以实现Geoserver批量发布Mongo矢量数据,具体的一个内容,下面就给大家详细解答下。  首先,声明一下,这里我完成的脚步属于半自动化的,我戏称它为有监督的半自动化脚本。具体原因后面会详细说明。  一、安装Selenium和ChromeDriver ...

    89542767 评论0 收藏0
  • 还在抱怨pandas运行速度慢?这几个方法会颠覆你的看法

    摘要:它还使用执行所谓的链式索引,这通常会导致意外的结果。但这种方法的最大问题是计算的时间成本。这些都是一次产生一行的生成器方法,类似中使用的用法。在这种情况下,所花费的时间大约是方法的一半。根据每小时所属的应用一组标签。 作者:xiaoyu 微信公众号:Python数据科学 知乎:python数据分析师 showImg(https://segmentfault.com/img/bVboe...

    keelii 评论0 收藏0
  • 慕课网_《如何使用高德云图在线制作属于你的地图》学习总结

    摘要:时间年月日星期日说明本文部分内容均来自慕课网。用户可以在服务器端调用云存储云检索从而构建自己的存储和检索服务,甚至可以制作自己的数据管理台。 时间:2017年08月13日星期日说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学源码:无学习源码:https://github.com/zccodere/s... 第一章:云图产品介绍 1-1 云图产品介绍...

    k00baa 评论0 收藏0
  • 慕课网_《如何使用高德云图在线制作属于你的地图》学习总结

    摘要:时间年月日星期日说明本文部分内容均来自慕课网。用户可以在服务器端调用云存储云检索从而构建自己的存储和检索服务,甚至可以制作自己的数据管理台。 时间:2017年08月13日星期日说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学源码:无学习源码:https://github.com/zccodere/s... 第一章:云图产品介绍 1-1 云图产品介绍...

    afishhhhh 评论0 收藏0
  • Vue下的cesium使用GeoServer的wms服务跨域问题

    摘要:两种方案中间件我没搞成功把文件放进去之后改好了报,这个我没搞成功就不多说了,需要的可以自行搜索一波。需要监听的项目所在端口号就比如我的项目启动端口是,这里就写地址,本地和都可以项目中的路径这个意思就是在项目中访问的时候把请求转到是转发地址 两种方案 coess中间件(我没搞成功) 把class文件放进去之后改好了web.xml报504,这个我没搞成功就不多说了,需要的可以自...

    Seay 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<