ImportOSGBToPostGIS.py 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. __author__ = 'liying'
  2. __date__ = 'May 2025'
  3. __copyright__ = '(C) 2025, liying'
  4. import uuid
  5. from qgis.core import (
  6. QgsProcessingAlgorithm,
  7. QgsProcessingParameterFile,
  8. QgsProcessingParameterProviderConnection,
  9. QgsProcessingParameterDatabaseSchema,
  10. QgsProcessingParameterString,
  11. QgsProcessingParameterEnum,
  12. QgsProcessingParameterDateTime,
  13. QgsProcessingParameterBoolean,
  14. QgsProcessingParameterCrs,
  15. )
  16. from qgis.PyQt.QtCore import QCoreApplication
  17. import os
  18. import psycopg2
  19. from psycopg2 import sql
  20. from datetime import datetime
  21. from processing.tools.PostgreSQL.PostgreSQL import PostgreSQL
  22. class ImportOSGBToPostGIS(QgsProcessingAlgorithm):
  23. DATABASE = 'DATABASE'
  24. SCHEMA = 'SCHEMA'
  25. TABLE = 'TABLE'
  26. INPUT_DIR = 'INPUT_DIR'
  27. VECTOR_SJLY = 'VECTOR_SJLY'
  28. VECTOR_YEAR = 'VECTOR_YEAR'
  29. VECTOR_YWLX = 'VECTOR_YWLX'
  30. VECTOR_GLBM = 'VECTOR_GLBM'
  31. VECTOR_ZYML = 'VECTOR_ZYML'
  32. T_SRS = 'T_SRS'
  33. RASTER_T = 'RASTER_T'
  34. SOURCE_TYPE = 'SOURCE_TYPE'
  35. Metadata_storage = 'Metadata_storage'
  36. INDEX = 'INDEX'
  37. RASTER_T_LIST = ['不分块', '128', '256', '512']
  38. @staticmethod
  39. def tr(string):
  40. return QCoreApplication.translate('ImportOSGBToPostGIS', string)
  41. def initAlgorithm(self, config=None):
  42. self.addParameter(QgsProcessingParameterProviderConnection(
  43. self.DATABASE,
  44. self.tr('数据库连接'),
  45. 'postgres',
  46. defaultValue='192.168.60.2'
  47. ))
  48. self.addParameter(QgsProcessingParameterDatabaseSchema(
  49. self.SCHEMA,
  50. self.tr('模式'),
  51. connectionParameterName=self.DATABASE,
  52. defaultValue='base'
  53. ))
  54. self.addParameter(QgsProcessingParameterString(
  55. self.TABLE,
  56. self.tr('表名'),
  57. defaultValue='t_vector_storage'
  58. ))
  59. self.addParameter(QgsProcessingParameterFile(
  60. self.INPUT_DIR,
  61. self.tr('OSGB 数据目录'),
  62. behavior=QgsProcessingParameterFile.Folder,
  63. optional=False
  64. ))
  65. self.addParameter(QgsProcessingParameterString(
  66. self.VECTOR_SJLY,
  67. self.tr('数据来源'),
  68. optional=False
  69. ))
  70. self.addParameter(QgsProcessingParameterDateTime(
  71. self.VECTOR_YEAR,
  72. self.tr('数据时效'),
  73. type=QgsProcessingParameterDateTime.Type.Date,
  74. optional=False
  75. ))
  76. pgconn = PostgreSQL(schema='base')
  77. rows = pgconn.getVectorYwlx()
  78. self.ywlxs = [row[0] for row in rows]
  79. self.addParameter(QgsProcessingParameterEnum(self.VECTOR_YWLX,
  80. self.tr('业务类型'),
  81. options=self.ywlxs,
  82. optional=False))
  83. rows = pgconn.getDeptList()
  84. self.depts = [row[0] for row in rows]
  85. self.addParameter(QgsProcessingParameterEnum(self.VECTOR_GLBM,
  86. self.tr('管理部门'),
  87. options=self.depts))
  88. rows = pgconn.getVectorZyml()
  89. self.zymls = [row[1] for row in rows]
  90. self.addParameter(QgsProcessingParameterEnum(self.VECTOR_ZYML,
  91. self.tr('资源目录'),
  92. options=self.zymls))
  93. self.addParameter(QgsProcessingParameterCrs(
  94. self.T_SRS,
  95. self.tr('指定入库坐标系'),
  96. defaultValue='EPSG:4326',
  97. optional=False
  98. ))
  99. self.addParameter(QgsProcessingParameterEnum(
  100. self.RASTER_T,
  101. self.tr('分块存储大小'),
  102. options=self.RASTER_T_LIST,
  103. defaultValue=0,
  104. optional=False
  105. ))
  106. self.addParameter(QgsProcessingParameterString(
  107. self.SOURCE_TYPE,
  108. self.tr('数据源类型'),
  109. defaultValue='osgb',
  110. optional=False
  111. ))
  112. self.addParameter(QgsProcessingParameterBoolean(
  113. self.Metadata_storage,
  114. self.tr('元数据入库'),
  115. defaultValue=True
  116. ))
  117. self.addParameter(QgsProcessingParameterBoolean(
  118. self.INDEX,
  119. self.tr('创建空间索引'),
  120. defaultValue=True
  121. ))
  122. def processAlgorithm(self, parameters, context, feedback):
  123. connection_name = self.parameterAsString(parameters, self.DATABASE, context)
  124. schema = self.parameterAsString(parameters, self.SCHEMA, context)
  125. table = self.parameterAsString(parameters, self.TABLE, context)
  126. input_dir = self.parameterAsString(parameters, self.INPUT_DIR, context)
  127. data_source = self.parameterAsString(parameters, self.VECTOR_SJLY, context)
  128. # 转换 QDateTime 为 Python date
  129. qdatetime = self.parameterAsDateTime(parameters, self.VECTOR_YEAR, context)
  130. data_year = qdatetime.date().toPyDate().year # 只保留年份(整数)
  131. business_type_index = self.parameterAsInt(parameters, self.VECTOR_YWLX, context)
  132. management_dept_index = self.parameterAsInt(parameters, self.VECTOR_GLBM, context)
  133. resource_catalog_index = self.parameterAsInt(parameters, self.VECTOR_ZYML, context)
  134. t_srs = self.parameterAsCrs(parameters, self.T_SRS, context)
  135. raster_t_index = self.parameterAsInt(parameters, self.RASTER_T, context)
  136. source_type = self.parameterAsString(parameters, self.SOURCE_TYPE, context)
  137. metadata_storage = self.parameterAsBoolean(parameters, self.Metadata_storage, context)
  138. create_index = self.parameterAsBoolean(parameters, self.INDEX, context)
  139. pgconn = PostgreSQL(schema='base')
  140. business_type = pgconn.getVectorYwlx()[business_type_index][0]
  141. management_dept = pgconn.getDeptList()[management_dept_index][0]
  142. resource_catalog_name = pgconn.getVectorZyml()[resource_catalog_index][1]
  143. # 查资源目录 bsm
  144. query = f"SELECT bsm FROM t_vector_zyml WHERE name = '{resource_catalog_name}'"
  145. result = pgconn.execute(query)
  146. if result and len(result) > 0:
  147. resource_catalog = result[0][0]
  148. else:
  149. feedback.reportError(f"未找到名称为 {resource_catalog_name} 的资源目录 BSM 值。")
  150. raise Exception(f"资源目录未找到:{resource_catalog_name}")
  151. # 连接数据库
  152. conn_params = {
  153. 'host': "192.168.60.2",
  154. 'port': "5432",
  155. 'dbname': "real3d",
  156. 'user': "postgres",
  157. 'password': "postgis"
  158. }
  159. feedback.pushInfo("连接数据库...")
  160. conn = psycopg2.connect(**conn_params)
  161. cursor = conn.cursor()
  162. feedback.pushInfo("插入数据目录元数据...")
  163. id = str(uuid.uuid4())
  164. nm = os.path.basename(input_dir)
  165. insert_sql = sql.SQL("""
  166. INSERT INTO {schema}.{table}
  167. (sjywz, rksj, year, ywlx, glbm, id, sjlx, xmlx, name, sjly)
  168. VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
  169. """).format(
  170. schema=sql.Identifier(schema),
  171. table=sql.Identifier(table)
  172. )
  173. cursor.execute(insert_sql, (
  174. input_dir,
  175. datetime.now().date(),
  176. data_year,
  177. business_type,
  178. management_dept,
  179. id,
  180. source_type,
  181. resource_catalog,
  182. nm,
  183. data_source
  184. ))
  185. conn.commit()
  186. cursor.close()
  187. conn.close()
  188. feedback.pushInfo("数据目录元数据已成功插入。")
  189. return {}
  190. def name(self):
  191. return "importosgbtopostgis"
  192. def displayName(self):
  193. return "三维数据入库"
  194. def group(self):
  195. return "三维数据工具"
  196. def groupId(self):
  197. return "osgbtools"
  198. def shortHelpString(self):
  199. return "扫描 OSGB 文件目录,将路径、包围盒等元数据信息写入 PostGIS 数据库。"
  200. def createInstance(self):
  201. return ImportOSGBToPostGIS()