在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)