การซ่อมแหล่งข้อมูลใน MXD หลายเครื่องโดยใช้ ArcPy?


14

ฉันมีประมาณ 50 mxd ด้วยเลเยอร์ที่ชำรุดทั้งหมดที่ฉันได้ผ่านและรีเซ็ตด้วยตนเอง

ข้อมูลถูกย้ายจากคอมพิวเตอร์เครื่องอื่นและโครงสร้างของโฟลเดอร์เปลี่ยนไปดังนั้นจึงไม่ใช่เพียงแค่กระบวนการเปลี่ยนแปลงอย่างง่าย (ตัวอย่าง):

"F: \ Data \ Rivers.shp" ถึง "C: \ Data \ Rivers.shp"

มันเหมือน:

"F: \ Data \ Rivers.shp" ถึง C: \ Data \ Park \ Water \ Rivers.shp

และอื่น ๆ สำหรับข้อมูลทุกชนิด (ขอบเขตปก veg ถนน ฯลฯ ) แต่ละรายการในโฟลเดอร์ย่อยของตนเอง

ฉันต้องการสร้างสคริปต์ที่ฉันสามารถเรียกใช้ซ้ำ ๆ เมื่อใดก็ตามที่ฉันเปิดหนึ่งใน 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วัตถุ จากนั้นคุณไม่สามารถเปรียบเทียบสิ่งนี้กับ a 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 ในเอกสารความช่วยเหลือของพวกเขาด้วยเหตุผลที่เป็นไปได้ว่ามันจะลบโอกาสของความไม่สอดคล้องกันในการใช้อักษรตัวใหญ่ทำให้เกิดความไม่ตรงกันในชื่อเลเยอร์

นี่คือบทความช่วยเหลือของ ESRI ในการอัปเดตและแก้ไขแหล่งข้อมูลด้วย Arcpy Mapping

โดยทั่วไปไฟล์วิธีใช้สำหรับ ArcGIS นั้นมีประโยชน์มากเนื่องจากมีคำอธิบายที่ชัดเจนและตัวอย่างโค้ด Python จำนวนมากที่คุณสามารถคัดลอก / วางและแก้ไขเพื่อให้เหมาะกับความต้องการเฉพาะของคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.