Py学习  »  Python

ArcGIS Pro python获得面图层的RGB打印出来

GISAI • 5 月前 • 228 次点击  

import arcpy


def get_layer_symbol_colors(layer_name):

    """

    获取指定面图层的符号化RGB颜色


    参数:

    layer_name: 图层名称

    """


    # 获取当前活动地图

    aprx = arcpy.mp.ArcGISProject("CURRENT")

    map_obj = aprx.activeMap


    # 查找指定的图层

    layer = None

    for lyr in map_obj.listLayers():

        if lyr.name == layer_name:

            layer = lyr

            break


    if layer is None:

        print(f"未找到图层: {layer_name}")

        return


    # 检查是否为面图层(避免CIM版本错误)

    try:

        if hasattr(layer, 'connectionProperties') and layer.connectionProperties:

            # 这是一个要素图层,检查几何类型

            desc = arcpy.Describe(layer.dataSource)

            if desc.shapeType != 'Polygon':

                print(f"图层 {layer_name} 不是面图层")

                return

    except:

        # 如果无法检查几何类型,继续执行

        print(f"警告:无法验证图层 {layer_name} 的几何类型,继续执行...")


    # 获取图层的符号系统

    symbology = layer.symbology


    print(f"图层名称: {layer_name}")

    print(f"符号系统类型: {symbology.renderer.type}")

    print("-" * 50)


    # 根据不同的渲染器类型处理

    if symbology.renderer.type == "SimpleRenderer":

        # 简单符号渲染器

        symbol = symbology.renderer.symbol

        print("渲染类型: 简单符号")

        print_symbol_color(symbol, "主符号")


    elif symbology.renderer.type == "UniqueValueRenderer":

        # 唯一值渲染器

        print("渲染类型: 唯一值符号")

        renderer = symbology.renderer


        # 遍历所有分类

        for group in renderer.groups:

            for item in group.items:

                print(f"分类值: {item.values}")

                print(f"标签: {item.label}")

                print_symbol_color(item.symbol, f"符号-{item.label}")

                print("-" * 30)


    elif symbology.renderer.type == "GraduatedColorsRenderer":

        # 分级颜色渲染器

        print("渲染类型: 分级颜色")

        renderer = symbology.renderer


        for i, break_obj in enumerate(renderer.classBreaks):

            print(f"分级 {i+1}: {break_obj.upperBound}")

            print(f"标签: {break_obj.label}")

            print_symbol_color(break_obj.symbol, f"分级-{i+1}")

            print("-" * 30)


    elif symbology.renderer.type == "GraduatedSymbolsRenderer":

        # 分级符号渲染器

        print("渲染类型: 分级符号")

        renderer = symbology.renderer


        for i, break_obj in enumerate(renderer.classBreaks):

            print(f"分级 {i+1}: {break_obj.upperBound}")

            print(f"标签: {break_obj.label}")

            print_symbol_color(break_obj.symbol, f"分级-{i+1}")

            print("-" * 30)


    else:

        print(f"不支持的渲染器类型: {symbology.renderer.type}")


def print_symbol_color(symbol, symbol_name):

    """

    打印符号的RGB颜色信息


    参数:

    symbol: 符号对象

    symbol_name: 符号名称

    """

    try:

        # 获取符号的颜色

        if hasattr(symbol, 'color'):

            color = symbol.color

            if color:

                print(f"{symbol_name} RGB颜色: R={color['RGB'][0]}, G={color['RGB'][1]}, B={color['RGB'][2]}")

                print(f"{symbol_name} CMYK颜色: C={color['CMYK'][0]}, M={color['CMYK'][1]}, Y={color['CMYK'][2]}, K={color['CMYK'][3]}")


        # 如果符号有轮廓线,也打印轮廓线颜色

        if hasattr(symbol, 'outlineColor'):

            outline_color = symbol.outlineColor

            if outline_color:

                print(f"{symbol_name} 轮廓线RGB颜色: R={outline_color['RGB'][0]}, G={outline_color['RGB'][1]}, B={outline_color['RGB'][2]}")


    except Exception as e:

        print(f"获取 {symbol_name} 颜色时出错: {str(e)}")


# 使用示例

if __name__ == "__main__":

    # 替换为你的图层名称

    layer_name = "图斑"


    try:

        get_layer_symbol_colors(layer_name)

    except Exception as e:

        print(f"执行出错: {str(e)}")


# 简化版本 - 如果只需要获取简单符号的颜色

def get_simple_layer_color(layer_name):

    """

    获取简单符号面图层的RGB颜色(简化版本)

    """

    aprx = arcpy.mp.ArcGISProject("CURRENT")

    map_obj = aprx.activeMap


    # 查找图层

    for layer in map_obj.listLayers():

        if layer.name == layer_name:

            if layer.symbology.renderer.type == "SimpleRenderer":

                color = layer.symbology.renderer.symbol.color

                if color:

                    rgb = color['RGB']

                    print(f"图层 '{layer_name}' RGB颜色: R={rgb[0]}, G={rgb[1]}, B={rgb[2]}")

                    return rgb


    print(f"未找到图层 '{layer_name}' 或不是简单符号渲染")

    return None


# 调用简化版本

# rgb_values = get_simple_layer_color("你的图层名称")


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/190733