mdb转gdb实现过程介绍(1)mdb地理数据库结构解析和gdb库的创建

news2024/11/16 11:37:24

内容提示:


mdb数据转出为gdb,应保留原mdb的库体结构。库体结构中,应该正确处理数据集、要素类和表之间的结构。

        数据集:保持数据集结构;

        要素类:要素类位于mdb根目录或数据集下;

        表:表位于mdb根目录。

要实现mdb转gdb后,数据库库体结构保持一致,不是一件容易的事,本文完整记录了解析mdb库体结构的过程。

图很多,内容可能有一些难度,感兴趣的朋友,可以动手做一做。


图片

  • mdb(个人地理数据库)转shape file其实并不简单

1、 pyodbc 解析mdb库体结构

        将mdb转为gdb,第一步就是先解析mdb库体结构,得到mdb下数据集、要素类、表之间的组织结构,以及创建数据集、要素类和表所需要的信息,如空间参考、名称、字段属性信息等。

        获取的mdb地理数据库,可能存在多个数据集,数据集下可能存在要素类,也可能为空,并且有些要素类和表位于mdb根目录。

        mdb地理数据示意如下:

图片

1.1 使用odb解析mdb库体结构

        01 使用odbc读取mdb

# 定义连接字符串和MDB文件路径driver = '{Microsoft Access Driver (*.mdb, *.accdb)}'mdb_file = r"D:\data\tess.mdb"conn_str = f'Driver={driver};DBQ={mdb_file}'# 执行连接conn = pyodbc.connect(conn_str)

(1)很可能会报错:

        ERROR 1: Unable to initialize ODBC connection to DSN

(2)需要安装:

图片

        直接双击安装,可能会报如下错误:

图片

        在命令行窗口,找到AccessDatabaseEngine_X64.exe所在目录,执行如下命令即可:

AccessDatabaseEngine_X64.exe /quiet

(3)列出mdb中的所有表:

import pyodbc# 定义MDB文件路径和ODBC驱动mdb_file = r"D:\data\tess.mdb"driver = '{Microsoft Access Driver (*.mdb, *.accdb)}'# 连接到数据库conn = pyodbc.connect(f'Driver={driver};DBQ={mdb_file}')cursor = conn.cursor()# 获取所有表名tables = cursor.tables(tableType='TABLE')# 输出所有表名for table in tables:    print(table.table_name)# 关闭连接cursor.close()conn.close()

        输出中,对比mdb示意中的数据,能快速发现一堆不认识的表名,如下图绿色边框所示,可能和存放了mdb中一些特别的信息。

图片

(4)获取数据库中的系统表格信息

        实际上,这些以“MDB”开头的表,事mdb的系统表。存放着地理信息数据相关的信息。我们需要打开这些表,进一步分析。

        获取系统表信息的代码如下:

import pandas as pdimport pyodbcmdb_file = r"D:\data\tess.mdb"driver = '{Microsoft Access Driver (*.mdb, *.accdb)}'conn = pyodbc.connect(f'Driver={driver};DBQ={mdb_file}')cursor = conn.cursor()# 获取数据库中的系统表格信息system_tables = [    "GDB_ColumnInfo",        "GDB_DatabaseLocks",        "GDB_GeomColumns",        "GDB_ItemRelationships",        "GDB_ItemRelationshipTypes",        "GDB_Items",        "GDB_Items_Shape_Index",        "GDB_ItemTypes",        "GDB_ReplicaLog",        "GDB_SpatialRefs"]for table1 in system_tables:    # 获取每个表的列信息    cursor.execute(f"SELECT * FROM [{table1}]")    table1_columns = [column[0] for column in cursor.description]    # 获取查询结果    rows = cursor.fetchall()    if len(rows) == 0:        continue    table1_val = []    for row in rows:        # 将每个表的字段值分别存放在不同的列表中        table1_val.append([val for idx, val in enumerate(row) if idx < len(table1_columns)])    table2_df = pd.DataFrame(table1_val, columns=table1_columns)    print(f"表{table1}数据:")    print(table2_df)

        每个表格对应的字段信息如下:

        GDB_ColumnInfo(GDB列信息):这张表存储了地理数据库中每个表的列信息,包括表名、字段名以及列的标志位。

图片

        GDB_GeomColumns(GDB几何列):这张表包含了地理数据库中几何列的信息,包括表名、字段名、几何类型、空间范围以及其他几何相关的属性。

        GDB_ItemRelationships(GDB项关系):这张表记录了地理数据库中各项之间的关系,包括源项、目标项、关系类型以及一些属性。

