ImportGDB.py 2.6 KB

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