#!/usr/bin/env python # -*- coding: utf-8 -*- """ 测试脚本 用于测试ArcGIS Pro图层属性和标注功能 """ import os import sys import argparse import traceback import arcpy def log(message): """日志输出函数""" print(message) def test_arcgis_environment(): """测试ArcGIS Pro环境""" log("=== ArcGIS Pro环境信息 ===") log(f"Python版本: {sys.version}") log(f"Python路径: {sys.executable}") log(f"当前工作目录: {os.getcwd()}") log(f"ArcPy版本: {arcpy.GetInstallInfo()['Version']}") log(f"ArcPy产品: {arcpy.GetInstallInfo()['ProductName']}") # 当前环境设置 log("\n=== ArcGIS环境设置 ===") log(f"工作空间: {arcpy.env.workspace}") log(f"输出坐标系统: {arcpy.env.outputCoordinateSystem}") log(f"覆盖输出: {arcpy.env.overwriteOutput}") def test_layer_properties(layer_path): """测试图层属性""" log(f"\n=== 图层属性测试: {layer_path} ===") if not arcpy.Exists(layer_path): log(f"错误: 图层不存在 - {layer_path}") return try: # 创建图层对象 log("尝试创建图层对象...") layer = arcpy.mp.Layer(layer_path) log(f"成功创建图层: {layer.name}") # 图层基本属性 log("\n图层基本属性:") log(f"名称: {layer.name}") log(f"数据源类型: {type(layer.dataSource).__name__ if hasattr(layer, 'dataSource') else 'N/A'}") log(f"长名称: {layer.longName if hasattr(layer, 'longName') else 'N/A'}") # 图层类型 log("\n图层类型判断:") log(f"是要素图层: {layer.isFeatureLayer if hasattr(layer, 'isFeatureLayer') else 'N/A'}") log(f"是栅格图层: {layer.isRasterLayer if hasattr(layer, 'isRasterLayer') else 'N/A'}") log(f"是图形图层: {layer.isGroupLayer if hasattr(layer, 'isGroupLayer') else 'N/A'}") # 支持的属性 log("\n支持的属性:") properties = [ 'LABELCLASSES', 'SHOWLABELS', 'NAME', 'DATASOURCE', 'DEFINITIONQUERY', 'VISIBLE', 'TRANSPARENCY', 'BRIGHTNESS', 'CONTRAST', 'SYMBOLOGY' ] for prop in properties: try: support = hasattr(layer, prop.lower()) or (hasattr(layer, 'supports') and layer.supports(prop)) log(f"{prop}: {'支持' if support else '不支持'}") except Exception as e: log(f"{prop}: 检查失败 - {str(e)}") # 尝试获取标注类 log("\n标注类测试:") try: if hasattr(layer, 'listLabelClasses'): label_classes = layer.listLabelClasses() log(f"找到 {len(label_classes)} 个标注类") # 显示每个标注类的信息 for i, lc in enumerate(label_classes): log(f"标注类 #{i+1}: {lc.name if hasattr(lc, 'name') else 'N/A'}") log(f" 表达式: {lc.expression if hasattr(lc, 'expression') else 'N/A'}") log(f" SQL查询: {lc.SQLQuery if hasattr(lc, 'SQLQuery') else 'N/A'}") log(f" 可见: {lc.showClassLabels if hasattr(lc, 'showClassLabels') else 'N/A'}") else: log("图层不支持listLabelClasses方法") # 检查标注状态 if hasattr(layer, 'showLabels'): log(f"标注显示状态: {layer.showLabels}") else: log("图层没有showLabels属性") except Exception as e: log(f"获取标注类时出错: {str(e)}") # 使用arcpy.da.Describe获取详细信息 log("\narcpy.da.Describe描述信息:") try: desc = arcpy.da.Describe(layer) for key in desc: # 跳过复杂对象 if isinstance(desc[key], (dict, list, tuple)): log(f"{key}: [复杂类型]") else: log(f"{key}: {desc[key]}") except Exception as e: log(f"获取Describe信息时出错: {str(e)}") except Exception as e: log(f"测试图层属性时出错: {str(e)}") log(traceback.format_exc()) def test_annotation_conversion(map_path, layer_name, output_folder): """测试标注转注记功能""" log(f"\n=== 标注转注记测试: {map_path}, 图层: {layer_name} ===") if not arcpy.Exists(map_path): log(f"错误: 地图文档不存在 - {map_path}") return # 确保输出文件夹存在 if not os.path.exists(output_folder): os.makedirs(output_folder) try: # 打开地图文档 log(f"打开地图文档...") aprx = arcpy.mp.ArcGISProject(map_path) # 获取活动地图 log(f"获取地图...") maps = aprx.listMaps() if not maps: log("错误: 地图文档中没有地图") return target_map = maps[0] # 默认使用第一个地图 log(f"使用地图: {target_map.name}") # 查找指定图层 log(f"查找图层: {layer_name}") layers = target_map.listLayers(layer_name) if not layers: log(f"错误: 找不到图层 {layer_name}") return label_layer = layers[0] log(f"找到图层: {label_layer.name}") # 测试图层属性 test_layer_properties(label_layer) # 尝试开启标注 try: if hasattr(label_layer, 'showLabels'): log(f"当前标注状态: {label_layer.showLabels}") label_layer.showLabels = True log(f"已开启标注,新状态: {label_layer.showLabels}") except Exception as e: log(f"设置标注状态时出错: {str(e)}") # 尝试执行标注转注记 log("\n执行标注转注记...") try: anno_name = f"{label_layer.name}_Anno" output_anno = os.path.join(output_folder, anno_name) # 检查是否已存在 if arcpy.Exists(output_anno): log(f"注记已存在: {output_anno},将尝试删除") arcpy.management.Delete(output_anno) # 执行转换 log("使用ConvertLabelsToAnnotation...") arcpy.cartography.ConvertLabelsToAnnotation( target_map, [label_layer], output_folder, "FEATURE_LINKED", "STANDARD", None, None, None ) log("ConvertLabelsToAnnotation执行成功") except Exception as e: log(f"执行标注转注记时出错: {str(e)}") log(traceback.format_exc()) # 尝试替代方案 try: log("\n尝试使用LabelFeatures替代方案...") arcpy.cartography.LabelFeatures( in_features=label_layer, out_geodatabase=output_folder ) log("LabelFeatures执行成功") except Exception as e2: log(f"LabelFeatures也失败: {str(e2)}") except Exception as e: log(f"测试标注转注记时出错: {str(e)}") log(traceback.format_exc()) finally: if 'aprx' in locals(): del aprx def main(): """主函数""" parser = argparse.ArgumentParser(description='ArcGIS Pro图层和标注功能测试') parser.add_argument('--message', default='测试消息', help='测试消息') parser.add_argument('--count', type=int, default=1, help='重复次数') parser.add_argument('--map', help='地图文档路径(.aprx)') parser.add_argument('--layer', help='图层名称') parser.add_argument('--layer_path', help='图层文件路径(.lyrx)') parser.add_argument('--output', help='输出文件夹') args = parser.parse_args() # 输出系统信息 test_arcgis_environment() # 输出测试消息 for i in range(args.count): log(f"\n{i+1}. {args.message}") # 如果提供了图层文件路径,测试图层属性 if args.layer_path: test_layer_properties(args.layer_path) # 如果提供了地图文档、图层名称和输出文件夹,测试标注转注记 if args.map and args.layer and args.output: test_annotation_conversion(args.map, args.layer, args.output) # 退出前打印完成消息 log("\n测试脚本执行完成") return 0 if __name__ == "__main__": sys.exit(main())