图片

        GDB_ItemRelationshipTypes(GDB项关系类型):这张表存储了地理数据库中项之间关系的类型信息,包括关系类型的UUID、原始项类型ID、目标项类型ID以及前向和后向标签等。

        GDB_Items(GDB项):这张表包含了地理数据库中所有项的基本信息,包括项的UUID、类型、名称、物理名称、路径、数据集子类型等。

图片

        终于,出现了我们熟悉的内容:

图片

        GDB_Items_Shape_Index 的表存储了地理数据库中各项几何形状的索引信息

图片

        GDB_ItemTypes(GDB项类型):这张表定义了地理数据库中项的类型,包括项类型的UUID、父类型ID和名称等。

图片

   GDB_SpatialRefs表提供了地理数据库中使用的各种空间参考的详细信息,包括了坐标系的定义、偏移量、单位和容差等信息。

图片

(5)系统表之间的关联分析

        从步骤(4)中对各个表格信息的查看,似乎都看不懂这些信息是什么意思。只有表GDB_Items中出现了mdb中的图层名。

图片

        因此,找出表之间的关联,尤其是与表GDB_Items的关联,似乎就能找到答案。

system_tables = [
    "GDB_ColumnInfo",
    "GDB_DatabaseLocks",
    "GDB_GeomColumns",
    "GDB_ItemRelationships",
    "GDB_ItemRelationshipTypes",
    "GDB_Items",
    "GDB_Items_Shape_Index",
    "GDB_ItemTypes",
    "GDB_ReplicaLog",
    "GDB_SpatialRefs"
]

        系统表之间关联分析的代码实现如下:

import pyodbcimport pandas as pddef get_conn(mdb_file):    # 定义连接字符串和MDB文件路径    driver = '{Microsoft Access Driver (*.mdb, *.accdb)}'    conn_str = f'Driver={driver};DBQ={mdb_file}'    conn = pyodbc.connect(conn_str)    return conndef check_relations(conn):    # 执行连接    cursor = conn.cursor()    # 定义要合并的系统表    system_tables = [        "GDB_ColumnInfo",        "GDB_DatabaseLocks",        "GDB_GeomColumns",        "GDB_ItemRelationships",        "GDB_ItemRelationshipTypes",        "GDB_Items",        "GDB_Items_Shape_Index",        "GDB_ItemTypes",        "GDB_ReplicaLog",        "GDB_SpatialRefs"    ]    # 获取每个表的列信息    table_columns = {}    for table_name in system_tables:        cursor.execute(f"SELECT * FROM [{table_name}]")        columns = [column[0] for column in cursor.description]        table_columns[table_name] = columns    # 预先设置每个单元格的长度    cell_length = 30  # 调整为 26 来保持一致性    # 打印表之间的关系    print("Table Relations:")    split_line = "+" + "-" * ((len(system_tables) + 1) * cell_length) + "+"    print(split_line)    # 打印表头    row = " " * cell_length + "|"    for table_name in system_tables:        row += f" {table_name.center(cell_length)}|"    print(row)    # 打印分割线    print(split_line)    # 打印表之间的关系    table_relations = []    for idx, table_name1 in enumerate(system_tables):        row = f"| {table_name1.center(cell_length)} |"        for table_name2 in system_tables:            if table_name1 != table_name2:  # 排除同一个表之间的关系                common_columns = set(table_columns[table_name1]) & set(table_columns[table_name2])                if common_columns:                    table_relations.append([table_name1, table_name2])                    row += f"{' √ '.center(cell_length)}|"                else:                    row += f"{' - '.center(cell_length)}|"            else:                row += f"{' - '.center(cell_length)}|"        print(row)    # 打印分割线    print(split_line)    # # 关闭连接    cursor.close()    # 使用集合去除重复关系    unique_relations = {tuple(sorted(relation)) for relation in table_relations}    # 将集合转换回列表形式    table_relations = [list(relation) for relation in unique_relations]    return table_relationsif __name__ == '__main__':    mdb_file = r"D:\data\tess.mdb"    # 执行连接    conn = get_conn(mdb_file)    table_relations = check_relations(conn)

        表格有点长,可能需要放大才能看清楚。

        在对表之间的关联分析时,我们采取判断两个表是否存在相同的字段名,再将同名字段作为“键”进行连接分析。

        表之间,使用二维矩阵对其进行查看,表格值为“√”的,代表两个表格至少存在一个同名字段。表之间的关系如下:

