GeoService.py 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. # -*- coding: utf-8 -*-
  2. __author__ = 'wanger'
  3. __date__ = '2024-08-27'
  4. __copyright__ = '(C) 2024 by siwei'
  5. __revision__ = '1.0'
  6. import time
  7. from processing.tools.GeoServer.Geoserver import Geoserver
  8. from processing.tools.QGS.QgsProjectUtils import QgsProjectUtils
  9. from processing.tools.FileUtils import getInputFileName
  10. from processing.tools.StringUtils import getUUID
  11. from processing.tools.PostgreSQL.PostgreSQL import PostgreSQL
  12. from qgis.PyQt.QtCore import NULL
  13. class GeoService:
  14. def __init__(
  15. self
  16. ):
  17. print("---GeoService init---")
  18. def publishGeoService(self, parameters, context, feedback, commands, zymlbsm, layer_group_join, raster_file):
  19. print(parameters)
  20. print(commands)
  21. # server_name = parameters.get("Server_NAME").encode("gbk") # 服务名称
  22. geoserver_layer_name = ""
  23. server_name = parameters.get("Server_NAME") # 服务名称
  24. all_vector_layers = []
  25. geoserverurl = parameters.get("GeoServer_URI")
  26. GeoServerConfig = {
  27. "uri": geoserverurl,
  28. "username": parameters.get("GeoServer_USERNAME"),
  29. "password": parameters.get("GeoServer_PASSWORD"),
  30. "workspace": parameters.get("GeoServer_WORKSPACE"),
  31. "caching_start": parameters.get("GeoServer_Caching_Start"),
  32. "caching_stop": parameters.get("GeoServer_Caching_Stop"),
  33. "style": "",
  34. "cachescheme": "WebMercatorQuadx2",
  35. "servertype": "geoserver",
  36. "servicetype": "wmts" if parameters.get("GeoServer_Caching") == True else "wms",
  37. "serviceurl": f'{geoserverurl}/gwc/service/wmts' if parameters.get(
  38. "GeoServer_Caching") == True else f'{geoserverurl}/wms',
  39. }
  40. geoserver = Geoserver(GeoServerConfig["uri"], username=GeoServerConfig["username"],
  41. password=GeoServerConfig["password"])
  42. # 创建工作空间
  43. # geoserver.create_workspace(workspace=GeoServerConfig["workspace"])
  44. # GeoServer服务发布相关信息存储
  45. service_sjy = []
  46. # 判断是postgis
  47. if parameters.get("TABLE") is not None and parameters.get("TABLE") != "":
  48. DataSourceConfig = {
  49. "table": parameters.get("TABLE"),
  50. "schema": parameters.get("SCHEMA")
  51. }
  52. # 删除datastore
  53. geoserver.delete_featurestore(featurestore_name=DataSourceConfig["table"],
  54. workspace=GeoServerConfig["workspace"])
  55. geoserver.create_featurestore(store_name=DataSourceConfig["table"],
  56. workspace=GeoServerConfig["workspace"], db=commands[2],
  57. host=commands[0],
  58. pg_user=commands[3], pg_password=commands[4],
  59. schema=DataSourceConfig["schema"])
  60. geoserver.publish_featurestore(workspace=GeoServerConfig["workspace"],
  61. store_name=DataSourceConfig["table"], pg_table=DataSourceConfig["table"])
  62. # 判断是否切片
  63. if parameters.get("GeoServer_Caching") == True:
  64. geoserver.caching_layer(layer_name=(GeoServerConfig["workspace"] + ":" + DataSourceConfig["table"]),
  65. zoom_start=GeoServerConfig["caching_start"],
  66. zoom_stop=GeoServerConfig["caching_stop"], auto_seed=True)
  67. elif parameters.get("INPUTFILE") != NULL and parameters.get("INPUTFILE") != "": # QGS工程文件
  68. print("========QGS工程文件=========")
  69. qgsfile = parameters.get("INPUTFILE")
  70. qgsProjectUtils = QgsProjectUtils(qgsfile)
  71. print("==============QGS工程文件读取完成=========")
  72. layers = qgsProjectUtils.getLayersSourceAndSld()
  73. print("==============QGS工程文件信息读取完成=========")
  74. for layername in layers:
  75. print(layername)
  76. all_vector_layers.append(layername)
  77. layer = layers[layername]
  78. if len(layers) == 1:
  79. geoserver_layer_name = layername
  80. # 当前图层名称配置
  81. # cur_layer_name = server_name
  82. # if len(layers) > 1:
  83. # cur_layer_name = layername
  84. # 删除style
  85. # geoserver.delete_style(style_name=cur_layer_name, workspace=GeoServerConfig["workspace"])
  86. # style样式
  87. style_uid = layername + getUUID()
  88. # 上传sld样式
  89. geoserver.upload_style(path=layer["sld"], workspace=GeoServerConfig["workspace"], name=style_uid)
  90. if layer["sourcetype"] == "db":
  91. service_sjy.append(f'{layer["schema"]}.{layer["table"]}')
  92. print(layer)
  93. # 删除datastore
  94. geoserver.delete_featurestore(featurestore_name=layer["table"],
  95. workspace=GeoServerConfig["workspace"])
  96. geoserver.create_featurestore(store_name=layer["table"],
  97. workspace=GeoServerConfig["workspace"], db=layer["dbname"],
  98. host=layer["host"],
  99. pg_user=layer["user"], pg_password=layer["password"],
  100. schema=layer["schema"])
  101. geoserver.publish_featurestore(workspace=GeoServerConfig["workspace"],
  102. store_name=layer["table"],
  103. pg_table=layer["table"])
  104. geoserver.publish_style(layer_name=layer["table"], style_name=style_uid,
  105. workspace=GeoServerConfig["workspace"])
  106. elif layer["sourcetype"] == "file":
  107. geoserver.delete_featurestore(featurestore_name=layername,
  108. workspace=GeoServerConfig["workspace"])
  109. geoserver.create_datastore(path=layer["path"], name=layername,
  110. workspace=GeoServerConfig["workspace"])
  111. geoserver.publish_featurestore(workspace=GeoServerConfig["workspace"], store_name=layername,
  112. pg_table=layername)
  113. geoserver.publish_style(layer_name=layername, style_name=style_uid,
  114. workspace=GeoServerConfig["workspace"])
  115. # 判断是否切片
  116. if parameters.get("GeoServer_Caching") == True and len(layers) == 1:
  117. geoserver.caching_layer(
  118. layer_name=(GeoServerConfig["workspace"] + ":" + layername),
  119. zoom_start=GeoServerConfig["caching_start"],
  120. zoom_stop=GeoServerConfig["caching_stop"], auto_seed=True)
  121. # 图层组新增 QGS模板图层大于1则发布图层组
  122. if len(layers) > 1:
  123. print("======创建图层组======")
  124. servername = qgsProjectUtils.getQgsBaseName()
  125. geoserver_layer_name = servername
  126. layernames = []
  127. for layername in layers:
  128. layernames.append(layername)
  129. # 图层组顺组为倒序
  130. layerarr = layernames[::-1]
  131. geoserver.delete_layergroup(
  132. layergroup_name=servername,
  133. workspace=GeoServerConfig["workspace"],
  134. )
  135. geoserver.create_layergroup(
  136. name=servername,
  137. mode="single",
  138. title=servername,
  139. abstract_text=servername,
  140. layers=layerarr,
  141. workspace=GeoServerConfig["workspace"],
  142. keywords=["list", "of", "keywords"]
  143. )
  144. # 判断是否切片
  145. if parameters.get("GeoServer_Caching") == True:
  146. geoserver.caching_layer(
  147. layer_name=(GeoServerConfig["workspace"] + ":" + servername),
  148. zoom_start=GeoServerConfig["caching_start"],
  149. zoom_stop=GeoServerConfig["caching_stop"], auto_seed=True)
  150. elif parameters.get("INPUTRASTER") != NULL and parameters.get("INPUTRASTER") != "": # 栅格数据
  151. all_vector_layers.append(server_name)
  152. raster = raster_file
  153. # 删除datastore
  154. geoserver.delete_featurestore(featurestore_name=server_name,
  155. workspace=GeoServerConfig["workspace"])
  156. geoserver.create_coveragestore(layer_name=server_name, path=raster, workspace=GeoServerConfig["workspace"])
  157. geoserver.publish_style(layer_name=server_name, style_name='raster', workspace=GeoServerConfig["workspace"])
  158. # 判断是否切片
  159. if parameters.get("GeoServer_Caching") == True:
  160. geoserver.caching_layer(layer_name=(GeoServerConfig["workspace"] + ":" + server_name),
  161. zoom_start=GeoServerConfig["caching_start"],
  162. zoom_stop=GeoServerConfig["caching_stop"], auto_seed=True)
  163. # 创建或加入图层组
  164. layer_group_add_name = parameters.get("LAYER_GROUP_ADD")
  165. layergroupname = ''
  166. if layer_group_add_name is not None and layer_group_add_name != "":
  167. layergroupname = layer_group_add_name
  168. geoserver_layer_name = layer_group_add_name
  169. geoserver.delete_layergroup(
  170. layergroup_name=layer_group_add_name,
  171. workspace=GeoServerConfig["workspace"],
  172. )
  173. geoserver.create_layergroup(
  174. name=layer_group_add_name,
  175. mode="single",
  176. title=layer_group_add_name,
  177. abstract_text=layer_group_add_name,
  178. layers=all_vector_layers,
  179. workspace=GeoServerConfig["workspace"],
  180. keywords=["list", "of", "keywords"]
  181. )
  182. # 判断是否切片
  183. if parameters.get("GeoServer_Caching") == True:
  184. geoserver.caching_layer(
  185. layer_name=(GeoServerConfig["workspace"] + ":" + layer_group_add_name),
  186. zoom_start=GeoServerConfig["caching_start"],
  187. zoom_stop=GeoServerConfig["caching_stop"], auto_seed=True)
  188. elif layer_group_join is not None and layer_group_join != "":
  189. geoserver_layer_name = layer_group_join
  190. layergroupname = layer_group_join
  191. for layer in all_vector_layers:
  192. geoserver.add_layer_to_layergroup(
  193. layergroup_name=layer_group_join,
  194. layergroup_workspace=GeoServerConfig["workspace"],
  195. layer_name=layer,
  196. layer_workspace=GeoServerConfig["workspace"]
  197. )
  198. # 判断是否切片
  199. if parameters.get("GeoServer_Caching") == True:
  200. geoserver.caching_layer(
  201. layer_name=(GeoServerConfig["workspace"] + ":" + layer_group_add_name),
  202. zoom_start=GeoServerConfig["caching_start"],
  203. zoom_stop=GeoServerConfig["caching_stop"], auto_seed=True)
  204. result = {
  205. "Publish_Status": "Success"
  206. }
  207. # 数据服务发布信息插入
  208. pgconn = PostgreSQL(schema='base')
  209. pgconn.insertVectorServer(id=getUUID(), fwqlx=GeoServerConfig["servertype"], sjy=','.join(service_sjy),
  210. fwlx=GeoServerConfig["servicetype"], fwdz=GeoServerConfig["serviceurl"],
  211. fwmc=server_name, layername=geoserver_layer_name,
  212. fwgzkj=GeoServerConfig["workspace"], fwys=GeoServerConfig["style"],
  213. qpfa=GeoServerConfig["cachescheme"], zymlbsm=zymlbsm, layergroup=layergroupname,
  214. zoommin=GeoServerConfig["caching_start"], zoommax=GeoServerConfig["caching_stop"])
  215. # 是否将创建的图层组也插入一条新的记录
  216. if layer_group_add_name is not None and layer_group_add_name != "":
  217. pgconn.insertVectorServer(id=getUUID(), fwqlx=GeoServerConfig["servertype"], sjy=','.join(service_sjy),
  218. fwlx=GeoServerConfig["servicetype"], fwdz=GeoServerConfig["serviceurl"],
  219. fwmc=layergroupname, layername=geoserver_layer_name,
  220. fwgzkj=GeoServerConfig["workspace"], fwys=GeoServerConfig["style"],
  221. qpfa=GeoServerConfig["cachescheme"], zymlbsm=zymlbsm, layergroup=layergroupname,
  222. zoommin=GeoServerConfig["caching_start"], zoommax=GeoServerConfig["caching_stop"])
  223. if layer_group_join is None or layer_group_join == "":
  224. pgconn.insertPortalZymlServer(id=getUUID(), fwqlx=GeoServerConfig["servertype"], sjy=','.join(service_sjy),
  225. fwlx=GeoServerConfig["servicetype"], fwdz=GeoServerConfig["serviceurl"],
  226. fwmc=server_name, layername=geoserver_layer_name,
  227. fwgzkj=GeoServerConfig["workspace"], fwys=GeoServerConfig["style"],
  228. qpfa=GeoServerConfig["cachescheme"], zymlbsm=zymlbsm,
  229. layergroup=layergroupname,
  230. zoommin=GeoServerConfig["caching_start"],
  231. zoommax=GeoServerConfig["caching_stop"])
  232. pgconn.close()
  233. return result