আর্কপাই ব্যবহার করে স্তর প্রতীক পেতে?


16

যেহেতু আরকজিআইএস 10 আরপপি প্যাকেজটির সাথে আসে, আমি ভাবছিলাম যে কোনও স্তরের সিম্বলজি (অর্থাত্ রঙ, প্রস্থ ...) পেতে আর্কপাই ফাংশন ব্যবহার করা সম্ভব?

উত্তর:


15

আর্কজিআইএস 10.0-এর জন্য, আপনি যদি কেবল পঠনযোগ্য পদ্ধতির ব্যবহার করতে পারেন তবে নীচের কোডের নমুনাটি ক্ষেত্রটি (এবং যোগদানের টেবিল) প্রকাশ করে যা কোনও স্তরের প্রতীকতার ভিত্তি তৈরি করে। এটি একটি অস্থায়ী এমএসডি (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

@ মিশেলজ্যাকসন আপনার কোডে আমি কেবলমাত্র এমএক্সডি পাথটি প্রতিস্থাপন করেছি। তবে আমি বলছি `lyr.symbologyFeldName = সিম্বলজি এলিমেট.জেট এলিমেন্টস বাই টাইগনাম (স্ব.লাইআর_এফআইএলডি_নোডি) [0] .চিল্ড নোডস [0] .নোডভ্যালু at লাইনে একটি ত্রুটি পেয়েছি list index out of range। এটি কারণ symbologyElement.getElementsByTagName(self.LYR_FIELD_NODE)খালি। তবে কেন এটি খালি? আমি ধরে নিয়েছি যে এটি লিরিক সায়েন্সোলজি পদ্ধতির বিকল্প, তবে এটি এখনও কার্যকর হয় না।
পান্ডা

@ পান্ডা এটি একটি পুরানো উত্তর। আপনি কি 10.0 এর চেয়ে বেশি সংস্করণ ব্যবহার করছেন? যদি হ্যাঁ হয় তবে স্তর অবজেক্টের প্রতীকী সম্পত্তি সম্পর্কে নীচে উত্তর দেখুন।
এমজে

@ মিশেল জ্যাকসন আমি প্রতীকী সম্পত্তিটি ব্যবহার করি তবে মনে হয় যে এটি সমস্ত ক্ষেত্রে সমর্থিত নয়, যেমন স্তরটি যখন প্রতীকতত্ত্বের জন্য একাধিক ক্ষেত্র ব্যবহার করে। আমার ব্যবহৃত ক্ষেত্রগুলির নামগুলি পাওয়া দরকার, তবে আমি কোনও পদ্ধতি খুঁজে পাচ্ছি না।
পান্ডা

10

আরকিপি আপনাকে প্রতীকতত্ত্ব পরিবর্তন করতে দেয়, তবে কেবল বিদ্যমান .lyr ফাইলগুলির সাথে , এবং মডিউলটি আমার পড়ার উপর ভিত্তি করে সরাসরি আপনার কোডে চিহ্নগুলি নির্দিষ্ট করে না।


6

আরকজিআইএস 10.1 এবং আরও নতুনতে লেয়ার অবজেক্টের প্রতীকী বৈশিষ্ট্যের মাধ্যমে প্রতীকতন্ত্রের সরাসরি অ্যাক্সেস রয়েছে ।

আরকজিআইএস 10.0 এর জন্য উল্লিখিত ওয়ার্কআরউন্ডগুলি আমার পক্ষে কাজ করেছিল।


দুর্ভাগ্যক্রমে, একটি স্তরের চিহ্নটি কেবল পঠনযোগ্য ( এই পৃষ্ঠায় "প্রতীকীকরণ" এর পঞ্চম উদাহরণ অনুসারে , পাশাপাশি আপনি যেটি উদ্ধৃত করেছেন)।
রোল্যান্ড

1
তবে "সমস্ত স্তর চিহ্নের শ্রেণীর ধরণগুলি সমর্থিত নয়; তাদের নয়, অন্য কীওয়ার্ডটি ফিরে এসেছে" " । অসমর্থিত প্রকারের মধ্যে রাস্টার অনন্য মূল্যবোধ, অনন্য মূল্যবোধ অনেক ক্ষেত্র এবং ডট ঘনত্ব অন্তর্ভুক্ত। এটি আরকজিআইএস 10.5-এ এখনও সত্য। যদি আপনি যথেষ্ট ভাগ্যবান হন তবে একটি সমর্থিত সিম্বোলজি টাইপ gis.stackexchange.com/Qestions/184133/…
ম্যাট উইলকি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.