图片

将存在同名字段的表关系提取如下:

        1:['GDB_ItemRelationships', 'GDB_Items']

        2:['GDB_ItemRelationshipTypes', 'GDB_ItemRelationships']

        3:['GDB_ItemRelationshipTypes', 'GDB_ItemTypes']

        4:['GDB_ColumnInfo', 'GDB_GeomColumns']

        5:['GDB_GeomColumns', 'GDB_SpatialRefs']

        6:['GDB_ItemTypes', 'GDB_Items']

        7:['GDB_ItemRelationships', 'GDB_ItemTypes']

        8:['GDB_ItemRelationshipTypes', 'GDB_Items']

(6)关联表分析

        步骤(5)中说明,需要重点关注表GDB_Items。因此从存在同名字段的关联表之间找出与GDB_Items相关的记录。

        此外,作为创建数据集、要素类时必须的参数“空间参考”,应该从表GDB_SpatialRefs中获取。

若需要了解表结构关系,需要重点关注:

        1: ['GDB_ItemRelationships','GDB_Items']

        2: ['GDB_ItemRelationshipTypes', 'GDB_Items']

        3: ['GDB_ItemTypes', 'GDB_Items']

若需要了解表属性,则需要重点关注:

        4: ['GDB_GeomColumns', 'GDB_SpatialRefs']

        基于同名字段分析两个表之间联系的代码如下:

def join_tables(conn, table1, table2):    cursor = conn.cursor()    # 获取每个表的列信息    cursor.execute(f"SELECT * FROM [{table1}]")    table1_columns = [column[0] for column in cursor.description]    cursor.execute(f"SELECT * FROM [{table2}]")    table2_columns = [column[0] for column in cursor.description]    # 获取公共列    common_columns = set(table1_columns) & set(table2_columns)    # 如果没有公共列,直接返回    if not common_columns:        print("没有公共列,无法执行连接查询。")        return    # 对每个公共列创建单独的查询    for col in common_columns:        # 构建查询语句        query = f"""        SELECT {table1}.*, {table2}.*        FROM [{table1}] INNER JOIN [{table2}]        ON {table1}.[{col}] = {table2}.[{col}]        """        # 执行查询        cursor.execute(query)        # 获取查询结果        rows = cursor.fetchall()        if len(rows) == 0:            continue        # 打印查询结果        print(f"查询结果(基于公共列 '{col}'):")        table1_val = []        table2_val = []        for row in rows:            # 将每个表的字段值分别存放在不同的列表中            table1_val.append([val for idx, val in enumerate(row) if idx < len(table1_columns)])            table2_val.append([val for idx, val in enumerate(row) if idx >= len(table1_columns)])        # 将列表转换为DataFrame        table1_df = pd.DataFrame(table1_val, columns=table1_columns)        table2_df = pd.DataFrame(table2_val, columns=table2_columns)        # 打印DataFrame        print(f"表{table1}数据:")        print(table1_df)        print(f"表{table2}数据:")        print(table2_df)    # 关闭连接    cursor.close()table_relations = [['GDB_ItemTypes', 'GDB_Items'],                   ['GDB_ItemRelationshipTypes', 'GDB_Items'],                   ['GDB_ItemRelationships', 'GDB_Items'],                   ['GDB_GeomColumns', 'GDB_SpatialRefs']]for i, j in enumerate(table_relations):    print(f"{i + 1}: {j}")    join_tables(conn, j[0], j[1])

        (1)['GDB_ItemRelationships','GDB_Items']

        通过分析,在表GDB_ItemRelationships与表GDB_Items的属性值之间,未找到明显的对应关系。

图片

        (2)['GDB_ItemRelationships','GDB_Items']

        通过表GDB_ItemRelationships和表GDB_Items的属性值关联分析,明显发现,要素类、数据集和表之间存在着关联属性值。

图片

# 查询要素类,可通过构建如下查询语句实现。

    feature_class_query = """

    SELECT A.NAME

    FROM GDB_ITEMS A, GDB_ItemRelationshipTypes B

 WHERE A.Type = B.DestItemTypeID AND B.NAME = 'FeatureClassInNetworkDataset'

    """

图片

# 查询数据集,可通过构建如下查询语句实现。

    feature_class_query = """

    SELECT A.NAME

    FROM GDB_ITEMS A, GDB_ItemRelationshipTypes B

 WHERE A.Type = B.OrigItemTypeID AND B.NAME = 'DatasetInFeatureDataset'

    """

