1基于QGIS导入

1.1单个导入

1工具箱中打开Export to PostgresSQL

2打开窗口,输入相关参数

①要导出的图层:浏览图层进行选择,打开GDB或其他可识别的空间数据,选中后双击完成选择,确定待导出的图层

②选择数据库连接:下拉选择已连接配置的postgis数据库

③选择架构名:架构名一般默认是public,对应数据库中的模式public

④要导出的表名:即是postgis中的表名,此处需填写,一般填写与输入图层名一致。

⑤主键字段:可从图层中选择一个主键字段,由于gdb中要素类的主键字段为OBJECTID,这里沿用该字段。默认不填会在数据入库时会新增一个id字段做为主键,可能会对与业务相关空间表产生矛盾

⑥几何图形列:postgis默认使用geom做为几何列名,选择默认即可

⑦编码:为了更好的支持汉字字段或属性信息,默认使用UTF-8编码规则,选择默认即可

⑧盖写、创建空间索引、将字段名转换为小写默认勾选项。盖写,即对已有数据库中图层可以进行覆盖;空间表需创建空间索引;字段名统一使用小写

盖写不勾选,相同名称的图层导入会报错

⑨运行:点击运行进行图层的导入。

注:使用QGIS直接导入,经常发现会报几何图形无效的问题。相同数据在arcgis中导入空间库是可行的。发现,为了防止要素无故被修复或者大量数据均需单独修复后再入库引起繁琐工作,根据其意见设置全局数据处理“无效要素过滤”选项为【不过滤】

1.2批量导入【工具】

1将单个的图层逐个添加到批量界面中,设置好相应的参数。

2保存设置好的参数文件,进行修改,再重新导入。

3点击运行,进行导入

1.3批量导入【python脚本】

QGIS中的python控制台,可以执行批量导入。导入用到的主要命令是基于GDAL库的ogr2ogr

1)代码

import os

# 设置GDB文件路径和数据库连接信息

gdb_path = 'G:\DATAALL\开源GIS组件化\std_sde.gdb'

db_name = 'std_sde'

db_user = 'postgres'

db_password = 'Telit@2022'

db_host = '192.168.1.12'

db_port = '5432'  # PostGIS 通常使用的端口号

 

# 获取GDB中所有图层的名称

def get_layer_names(gdb_path):

    layers = []

    with os.popen(f'ogrinfo -so {gdb_path}') as output:

        for line in output:

            if 'Layer' in line:

                layers.append(line.split(':')[1].strip().split('(')[0].strip())

                print(line)

    return layers

 

# 批量导入图层到PostGIS

def import_layers_to_postgis(gdb_path, db_name, db_user, db_password, db_host, db_port):

    for layer in get_layer_names(gdb_path):

        command = f'ogr2ogr -f "PostgreSQL" PG:"host={db_host} port={db_port} user={db_user} password={db_password} dbname={db_name}" {gdb_path} -nln {layer} -overwrite {layer} -progress --config PG_USE_COPY YES'

        print(f'Importing layer {layer}...')

        os.system(command)

 

# 运行函数

import_layers_to_postgis(gdb_path, db_name, db_user, db_password, db_host, db_port)

2)运行

QGIS具备相应的GDAL环境,其相关的操作命令可以顺利执行。只需更改相关的待导出的GDB,待导入的postgis基础信息配置完成即可使用。注意是整个gdb内所有的图层全部执行导入,若仅需要对应图层导入,可提取数据到另外的gdb或修改脚本代码。

 

2QGIS环境的批量导入

不使用QGIS,也能完成数据的批量导入。计算机上需有python环境,且需安装GDAL库。

2.1环境配置

1Python3

在电脑上安装Python3版本。本机选用的是Python 3.7.7

2)下载GDAL

https://www.lfd.uci.edu/~gohlke/pythonlibs/#gdal

使用上述地址,根据自己的python版本下载相应的GDALwhl文件

3)安装GDAL

打开python的安装目录,将上面下载的whl文件拷贝到该位置下的scripts文件夹内,打开scripts文件夹,cmd进入当前路径,pip install +GDAL.whl,执行即可完成GDAL库的安装。

4)设置path环境变量

path中新增一个初始位置:[python安装路径]\Python37\Lib\site-packages\osgeo

2.2运行脚本

1)代码

QGIS中使用的略有不同,主要是调用command的途径有所区别。

 

# import os

import subprocess

 

# 设置GDB文件路径和数据库连接信息

gdb_path = 'G:\DATAALL\开源GIS组件化\sdt_sde.gdb'

db_name = 'std_sde_hg'

db_user = 'highgo'

db_password = 'Telit@2022'

db_host = '192.168.1.12'

db_port = '5866'  # PostGIS 通常使用的端口号

 

# try:

#     from osgeo import gdal

#     print(gdal.__version__)

# except ImportError:

#     print("GDAL is not available.")

 

# 获取GDB中所有图层的名称

def get_layer_names(gdb_path):

    layers = []

    cmd = ['ogrinfo', '-so', gdb_path]

    # 使用subprocess.run来执行命令 获取gdb内的图层信息

    output = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True,errors='ignore')

    # output.stdout.splitlines() 读取结果,将结果按行分割成字符串列表

 

    for line in output.stdout.splitlines():

        #逐行读取,当行内含有'Layer'字符时,进行信息提取

        if 'Layer' in line:

            layers.append(line.split(':')[1].strip().split('(')[0].strip())

            print(line)

    return layers

 

# 批量导入图层到PostGIS

def import_layers_to_postgis(gdb_path, pg_conn_str):

    for layer in get_layer_names(gdb_path):

        command = f'ogr2ogr -f "PostgreSQL" PG:"{pg_conn_str}" {gdb_path} -nln {layer} -overwrite {layer} -progress -lco GEOMETRY_NAME=geom --config PG_USE_COPY YES'

        print(command)        

        print(f'Importing layer {layer}...')

        importdb = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, errors='ignore')

        # os.system(command) #os执行也成功

 

# 运行函数

#拼接一个连接地址

pg_conn_str="host="+db_host+" port="+db_port+" user="+db_user+" password="+db_password+" dbname="+db_name

import_layers_to_postgis(gdb_path, pg_conn_str)

2)执行

这里使用VSCode协助运行。