Files
ArcGis_Py/tools/core/test_script.py
2026-04-22 12:27:49 +08:00

249 lines
8.7 KiB
Python

#!/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())