图片

# 查询表,可通过构建如下查询语句实现。

   feature_class_query = """

    SELECT DISTINCT  A.NAME

    FROM GDB_ITEMS A, GDB_ItemRelationshipTypes B

    WHERE A.Type = B.DestItemTypeID AND (B.NAME = 'TableInNetworkDataset' OR B.NAME = 'TableInParcelFabric')

    """

        (3)['GDB_ItemTypes', 'GDB_Items']

        表GDB_ItemTypes和表GDB_Items的属性值关联分析,也明显发现,要素类、数据集和表之间存在着关联属性值。

图片

# 查询要素类,可通过构建如下查询语句实现。

    feature_class_query = """

    SELECT A.NAME

    FROM GDB_ITEMS A, GDB_ItemTypes B

    WHERE A.Type = B.UUID AND B.NAME = 'Feature Class'

    """

图片

 # 查询数据集,可通过构建如下查询语句实现。

    dataset_query = """

    SELECT A.NAME

    FROM GDB_ITEMS A, GDB_ItemTypes B

    WHERE A.Type = B.UUID AND B.NAME = 'Feature Dataset'

    """

图片

# 查询表,可通过构建如下查询语句实现。

    table_query = """

    SELECT A.NAME

    FROM GDB_ITEMS A, GDB_ItemTypes B

    WHERE A.Type = B.UUID AND B.NAME = 'Table'

    """

        (4)['GDB_GeomColumns', 'GDB_SpatialRefs']

        通过表GDB_GeomColumns与表GDB_SpatialRefs之间的属性值联系,能实现空间参考,要素类型的获取。

图片

# 查询空间参考信息、要素类型等,可通过构建如下查询语句实现。

    table_query = """

    SELECT B.SRTEXT,A.ShapeType

    FROM GDB_GeomColumns A, GDB_SpatialRefs B

    WHERE A.SRID = B.SRID

    """

综上:可使用表

['GDB_ItemRelationshipTypes', 'GDB_Items']

['GDB_ItemTypes', 'GDB_Items']之间的关系实现mdb地理数据库数据组织结构的解析。

使用['GDB_ItemRelationshipTypes', 'GDB_Items']之间的表结构关系,能确定mdb地理数据库下的数据结构和更加细粒度的类型描述。

使用['GDB_GeomColumns', 'GDB_SpatialRefs']获取要素的空间参考信息,要素类型等信息。

 

1.2 解析mdb中的库体结构

        (1)获取mdb中的数据集、要素类和表信息

        通过如下代码,可以将mdb中的数据集、要素类以及表都找出:

import pyodbcdef parse_mdb(mdb_file):    # 连接到 MDB 文件    driver = '{Microsoft Access Driver (*.mdb, *.accdb)}'    conn = pyodbc.connect(f'Driver={driver};DBQ={mdb_file}')    cursor = conn.cursor()    # 查询数据集    dataset_query = """    SELECT A.NAME    FROM GDB_ITEMS A, GDB_ItemRelationshipTypes B    WHERE A.Type = B.OrigItemTypeID AND B.NAME = 'DatasetInFeatureDataset'    """    # 或者    # dataset_query = """    #     SELECT A.NAME    #     FROM GDB_ITEMS A, GDB_ItemTypes B    #     WHERE A.Type = B.UUID AND B.NAME = 'Feature Dataset'    #     """    cursor.execute(dataset_query)    datasets = [row.NAME for row in cursor.fetchall()]    # 查询要素类    feature_class_query = """    SELECT A.NAME    FROM GDB_ITEMS A, GDB_ItemRelationshipTypes B    WHERE A.Type = B.DestItemTypeID AND B.NAME = 'FeatureClassInNetworkDataset'    """    # 或者    # feature_class_query = """    #     SELECT A.NAME    #     FROM GDB_ITEMS A, GDB_ItemTypes B    #     WHERE A.Type = B.UUID AND B.NAME = 'Feature Class'    #     """    cursor.execute(feature_class_query)    feature_classes = [row.NAME for row in cursor.fetchall()]    # 查询表格    table_query = """    SELECT DISTINCT A.NAME    FROM GDB_ITEMS A, GDB_ItemRelationshipTypes B    WHERE A.Type = B.DestItemTypeID AND (B.NAME = 'TableInNetworkDataset' OR B.NAME = 'TableInParcelFabric')    """    # 或者    # table_query = """    #     SELECT A.NAME    #     FROM GDB_ITEMS A, GDB_ItemTypes B    #     WHERE A.Type = B.UUID AND B.NAME = 'Table'    #     """    cursor.execute(table_query)    tables = [row.NAME for row in cursor.fetchall()]    # 关闭数据库连接    cursor.close()    conn.close()    return datasets, feature_classes, tablesif __name__ == '__main__':    # 使用示例    mdb_file_path = r"D:\data\tess.mdb"    datasets, feature_classes, tables = parse_mdb(mdb_file_path)    print("DataSets:", datasets)    print("Feature Classes:", feature_classes)    print("Tables:", tables)

        代码执行结果如下:

