ArcGIS ModelBuilder'da Değerleri Topla çıkışından veri dışa aktarılıyor mu?


11

Şu anda ModelBuilder ile oynuyorum. Şu anda sahip olduğum modelin bir resmini ekledim.

Bu model şu anda 6 şekil dosyasını yineliyor, bu nedenle 'çıktı değerlerinin' her biri bir listede 6 şekil içeriyor. Bu listelerden değerleri bir tablo / metin dosyası veya benzeri içine ayıklamak için bir yol bulamıyorum.

Bunu yapmanın bir yolu var mı?

model

Modeli çalıştırdıktan sonra 'çıktı değerlerini' açtığımda gösterilen şey şu: resim açıklamasını buraya girin

Bu 6 rakamı bir şekilde almak istiyorum ...


Bu temelde burada sorduğunuz şeyle aynı mı? gis.stackexchange.com/questions/25922/… Değerleri toplamak tam da bunu yapar. Yardımı okursanız, yardımın başka bir araca aktarılabilecek değerleri topladığını söyleyecektir. Değerlerle ne yapmaya çalışıyorsunuz? Sadece bir dosyaya mı kaydediyor yoksa daha fazla işlem için mi ihtiyacınız var?
TheJones

Sadece bir dosyaya kaydetmek istiyorum. Çıktı değerlerini model oluşturucuda çıkarmak için bir araç bulamıyorum.
JPD

Yanıtlar:


17

Bunu, Hesaplama Değeri (Veri Yönetimi) aracını ve bazı Python sihirini kullanarak yapabilirsiniz. Bu ilgili soruya da bakın: Arcgis model oluşturucuya rastgele kod eklensin mi?

Çok değerli bir değişken yalnızca noktalı virgülle sınırlanmış bir değer dizesidir, bu nedenle multivaluesToCsvaşağıdaki işlev, çok değerli değişkenleri listelere böler ve bunları daha sonra bir CSV (virgülle ayrılmış değer) metin dosyasına yazılan satırlara dönüştürür .

Model yineleyiciler , modeldeki TÜM süreçleri bir yineleme başına bir kez çalıştırır - bu, sonunda bir kez çalıştırmak istediğimiz Değeri Hesapla aracımız için istenmeyen bir durumdur. Bunu başarmanın yolu, orijinal iç modeli sarmak için başka bir dış model oluşturmaktır. Bu, bir modeli model içine entegre etme yardım başlığı altında ele alınmıştır .

İşte bu işi yapmak için yapmanız gerekenler:

İç Model - Unsur sınıflarını yineler, işler, değerleri toplar:

  1. "İç" modelimiz olacak orijinal modelinizde, Namemesafe istatistik değerlerini karşılık gelen özellik sınıfı adlarıyla eşleştirebilmemiz için değişkenin değerlerini toplamak üzere başka bir Değerleri Topla aracını ekleyin .
  2. Giriş ve çıkış değişkenlerini model parametreleri olarak ortaya çıkarın (bir ovali sağ tıklayın ve Model Parametresini kontrol edin). Bunu, Değer Çalışma araçlarının her bir çıktısının yanı sıra Giriş Çalışma Alanı gibi ihtiyacınız olan giriş parametreleri için yapın.
  3. İç modeli kaydedin ve kapatın.

