使用ArcPy获取图层符号系统?


16

由于ArcGIS 10随附了ArcPy软件包,因此我想知道是否可以使用ArcPy函数获取图层的符号系统(即颜色,宽度...)?

Answers:


15

对于ArcGIS 10.0,如果可以使用只读方法,则以下代码示例将揭示构成图层符号系统基础的字段(和连接的表)。它导出一个临时msd(包含xml文件的zip文件),并将特定的属性加载到一个对象中。可以扩展这些类以获得对其他图层属性的访问。

import zipfile
from arcpy import mapping
import os
from xml.dom.minidom import parse


class LayerExtras(object):
    """ An object to hold attributes loaded from xml inside the msd."""

    name = ""
    symbologyFieldName = ""


class MxdExtras(dict):
    """ Exposes extra MXD details by raiding an exported msd

        Treat this object as a dictionary with layer name as the key and a custom object
        with desired attributes as the value.
        You must have write access to MXD directory (creates temporary msd file).
        Only layers in the first dataframe are accessed.

    """    

    LYR_NAME_NODE = "Name"
    LYR_SYMBOL_NODE = "Symbolizer"
    LYR_FIELD_NODE = "Field"
    MSD_SUFFIX = "_MxdExtrasTemp.msd"
    MXD_SUFFIX = ".mxd"
    EXCLUDED_FILE_NAMES = ["DocumentInfo.xml", "layers/layers.xml"]
    mxdPath = ""

    def __init__(self, mxdPath):

        self.loadMxdPath(mxdPath)


    def loadMxdPath(self, mxdPath):
        """ Load mxd from file path """

        self.mxdPath = mxdPath.lower()
        mxd = mapping.MapDocument(self.mxdPath)

        msdPath = self.mxdPath.replace(self.MXD_SUFFIX, self.MSD_SUFFIX) 

        # Delete temporary msd if it exists
        if os.path.exists(msdPath):
            os.remove(msdPath)

        mapping.ConvertToMSD(mxd,msdPath)

        zz = zipfile.ZipFile(msdPath)

        for fileName in (fileName for fileName in zz.namelist() if not fileName in self.EXCLUDED_FILE_NAMES):
            dom = parse(zz.open(fileName))
            name, lyr = self.loadMsdLayerDom(dom)
            self[name] = lyr
        del zz
        os.remove(msdPath)

    def loadMsdLayerDom(self, dom):
        """ Load dom created from xml file inside the msd. """

        lyr = LayerExtras()  

        # Layer name
        lyr.name = dom.getElementsByTagName(self.LYR_NAME_NODE)[0].childNodes[0].nodeValue

        # Symbology field name
        symbologyElement = dom.getElementsByTagName(self.LYR_SYMBOL_NODE)[0]
        lyr.symbologyFieldName = symbologyElement.getElementsByTagName(self.LYR_FIELD_NODE)[0].childNodes[0].nodeValue

        return lyr.name, lyr


############
# Test

if __name__ == "__main__":

    mxdPath = r"c:\temp\AmphibianSpeciesRichnessAverageOf30mCells.mxd"

    mxde = MxdExtras(mxdPath)

    for lyr in mxde.itervalues():
        print "Layer Name: ", lyr.name 
        print "Layer Symbology Field Name: ", lyr.symbologyFieldName
        print 

测试的示例输出:

Layer Name:  Amphibian Species Richness Average of 30m Cells
Layer Symbology Field Name:  biodiversity.AmphAve

使用该zip文件的上下文管理器:with zipfile.ZipFile(msdPath) as zz:
jpmc26

@MichaelJackson在您的代码中,我仅替换了mxd路径。但是我在lyr.symbologyFieldName = symbologyElement.getElementsByTagName(self.LYR_FIELD_NODE)[0] .childNodes [0] .nodeValue`行上说一个错误list index out of range。这是因为的内容symbologyElement.getElementsByTagName(self.LYR_FIELD_NODE)为空。但是为什么它是空的?我以为这是lyr.symbology方法的替代方法,但是它仍然行不通。
熊猫

@panda这是一个旧答案。您使用的版本高于10.0吗?如果是,请参见下面有关图层对象的符号系统属性的答案。
MJ

@MichaelJackson我使用了symbology属性,但似乎并非在所有情况下都支持该属性,例如当该图层使用多个字段进行符号系统处理时。我需要获取使用的字段的名称,但是找不到方法。
熊猫

10

ArcPy希望让您更改符号系统,但只能使用现有的.lyr文件,而不能根据我对模块的了解直接在代码中指定符号。


6

在ArcGIS 10.1和更高版本中,可以通过图层对象symbology属性直接访问符号系统

对于ArcGIS 10.0,上述解决方法确实对我有用。


不幸的是,层的符号系统是只读的(根据本页上“ symbology”的第五个实例以及您引用的实例)。
罗兰2014年

1
但是, “并非支持所有层符号系统类类型;对于不支持的所有类型,将返回关键字OTHER。” 。不支持的类型包括“栅格唯一值”,“多个字段唯一值”和“点密度”。在ArcGIS 10.5中仍然如此。如果您有幸拥有受支持的SymbologyType,请参阅gis.stackexchange.com/questions/184133/…中的
matt wilkie
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.