图片

        对比mdb的结构:

图片

        明显看出,所有的数据集、要素类和表名都已经获取到。

        (2)获取mdb库体结构

        通过对上一步获取的数据集、要素类和表进一步梳理,按mdb库体结构进行组织,代码如下:

def format_tables(datasets, feature_classes, tables):    from collections import defaultdict    dts = defaultdict(list)    fcs = [fc[0] for fc in feature_classes]    for dt in datasets:        dts.setdefault(dt[0], [])        dts[dt[0]].append([])        for fc in feature_classes:            if str(fc[1]).startswith(str(dt[1])):                dts[dt[0]].append(fc[0])                try:                    fcs.remove(fc[0])                except ValueError:                    pass    tbs = [tb[0] for tb in tables]    return {"Feature Dataset": dts}, {"Feature Class": fcs}, {"Table": tbs}def parse_mdb(mdb_file):    # 连接到 MDB 文件    driver = '{Microsoft Access Driver (*.mdb, *.accdb)}'    conn = pyodbc.connect(f'Driver={driver};DBQ={mdb_file}')    cursor = conn.cursor()    # 查询数据集    dataset_query = """    SELECT A.NAME, A.Path    FROM GDB_ITEMS A, GDB_ItemRelationshipTypes B    WHERE A.Type = B.OrigItemTypeID AND B.NAME = 'DatasetInFeatureDataset'    """    # 或者    # dataset_query = """    #     SELECT A.NAME, A.Path    #     FROM GDB_ITEMS A, GDB_ItemTypes B    #     WHERE A.Type = B.UUID AND B.NAME = 'Feature Dataset'    #     """    cursor.execute(dataset_query)    datasets = [row for row in cursor.fetchall()]    # 查询要素类    feature_class_query = """    SELECT A.NAME, A.Path    FROM GDB_ITEMS A, GDB_ItemRelationshipTypes B    WHERE A.Type = B.DestItemTypeID AND B.NAME = 'FeatureClassInNetworkDataset'    """    # 或者    # feature_class_query = """    #     SELECT A.NAME, A.Path    #     FROM GDB_ITEMS A, GDB_ItemTypes B    #     WHERE A.Type = B.UUID AND B.NAME = 'Feature Class'    #     """    cursor.execute(feature_class_query)    feature_classes = [row for row in cursor.fetchall()]    # 查询表格    table_query = """    SELECT DISTINCT A.NAME, A.Path    FROM GDB_ITEMS A, GDB_ItemRelationshipTypes B    WHERE A.Type = B.DestItemTypeID AND (B.NAME = 'TableInNetworkDataset' OR B.NAME = 'TableInParcelFabric')    """    # 或者    # table_query = """    #     SELECT A.NAME, A.Path    #     FROM GDB_ITEMS A, GDB_ItemTypes B    #     WHERE A.Type = B.UUID AND B.NAME = 'Table'    #     """    cursor.execute(table_query)    tables = [row for row in cursor.fetchall()]    # 关闭数据库连接    cursor.close()    conn.close()    datasets, feature_classes, tables = format_tables(datasets, feature_classes, tables)    # print(datasets, feature_classes, tables)    mdb_name = os.path.basename(mdb_file)    def print_tree(data, depth=0):        for key, value in data.items():            print('{}{}'.format(' ' * depth * 4, key))            if isinstance(value, dict):                print_tree(value, depth + 1)            else:                for item in value:                    if item:                        print('{}{} {}'.format(' ' * (depth + 1) * 4, '-' * 4, item))    # Print datasets    print(f'------{mdb_name}------')    for dt in datasets.values():        print_tree(dt, depth=1)    # Print feature classes    for fc_name, fc in feature_classes.items():        print_tree({fc_name: fc}, depth=0)    # Print tables    for tb_name, tb in tables.items():        print_tree({tb_name: tb}, depth=0)

        按层级结构,通过简单的打印,可能看出mdb的库体结构。代码执行结果如下:

