ArcPy kullanarak birden fazla MXD'deki veri kaynakları onarılıyor mu?


14

Ben geçmekte olan ve elle sıfırlama tüm kırık katmanları ile yaklaşık 50 mxd var.

Veriler başka bir bilgisayardan taşındı ve klasör yapısı değiştirildi, böylece sadece basit bir değişim süreci değil (örnek):

"F: \ Data \ Rivers.shp" - "C: \ Data \ Rivers.shp"

daha çok benzer:

"F: \ Data \ Rivers.shp" - C: \ Data \ Park \ Water \ Rivers.shp

vb. her biri kendi alt klasöründeki her türlü veri (sınırlar, sebze örtüsü, yollar vb.) için.

En azından benim mxd'lerin çoğunda bulunan daha yaygın katmanlardan bazılarını onaracak olan bu mxd'lerden birini açtığımda tekrar tekrar çalıştırabileceğim bir komut dosyası yapmak istiyorum ve sonra geri kalanını el ile onarabilirim. Bu şekilde en azından kendimi biraz zamandan kurtarabilirim .

Ben çizgileri boyunca bir şey kullanıyorum:

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")

Bu durumda fikir, mxd'mdeki diğer ortak katmanlar için bir şekilde birden fazla "replace" betiği eklemek olacaktır.

Ancak yukarıdaki komut dosyası Rivers katmanını bile düzeltmez.

Nasıl çalışmasını ve farklı dosya yollarına sahip onarılması gereken diğer katmanları nasıl ekleyebilirim?

Yanıtlar:


14

Senaryonuzla doğru yoldasınız. Bu farkların istatistiksel nasıl senin sorunun yalanlar benziyor Layeriçin, nesneyi Adı arasında Layeryer İçindekiler .

ListLayers işlevini kullandığınızda , döndürülen bir Layernesnedir. Daha sonra text stringeşit olup olmadığını görmek için bunu a ile karşılaştıramazsınız , bunun yerine Adına erişmeniz gerekir 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")

Daha fazla seçici eklemek için if/then, kodun farklı katman adlarını aramak üzere bölümünü genişletmeniz yeterlidir .

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")

İçinizdeki nameherhangi bir benzersiz katmanı bulmak için seçiciyi değiştirmeye devam edin .mxdve replaceDataSourceonu işlemek için bir işlev ekleyin . lowerAdı test ederken işlevi kullandığımı lütfen unutmayın . Bu, ESRI tarafından yardım belgelerinde de kullanılır; bunun nedeni, büyük olasılıkla büyük harf kullanımındaki tutarsızlık olasılığını ortadan kaldırmasıdır ve katman adında bir uyumsuzluğa neden olur.

Arcpy Mapping ile Veri Kaynaklarını Güncelleme ve Düzeltme ile ilgili ESRI Yardım makalesi

ArcGIS için Yardım dosyaları, açık açıklamalar ve özel gereksinimlerinize uyacak şekilde kopyalayıp yapıştırabileceğiniz ve değiştirebileceğiniz birçok Python kod örneği içerdiğinden çok yararlıdır .

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.