ใช้ ArcPy เพื่อรับเลเยอร์สัญลักษณ์?


16

เนื่องจาก ArcGIS 10 มาพร้อมกับแพ็คเกจ ArcPy ฉันสงสัยว่ามันเป็นไปได้ไหมที่จะใช้ฟังก์ชั่น ArcPy เพื่อรับ Symbology (เช่นสีความกว้าง ... ) ของเลเยอร์

คำตอบ:


15

สำหรับ ArcGIS 10.0 ถ้าคุณสามารถใช้วิธีการแบบอ่านอย่างเดียวตัวอย่างโค้ดต่อไปนี้จะแสดงฟิลด์ (และตารางที่เข้าร่วม) ซึ่งเป็นพื้นฐานสำหรับสัญลักษณ์ของเลเยอร์ มันส่งออกชั่วคราว msd (zip ที่มีไฟล์ xml) และโหลดคุณลักษณะเฉพาะลงในวัตถุ คลาสเหล่านี้อาจถูกขยายเพื่อเข้าถึงแอ็ตทริบิวต์เลเยอร์เพิ่มเติม

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

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 rangesayying นี่เป็นเพราะว่างsymbologyElement.getElementsByTagName(self.LYR_FIELD_NODE)เปล่า แต่ทำไมมันว่างเปล่า ฉันคิดว่านี่เป็นทางเลือกแทนวิธี lyr.symbology แต่ก็ยังใช้งานไม่ได้
แพนด้า

@panda นี่เป็นคำตอบเก่า คุณใช้เวอร์ชั่นสูงกว่า 10.0 หรือไม่? ถ้าใช่ดูคำตอบด้านล่างเกี่ยวกับคุณสมบัติสัญลักษณ์ของวัตถุเลเยอร์
MJ

@MichaelJackson ฉันใช้คุณสมบัติสัญลักษณ์ แต่ดูเหมือนว่ามันไม่ได้รับการสนับสนุนในทุกกรณีเช่นเมื่อเลเยอร์ใช้มากกว่าหนึ่งช่องสำหรับสัญลักษณ์ ฉันต้องการชื่อของเขตข้อมูลที่ใช้ แต่ฉันไม่สามารถหาวิธีได้
แพนด้า

10

ArcPy ดูเหมือนจะให้คุณเปลี่ยนสัญลักษณ์ แต่มีเฉพาะไฟล์. lyr ที่มีอยู่และไม่ได้ระบุสัญลักษณ์โดยตรงในรหัสของคุณตามการอ่านโมดูลของฉัน


6

ใน ArcGIS 10.1 ขึ้นไปมีการเข้าถึงสัญลักษณ์โดยตรงผ่านทาง สัญลักษณ์คุณสมบัติของวัตถุชั้น

สำหรับ ArcGIS 10.0 วิธีแก้ปัญหาที่กล่าวถึงได้ผลสำหรับฉัน


น่าเสียดายที่สัญลักษณ์ของเลเยอร์เป็นแบบอ่านอย่างเดียว (อ้างอิงจาก "อินสแตนซ์ที่ห้าของ" สัญลักษณ์ "ในหน้านี้เช่นเดียวกับที่คุณอ้างถึง)
Roland

1
อย่างไรก็ตาม "สนับสนุนคลาสคลาส symbology ของเลเยอร์บางประเภทเท่านั้นสำหรับประเภทที่ไม่ใช่คำหลัก OTHER จะถูกส่งกลับ" . ประเภทที่ไม่รองรับ ได้แก่ ค่าเฉพาะของแรสเตอร์, ค่าเฉพาะ, หลายฟิลด์และความหนาแน่นของจุด สิ่งนี้ยังคงเป็นจริงใน ArcGIS 10.5 หากคุณโชคดีพอที่ได้รับ SymbologyType ดูสคริปต์ในgis.stackexchange.com/questions/184133/…
matt wilkie
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.