Katman sembolojisini almak için ArcPy mi kullanıyorsunuz?


16

ArcGIS 10, ArcPy paketi ile birlikte geldiğinden, bir katmanın Sembolojisini (yani renk, genişlik ...) elde etmek için ArcPy işlevlerini kullanmanın mümkün olduğunu merak ediyorum?

Yanıtlar:


15

ArcGIS 10.0 için, salt okunur bir yaklaşımdan yararlanabiliyorsanız, aşağıdaki kod örneği bir katmanın sembolojisinin temelini oluşturan alanı (ve birleştirilmiş tablo) gösterir. Geçici bir msd (xml dosyaları içeren bir zip) dışa aktarır ve belirli nitelikleri bir nesneye yükler. Bu sınıflar, ek katman özniteliklerine erişmek için genişletilebilir.

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 

Testin örnek çıktısı:

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

Bu zip dosyası için bir bağlam yöneticisini kullanın: with zipfile.ZipFile(msdPath) as zz:.
jpmc26

@MichaelJackson Kodunuzda yalnızca mxd yolunu değiştirdim. Ama diyerek `lyr.symbologyFieldName = symbologyElement.getElementsByTagName (self.LYR_FIELD_NODE) ​​[0] .childNodes [0] .nodeValue` satırında bir hata aldım list index out of range. bunun nedeni symbologyElement.getElementsByTagName(self.LYR_FIELD_NODE)boş olmasıdır. Ama neden boş? Bunun lyr.symbology yöntemine bir alternatif olduğunu varsaydım, ancak yine de çalışmıyor.
panda

@panda Bu eski bir cevap. 10.0'dan daha yüksek bir sürüm mü kullanıyorsunuz? Evetse, katman nesnesinin semboloji özelliği hakkında aşağıdaki cevaba bakın.
MJ

@MichaelJackson Semboloji özelliğini kullanıyorum, ancak katman semboloji için birden fazla alan kullandığında olduğu gibi tüm durumlarda desteklenmiyor gibi görünüyor. Kullanılan alanların isimlerini almam gerekiyor, ama bir yöntem bulamıyorum.
panda


6

ArcGIS 10.1 ve daha yenisinde katman nesnesinin semboloji özelliği aracılığıyla sembolojiye doğrudan erişim vardır .

ArcGIS 10.0 için söz konusu geçici çözümler benim için işe yaradı.


ne yazık ki, bir katmanın sembolojisi salt okunurdur ( bu sayfadaki "semboloji" nin beşinci örneğine ve belirttiğiniz katmana göre ).
Roland

1
Ancak "Katman sembolojisi sınıfı türlerinin tümü desteklenmez; olmayanlar için OTHER anahtar sözcüğü döndürülür." . Desteklenmeyen türler arasında Raster Benzersiz Değerler, Benzersiz Değerler Birçok Alan ve Nokta Yoğunluğu bulunur. Bu ArcGIS 10.5'te hala geçerlidir. Desteklenen bir SymbologyType'a
matt wilkie
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.