ImportGDB.py 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import os
  2. import subprocess
  3. import psycopg2
  4. import siwei_config
  5. from osgeo import ogr
  6. from qgis.core import *
  7. from PyQt5.QtWidgets import QFileDialog
  8. # 初始化 QGIS 环境(如果在独立 Python 环境中)
  9. # QgsApplication.setPrefixPath("D:\\Program Files\\QGIS 3.34.9", True)
  10. # qgs = QgsApplication([], False)
  11. # qgs.initQgis()
  12. gdb_folder = "D:\\gisdata\\三亚\\海域数据和三区三线数据\\三亚三线数据.gdb"
  13. # 打开 GDB 文件夹(通过 ogr 驱动)
  14. driver = ogr.GetDriverByName('OpenFileGDB')
  15. if not driver:
  16. print("OpenFileGDB 驱动不可用")
  17. # 打开 GDB 文件夹
  18. gdb = driver.Open(gdb_folder, 0) # 0 表示只读模式
  19. if not gdb:
  20. print(f"无法打开 {gdb_folder} 文件夹")
  21. def getLayerGeometryType(geom_type):
  22. geom_type_str = ""
  23. if geom_type == ogr.wkbPoint:
  24. geom_type_str = "Point"
  25. elif geom_type == ogr.wkbLineString:
  26. geom_type_str = "LineString"
  27. elif geom_type == ogr.wkbPolygon:
  28. geom_type_str = "Polygon"
  29. elif geom_type == ogr.wkbMultiPoint:
  30. geom_type_str = "MultiPoint"
  31. elif geom_type == ogr.wkbMultiLineString:
  32. geom_type_str = "MultiLineString"
  33. elif geom_type == ogr.wkbMultiPolygon:
  34. geom_type_str = "MultiPolygon"
  35. elif geom_type == ogr.wkbGeometryCollection:
  36. geom_type_str = "GeometryCollection"
  37. else:
  38. geom_type_str = None
  39. return geom_type_str
  40. layer_count = gdb.GetLayerCount()
  41. if layer_count > 0:
  42. # 全局参数修改
  43. db_config = siwei_config.CONFIG['db']
  44. # 数据库连接参数
  45. db_params = {
  46. 'host': db_config['host'],
  47. 'port': db_config['port'],
  48. 'dbname': db_config['name'],
  49. 'user': db_config['user'],
  50. 'password': db_config['password'],
  51. 'schema': db_config['schema']
  52. }
  53. # 将每个图层导入到 PostGIS
  54. pg_conn_string = f'PG:"host={db_params["host"]} port={db_params["port"]} dbname={db_params["dbname"]} user={db_params["user"]} password={db_params["password"]} active_schema={db_params["schema"]}"'
  55. for i in range(layer_count):
  56. layer = gdb.GetLayerByIndex(i)
  57. # 获取图层的几何类型
  58. geom_type = getLayerGeometryType(layer.GetGeomType())
  59. print(geom_type)
  60. layer_name = layer.GetName()
  61. print(f"图层 {i}: {layer.GetName()}")
  62. command = f'"D:\\Program Files\\QGIS 3.34.9\\bin\\ogr2ogr.exe" -f "PostgreSQL" {pg_conn_string} "{gdb_folder}" {layer_name} -overwrite -nln {layer_name}'
  63. if geom_type:
  64. command = f'{command} -nlt {geom_type}'
  65. print(command)
  66. subprocess.run(command, check=True)
  67. print(f"图层 {layer_name} 导入成功")
  68. else:
  69. print(f"{gdb_folder} 文件夹不包含任何图层")
  70. # 退出 QGIS 环境
  71. # qgs.exitQgis()