ArcPy का उपयोग करके कई MXDs में डेटा स्रोतों की मरम्मत करना?


14

मेरे पास लगभग 50 mxd की सभी टूटी हुई परतों के साथ है जो मुझे गुजरना और मैन्युअल रूप से रीसेट करना है।

डेटा को किसी अन्य कंप्यूटर से स्थानांतरित किया गया था और फ़ोल्डर संरचना को बदल दिया गया था, इसलिए यह बदलने की एक सरल प्रक्रिया नहीं है (उदाहरण):

"F: \ Data \ Rivers.shp" से "C: \ Data \ Rivers.shp"

यह अधिक पसंद है:

"F: \ Data \ Rivers.shp" को C: \ Data \ Park \ Water \ Rivers.shp

और इसलिए सभी प्रकार के डेटा (सीमाएं, शाकाहारी कवर, सड़क, आदि) के लिए प्रत्येक अपने स्वयं के उप-फ़ोल्डर में।

मैं एक स्क्रिप्ट बनाना चाहता हूं कि जब भी मैं इनमें से किसी एक mxd को खोलूं तो मैं बार-बार चला सकता हूं जो कि कम से कम कुछ सामान्य परतों की मरम्मत करता है जो कि मेरे mxd में से अधिकांश में पाई जाती हैं, और फिर मैं मैन्युअल रूप से बाकी की मरम्मत कर सकता हूं। इस तरह मैं कम से कम खुद को कुछ समय बचा सकता हूं ।

मैं कुछ लाइनों का उपयोग कर रहा हूं:

import arcpy
mxd = arcpy.mapping.MapDocument("CURRENT")

for lyr in arcpy.mapping.ListLayers(mxd):
    if lyr == "Rivers": #Should this be the layner name in TOC or FC name?
        lyr.replaceDataSource(r"C:\Data\Park\Water", "SHAPEFILE_WORKSPACE", "Rivers")

फिर विचार यह होगा कि किसी भी तरह से अन्य "परतों" लिपियों को अन्य सामान्य परतों में जोड़ा जाए जो कि मेरे mxd में हैं।

हालाँकि उपरोक्त लिपि भी नदियों की परत को ठीक नहीं करती है।

मैं इसे काम करने के लिए कैसे प्राप्त कर सकता हूं, और मरम्मत के लिए अन्य परतों में भी जोड़ सकता हूं जिनके पास अलग-अलग फ़ाइल पथ हैं?

जवाबों:


14

आप अपनी स्क्रिप्ट के साथ सही रास्ते पर हैं। यह कैसे आप तुलना कर रहे हैं में अपनी समस्या झूठ की तरह दिखता है Layer, वस्तु के नाम की Layerमें विषय-सूची

जब आप ListLayers फ़ंक्शन का उपयोग करते हैं, तो जो लौटाया जाता है वह एक Layerऑब्जेक्ट है। फिर आप इसकी तुलना यह text stringदेखने के लिए नहीं कर सकते हैं कि यदि वे समान हैं, तो आपको इसके बजाय नाम का उपयोग करने की आवश्यकता है Layer

import arcpy
mxd = arcpy.mapping.MapDocument("CURRENT")

for lyr in arcpy.mapping.ListLayers(mxd):
    if lyr.name.lower() == "rivers": #This should be the Layer name in the TOC?
        lyr.replaceDataSource(r"C:\Data\Park\Water", "SHAPEFILE_WORKSPACE", "Rivers")

अधिक चयनकर्ताओं को जोड़ने के लिए, आप if/thenविभिन्न परत नामों की तलाश के लिए कोड के हिस्से का विस्तार करते हैं ।

for lyr in arcpy.mapping.ListLayers(mxd):
    if lyr.name.lower() == "rivers": #This should be the Layer name in the TOC?
        lyr.replaceDataSource(r"C:\Data\Park\Water", "SHAPEFILE_WORKSPACE", "Rivers")
    elif lyr.name.lower() == "streets":
        lyr.replaceDataSource(r"C:\Data\Facilities\Streets", "SHAPEFILE WORKSPACE", "Streets")

बस nameअपने में किसी विशेष अद्वितीय परत को खोजने के लिए चयनकर्ता को संशोधित करना जारी रखें .mxd, और replaceDataSourceइसे संभालने के लिए एक फ़ंक्शन जोड़ें । कृपया ध्यान दें कि मैंने lowerनाम के लिए परीक्षण करते समय फ़ंक्शन का उपयोग किया था । इसका उपयोग ईएसआरआई द्वारा उनके सहायता दस्तावेजों में भी किया जाता है, इस तर्क के साथ कि यह पूंजीकरण में विसंगतियों की संभावना को दूर करता है, जिससे परत नाम में एक बेमेल हो जाता है।

यहां आर्करी मैपिंग के साथ डेटा सोर्स को अपडेट और फिक्स करने पर ESRI हेल्प का लेख है

सामान्य रूप से आर्कजीआईएस के लिए मदद फाइलें बहुत उपयोगी हैं क्योंकि उनमें स्पष्ट स्पष्टीकरण हैं, और बहुत सारे पायथन कोड नमूने हैं जिन्हें आप बस कॉपी / पेस्ट कर सकते हैं और अपनी विशिष्ट आवश्यकताओं के अनुरूप संशोधित कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.