249 lines
8.7 KiB
Python
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()) |