用Python为GIS数据添加专属字段

在GIS领域,数据的管理和处理是一项复杂而精细的工作。对于我的女朋友来说,她每天都要面对成百上千的图层,这些图层存储在一个庞大的GDB文件中。最近,她需要为每个图层添加一个新的字段,这个字段的值就是图层的名称。听起来简单,但手动操作无疑是一项耗时且容易出错的任务。作为一个程序员,我决定用我的Python技能来帮助她自动化这个过程。技术选型

技术选型

为了完成这项任务,我选择了Python语言,搭配强大的地理空间数据处理库GeoPandas和Fiona。这些工具能够让我们方便地读取、修改和保存地理空间数据。

代码实现
import geopandas as gpd
import fiona
import os

def add_file_to_gpkg(db_name):
    # 定义输入和输出GDB路径
    input_gdb = f"./空间数据/{db_name}.gdb"
    output_gpkg = f"./output/{db_name}test.gpkg"
    error_log_file = f"./output/{db_name}_error_layers.txt"
    
    if not os.path.exists("./output"):
        os.mkdir("./output")
    
    # 获取GDB中的所有图层
    layers = fiona.listlayers(input_gdb)
    
    with open(error_log_file, 'w') as error_log:
        for layer_name in layers:
            print(f"Processing layer: {layer_name}")
            
            try:
                # 读取图层
                gdf = gpd.read_file(input_gdb, layer=layer_name)
                
                # 检查并处理CRS
                if gdf.crs is None:
                    print(f"Warning: No CRS defined for layer {layer_name}. Using default CRS (EPSG:4326).")
                    gdf.crs = 'EPSG:4326'
                else:
                    print(f"CRS for layer {layer_name}: {gdf.crs}")
                
                # 创建新字段 'ddd' 并赋值为图层名称去掉前缀部分
                gdf['ddd'] = layer_name.replace(f'{db_name}_', '')
                
                # 保存到GeoPackage中
                gdf.to_file(output_gpkg, layer=layer_name, driver='GPKG')
            
            except Exception as e:
                # 记录错误图层名称和错误信息
                print(f"Error processing layer {layer_name}: {e}")
                error_log.write(f"Layer: {layer_name}, Error: {str(e)}\n")

    print(f"处理完成,所有图层已保存至: {output_gpkg}")
    print(f"错误图层信息已保存至: {error_log_file}")

if __name__ == '__main__':
    for district in ['同安区', '海沧区', '翔安区', '集美区']:
        add_file_to_gpkg(district)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值