图片

现在,只是通过表关系:

        ['GDB_ItemRelationshipTypes','GDB_Items']

        ['GDB_ItemTypes', 'GDB_Items']

        从GDB_Items中获取数据集、要素类和表的名称,要进一步获取数据集、要素类和表的其他属性,比如空间参考、要素类型、字段属性等,则需要对GDB_Items、GDB_GeomColumns以及GDB_SpatialRefs进一步剖析。

        表GDB_Items、GDB_GeomColumns以及GDB_SpatialRefs之间的字段信息通过如下代码进行输出分析:

mdb_file = r"D:\data\tess.mdb"driver = '{Microsoft Access Driver (*.mdb, *.accdb)}'conn = pyodbc.connect(f'Driver={driver};DBQ={mdb_file}')system_tables = [   "GDB_Items",    "GDB_GeomColumns",    "GDB_SpatialRefs"]data_structures = {}# 逐个系统表格提取数据结构信息for table_name in system_tables:    cursor = conn.cursor()    cursor.execute(f"SELECT * FROM [{table_name}]")    columns = [column[0] for column in cursor.description]    data_structures[table_name] = columns# 输出数据结构信息for table_name, columns in data_structures.items():    print(f"Table Name: {table_name}")    print("Columns:")    for column in columns:        print(f" - {column}")    print()

        代码输出截图对比如下:

图片

        (3)获取创建数据集、要素类和表所需的参数信息

代码如下:

def get_info(conn, table_name):    cursor = conn.cursor()    table_query = f"""        SELECT DISTINCT A.Type, A.Path, B.Name        FROM GDB_ITEMS A, GDB_ItemTypes B        WHERE A.Name = '{table_name}' AND B.UUID = A.Type    """    table_info = {}    create_info = {'name': table_name}    cursor.execute(table_query)    info = [i for i in cursor][0]    if info[2] == 'Feature Dataset':        # 获取坐标系信息        sr_query = f"""                SELECT A.Definition                FROM GDB_ITEMS A            """        cursor_sr = conn.cursor()        cursor_sr.execute(sr_query)        for row in cursor_sr.fetchall():            if "DEFeatureDataset" in str(row):                sr = get_sr_from_Definition(row[0])                create_info['src'] = sr                break        table_info['Feature Dataset'] = create_info    elif info[2] == 'Feature Class':        fc_query = f"""                SELECT DISTINCT A.ShapeType, A.HasZ, A.HasM, B.SRTEXT                FROM GDB_GeomColumns A, GDB_SpatialRefs B                WHERE A.TableName = '{table_name}' AND B.SRID = A.SRID            """        cursor_fc = conn.cursor()        cursor_fc.execute(fc_query)        fc = [row for row in cursor_fc][0]        # 获取要素类字段信息        f_infos = get_fields_infos(conn, table_name)        create_info['path'] = info[1]        create_info['ShapeType'] = fc[0]        create_info['HasZ'] = fc[1]        create_info['HasM'] = fc[2]        create_info['src'] = fc[3]        create_info['f_info'] = f_infos        table_info['Feature Class'] = create_info    elif info[2] == 'Table':        # 获取表字段信息        t_infos = get_fields_infos(conn, table_name)        create_info['f_info'] = t_infos        table_info['Table'] = create_info    else:        print(info[2])        return {}    return table_infodef get_mdb_struct_info(conn, table_names):    for tables in table_names.values():        if isinstance(tables, dict):            for dt_name, tables in tables.items():                for table in tables:                    if table:                        infos = get_info(conn, table)                        print()                        print(str(table).center(40, '-'))                    else:                        infos = get_info(conn, dt_name)                        print()                        print(str(dt_name).center(40, '-'))                    print(infos)        elif isinstance(tables, list):            for table in tables:                infos = get_info(conn, table)                print()                print(str(table).center(40, '-'))                print(infos)if __name__ == '__main__':    # 使用示例    mdb_file_path = r"D:\data\tess.mdb"    conn = get_conn(mdb_file_path)    get_mdb_struct_info(conn, datasets)

        得到了每个要素集(包括空要素集)的名称、空间参考信息;

        得到了每个要素类的名称、所属要素集、要素类型、空间参考以及字段属性信息;

        得到了每个表的名称、表字段属性信息。