Dış Model - İç modeli çalıştırır, iç model tamamlandığında Değer Hesaplama aracını yalnızca bir kez çalıştırır:

  1. Yeni bir model oluşturun - bu bizim "dış" modelimiz olacaktır.
  2. Çıktı CSV dosyasının nerede oluşturulacağını Folderbelirtmenize izin vermek için bir tür değişkeni ekleyin .
  3. Çıktı CSV dosyasının adınıString belirtmenize izin vermek için bir tür değişkeni ekleyin .
  4. İç Modeli yeni modele ekleyin (ArcToolbox'tan sürükleyip bırakın veya sağ tıklayıp Veri veya Araç Ekle'ye tıklayın, iç modele göz atın ve Ekle'ye tıklayın)
  5. Girdi Çalışma Alanı gibi dış modelden ayarlamak istediğiniz iç modelin herhangi bir parametresi için değişkenler oluşturun (iç modeli sağ tıklatın ve Değişken-Parametre Yap'ı seçin).
  6. Değeri Hesapla aracını yeni modele ekleme
  7. Aşağıdakileri Değer Hesapla aracının ilgili kutularına yapıştırın:

    İfade :

    multivaluesToCsv(r"%Output CSV File Location%", "%Output CSV File Name%", "%Feature Class Names%", "%Minimum Distance Values%", "%Average Distance Values%", "%Maximum Distance Values%")
    • Bu , model değişkenlerini işleve iletmek için satır içi değişken ikamesi kullanır . Model değişken adlarınızla eşleşecek şekilde ayarlayın.
    • rÖnce "%Output CSV File Location%"anlamlıdır: bu bir olduğunu gösterir ham dize ; Windows dosya sistemi yolları genellikle ters eğik çizgiler ( Python'da bir kaçış karakteri ) içerdiğinden , Python'un ters eğik çizgileri ve sonraki karakterleri özel karakter dizileri olarak yanlış yorumlamasını önlemek için bunu kullanmalıyız.
    • Satır içi değişkenlerin etrafına tırnak işareti koyduğunuzdan emin olun çünkü bunlar olmadan Python, dizeler yerine tanımlayıcı olduklarını düşünür.

    Kod Bloğu:

    import os, csv
    
    def multivaluesToCsv(csvfilepath, csvfilename, fcnames, minvalues, avgvalues, maxvalues):
        ext = 'csv' # Define output file extension (e.g. csv or txt)
        header = ['FC', 'MIN', 'AVG', 'MAX'] # Define header row (column names)
    
        # Join CSV file path and name, adding extension if necessary
        csvfile = os.path.join(csvfilepath, os.extsep.join((csvfilename, ext)) if not os.path.splitext(csvfilename)[1].lower().endswith(ext) else csvfilename)
    
        # Open text file for writing
        with open(csvfile, 'wb') as f:
            w = csv.writer(f)
            w.writerow(header) # Write header row
            rows = zip(*map(lambda x: x.split(';'), [fcnames, minvalues, avgvalues, maxvalues])) # Transpose the semicolon-delimited values into rows
            w.writerows(rows)
        return csvfile
  8. (İsteğe bağlı) Modelin araç iletişim kutusundan çalıştırabilmek veya diğer modellerle / komut dosyalarıyla birlikte zincirlemek istiyorsanız giriş ve çıkış değişkenlerini model parametreleri olarak gösterin. Dış modelin tek çıktısı CSV dosyasıdır.

  9. (İsteğe bağlı) Giriş değişkenlerini ve iç model çıkışlarını Ön Değer olarak Değeri Hesapla aracına bağlayın. Bunun aslında herhangi bir etkisi olduğunu düşünmüyorum, sadece neler olup bittiğini görsel olarak daha net hale getiriyor.

Bunu ModelBuilder ile test ettim ve çalışmasını sağladım (ekran görüntülerine bakın).

İç Model : İç Model

Dış Modeli: Dış Modeli

İç model tüm işlemlerini özellik sınıfı başına bir kez çalıştırır ve daha sonra CSV dosyasını bir kez ve yalnızca bir kez çıkarmak için Değeri Hesapla aracı sonunda bir kez çalışır.


Merhaba, cevabınız için çok çaba harcadığınız ve geç cevap verdiğim için özür dileriz. Modeli tanımladığınız gibi çalıştırmaya çalışıyorum, ama CSV ile sorun yaşıyorum. Excel'de boş bir CSV dosyası oluşturdum ve kaydettim, sonra modele yükledim. HATA 000539: İfade çalıştırılırken hata oluştu: multivaluesToCsv (r "% CSV Dosyası%", "% FC Ad Değerleri%", "% Minimum Değerler%", "% Ortalama Değerler%", "% Maksimum Değerler%") <type 'istisnaları .IOError '>: [Errno 13] İzin verilmedi: u'% CSV File% 'Yürütülemedi (Değeri Hesapla). Bu hatayı almaya devam ediyorum. CSV'mi CSVFile.csv olarak adlandırıyorum.
JPD

1
Sadece düzelttim - bu mükemmel bir çözüm. Yardımın için çok teşekkürler!
JPD

Python kodu sizin için CSV dosyasını oluşturacaktır, önceden oluşturmanıza gerek yoktur. Gördüğünüz gibi, dosyayı Excel'de açarsanız, bu dosyayı kilitler ve siz kapatana kadar Python tarafından yazılamaz.
blah238

2
Bilgilerin birden çok kez çalışmasını önlemek ve metin dosyasının önceden var olması gereken sorunu düzeltmek için iç içe modelleri kullanmak için talimatları ve ekran görüntülerini güncelledim (şimdi çıktı konumunu ve dosya adını iki ayrı parametre olarak belirtiyorsunuz).
blah238

Mükemmel cevap! Geostatistic Layer Cross Validation istatistiklerini bir csv dosyasına göndererek benzer bir sorunu çözmeme yardımcı oldu. Teşekkürler @ blah238!
Cotton.Rockwood

1

Modelinizin açıkladığı çıktı, öznitelik tablosunda güncellenen bir değer değil mi? Güncel Shapefile ile ilişkili .dbf dosyasını açamazsınız?

Bu başarısız olursa, Tablo Seçimi (Analiz Araçları> Ayıkla) bir SQL sorgusu ile çalışmalıdır.


Merhaba, Cevabınız için teşekkürler. Korkarım her şekil dosyasının .dbf dosyasını güncellemez. Model oluşturucusuna 'Tablo Seçimi' eklemek de çalışmaz, çünkü 'Minimum / Ortalama / Maksimum Mesafe' veya 'Çıktı Değerleri'ni araç için bir giriş olarak bağlayamıyorum.
JPD
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.