12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- import os
- import subprocess
- import psycopg2
- import siwei_config
- from osgeo import ogr
- from qgis.core import *
- from PyQt5.QtWidgets import QFileDialog
- # 初始化 QGIS 环境(如果在独立 Python 环境中)
- # QgsApplication.setPrefixPath("D:\\Program Files\\QGIS 3.34.9", True)
- # qgs = QgsApplication([], False)
- # qgs.initQgis()
- gdb_folder = "D:\\gisdata\\三亚\\海域数据和三区三线数据\\三亚三线数据.gdb"
- # 打开 GDB 文件夹(通过 ogr 驱动)
- driver = ogr.GetDriverByName('OpenFileGDB')
- if not driver:
- print("OpenFileGDB 驱动不可用")
- # 打开 GDB 文件夹
- gdb = driver.Open(gdb_folder, 0) # 0 表示只读模式
- if not gdb:
- print(f"无法打开 {gdb_folder} 文件夹")
- def getLayerGeometryType(geom_type):
- geom_type_str = ""
- if geom_type == ogr.wkbPoint:
- geom_type_str = "Point"
- elif geom_type == ogr.wkbLineString:
- geom_type_str = "LineString"
- elif geom_type == ogr.wkbPolygon:
- geom_type_str = "Polygon"
- elif geom_type == ogr.wkbMultiPoint:
- geom_type_str = "MultiPoint"
- elif geom_type == ogr.wkbMultiLineString:
- geom_type_str = "MultiLineString"
- elif geom_type == ogr.wkbMultiPolygon:
- geom_type_str = "MultiPolygon"
- elif geom_type == ogr.wkbGeometryCollection:
- geom_type_str = "GeometryCollection"
- else:
- geom_type_str = None
- return geom_type_str
- layer_count = gdb.GetLayerCount()
- if layer_count > 0:
- # 全局参数修改
- db_config = siwei_config.CONFIG['db']
- # 数据库连接参数
- db_params = {
- 'host': db_config['host'],
- 'port': db_config['port'],
- 'dbname': db_config['name'],
- 'user': db_config['user'],
- 'password': db_config['password'],
- 'schema': db_config['schema']
- }
- # 将每个图层导入到 PostGIS
- 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"]}"'
- for i in range(layer_count):
- layer = gdb.GetLayerByIndex(i)
- # 获取图层的几何类型
- geom_type = getLayerGeometryType(layer.GetGeomType())
- print(geom_type)
- layer_name = layer.GetName()
- print(f"图层 {i}: {layer.GetName()}")
- 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}'
- if geom_type:
- command = f'{command} -nlt {geom_type}'
- print(command)
- subprocess.run(command, check=True)
- print(f"图层 {layer_name} 导入成功")
- else:
- print(f"{gdb_folder} 文件夹不包含任何图层")
- # 退出 QGIS 环境
- # qgs.exitQgis()
|