代码执行结果如下:

图片

 

2、 Geoscene Pro4.0

根据mdb库体结构创建gdb数据库

        (1)创建与mdb同名的gdb;

        (2)创建数据集,并在数据集下创建该数据集下的要素类;

        (3)在gdb根目录创建要素类;

        (4)创建表。

这部分将在下一篇中进行讲解,本文篇幅已经太长了。

图片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1884826.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL InnoDB Cluster 高可用集群部署

MySQL InnoDB Cluster 简介 官方文档&#xff1a;https://dev.mysql.com/doc/refman/8.4/en/mysql-innodb-cluster-introduction.html 本章介绍 MySQL InnoDB Cluster&#xff0c;它结合了 MySQL 技术&#xff0c;使您能够部署和管理完整的 MySQL 集成高可用性解决方案。 说…

Labview绘制柱状图

废话不多说&#xff0c;直接上图 我喜欢用NXG风格&#xff0c;这里我个人选的是xy图。 点击箭头指的地方 选择直方图 插值选择第一个 直方图类型我选的是第二个效果如图。 程序部分如图。 最后吐槽一句&#xff0c;现在看CSDN好多文章都要收费了&#xff0c;哪怕一些简单的入…

运营商如何通过PCDN技术提高用户服务?

着互联网的快速发展&#xff0c;用户对网络速度和质量的要求越来越高。为了满足这些需求&#xff0c;内容分发网络(CDN)成为了关键的基础设施。而在CDN技术中&#xff0c;PCDN(PersonalCDN)作为一种新兴的技术&#xff0c;为运营商和用户提供了新的解决方案。本文将重点介绍PCD…

vue3中使用Antv G6渲染树形结构并支持节点增删改

写在前面 在一些管理系统中&#xff0c;会对组织架构、级联数据等做一些管理&#xff0c;你会怎么实现呢&#xff1f;在经过调研很多插件之后决定使用 Antv G6 实现&#xff0c;文档也比较清晰&#xff0c;看看怎么实现吧&#xff0c;先来看看效果图。点击在线体验 实现的功能…

图形的搭建

例一&#xff1a; 输入描述&#xff1a; 多组输入&#xff0c;一个整数&#xff08;2~20&#xff09;&#xff0c;表示输出的行数&#xff0c;也表示组成“X”的反斜线和正斜线的长度。 输出描述&#xff1a; 针对每行输入&#xff0c;输出用“*”组成的X形图案。 示例一&…

macos m2 百度paddleocr文字识别 python

创建了一个虚拟环境&#xff1a;conda create -n orc python3.11.7 进入虚拟环境后执行2条命令 pip install paddleocr -i https://pypi.tuna.tsinghua.edu.cn/simple pip install paddlepaddle -i https://pypi.tuna.tsinghua.edu.cn/simple​ ​ 安装好后&#xff0c;在网…

VUE2及其生态查漏补缺

1、数据代理概括 数据代理过程相当于是进行了 vm 代理 vm_data中的属性&#xff0c;vm._data 是与 我们vue文件中写的 data是全等的 //创建Vue实例let data { //data中用于存储数据&#xff0c;数据供el所指定的容器去使用&#xff0c;值我们暂时先写成一个对象。name:atguig…

[C++][设计模式][迭代器模式]详细讲解

目录 1.动机2.模式定义3.要点总结4.代码感受 1.动机 在软件构建过程中&#xff0c;集合对象内部结构常常变化各异。但对于这些集合对象&#xff0c;我们希望不暴露其内部结构的同时&#xff0c;可以让外部客户代码透明地访问其中包含的元素&#xff1b; 同时这种”透明遍历“也…

每天五分钟深度学习:解决for循环效率慢的关键在于向量化

本文重点 上一节课程中,我们学习了多样本的线性回归模型,但是我们的伪代码实现中使用了大量的for循环,这样代码的问题是效率很低。为了克服这一瓶颈,向量化技术应运而生,成为提升程序执行效率、加速数据处理速度的重要手段。 向量化技术概述 向量化(Vectorization)是…

DC/AC电源模块:为智能家居设备提供恒定的电力供应

BOSHIDA DC/AC电源模块&#xff1a;为智能家居设备提供恒定的电力供应 DC/AC电源模块是一种常见的电源转换器&#xff0c;它将直流电源&#xff08;DC&#xff09;转换为交流电源&#xff08;AC&#xff09;&#xff0c;为智能家居设备提供恒定的电力供应。在智能家居系统中&a…

用 AI 生成绘本,含大量 prompt

画图过程&#xff0c;为了保证绘本输出的风格统一&#xff0c;角色连贯&#xff0c;画面内容与故事保持一致 1、画风统一的解决办法&#xff1a;固定一个插画师的风格&#xff0c;可以输入插画师的名字&#xff0c;或者垫图&#xff0c;即上传你需要借鉴风格的图片 2、角色连贯…

探索IT世界的第一步:高考后的暑期学习指南

目录 前言1. IT领域概述1.1 IT领域的发展与现状1.2 IT领域的主要分支1.2.1 软件开发1.2.2 数据科学1.2.3 网络与安全1.2.4 系统与运维 2. 学习路线图2.1 基础知识的学习2.1.1 编程语言2.1.2 数据结构与算法 2.2 实战项目的实践2.2.1 个人项目2.2.2 团队项目 2.3 学习资源的利用…

高考假期预习指南,送给迷茫的你

高考结束&#xff0c;离别了熟悉的地方&#xff0c;踏上远方。 你&#xff0c;&#xff0c;迷茫吗&#xff1f; 大学是什么&#xff1f;到了大学我该怎样学习&#xff1f;真像网上说的毕业即失业吗&#xff1f; 大学是一个让你学会一技之长的地方&#xff0c;到了大学找到自…

非平稳信号的自适应局部迭代滤波(MATLAB)

仍以滚动轴承故障诊断为例&#xff0c;在滚动轴承的运行过程中&#xff0c;其振动信号包含了大量的系统运行状态信息。利用振动信号进行滚动轴承的故障诊断&#xff0c;实际上就是分析振动信号、提取信息的过程。由于非线性力的作用&#xff0c;滚动轴承的故障信号往往是非平稳…

为什么需要做网络安全服务?

网络安全服务之所以重要&#xff0c;是因为它在保护数字资产、维护企业运营、确保法规遵从、防范恶意行为以及建立信任等方面扮演着关键角色。以下是一些主要的理由&#xff1a; 保护核心资产和数据&#xff1a; 数字化转型使得企业数据变得极其宝贵&#xff0c;包括知识产权、…

离散模态信息作为细粒度标记用于多模态知识图谱补全--MyGO

多模态知识图谱&#xff08;MMKG&#xff09;存储了包含有丰富的多模态描述信息的、结构化的世界知识。为了克服其固有的不完整性&#xff0c;多模态知识图谱补全&#xff08;MMKGC&#xff09;希望利用三元组的结构信息及实体的多模态信息&#xff0c;从给定的MMKG中发掘未观察…

智能工厂解决方案—智能数据采集平台

智慧工厂总体架构图 由智能化生产、智能化管理和产业链互联三个层面构成,前两个层面立足于企业自身,以智能工厂为建设目标,实习企业机体自身的智能化,而产业链互联则是以互联网技术为基础,将企业融入到产业链的整体生态环境中,逐步实现制造资源的服务化和云化,并与生态系…

爬数据是什么意思?

爬数据的意思是&#xff1a;通过网络爬虫程序来获取需要的网站上的内容信息&#xff0c;比如文字、视频、图片等数据。网络爬虫&#xff08;网页蜘蛛&#xff09;是一种按照一定的规则&#xff0c;自动的抓取万维网信息的程序或者脚本。 学习一些爬数据的知识有什么用呢&#x…

SAP 接口-银行账号主数据维护接口【MDM->SAP】开发说明书(包括测试样例、程序代码仅作参考,不保证一定可以运行)

接口映射字段 开发通用说明 根据MDM传输字段调用BAPI生成银行账号及开户行。 开户行维护BAPI【BAPI_BANK_CREATE】 银行账号维护BAPI【BAPI_FCLM_BAM_AMD_BNKANT】 接口字段【ZZZH 主账户标识】=1时字段【DTAAI】DME标识赋值:常用; 接口字段【ZZZH 主账户标识】=0时字段…

mysql中的递归函数recursive

递归部门 WITH recursive dept_tree AS (SELECTsd.mine_id AS mine_id,sd.dept_id AS dept_id,sd.tenant_id AS tenant_id,sd.order_num,sd.dept_name AS topName,sd.dept_id AS topIdFROMsys_dept sdWHERE<!-- 加上or后也会查询出dept节点 sd.parent_id #{deptId} or sd.…