Mengekspor data dari output Collect Values ​​di ArcGIS ModelBuilder?

11

Saya sedang bermain dengan ModelBuilder. Saya telah menambahkan gambar model yang saya miliki saat ini.

Model ini saat ini mengulangi 6 shapefile, sehingga masing-masing 'nilai output' berisi 6 angka dalam daftar. Saya tidak dapat menemukan cara untuk mengekstrak nilai dari daftar ini ke dalam file tabel / teks atau sejenisnya.

Apakah ada cara untuk melakukan ini?

model

Inilah yang ditampilkan ketika saya membuka 'nilai output' setelah menjalankan model: masukkan deskripsi gambar di sini

Saya hanya ingin meraih 6 angka itu entah bagaimana ...

JPD
sumber
Ini pada dasarnya hal yang sama yang Anda tanyakan di sini benar? gis.stackexchange.com/questions/25922/... Kumpulkan nilai tidak hanya itu. Jika Anda membaca bantuan itu akan memberi tahu Anda bahwa ia mengumpulkan nilai-nilai yang dapat diteruskan ke alat lain. Jadi apa yang Anda coba lakukan dengan nilai-nilai itu? Apakah hanya mencatatnya ke file atau Anda membutuhkannya untuk diproses lebih lanjut?
theJones
Saya hanya ingin mencatatnya di file. Saya tidak dapat menemukan alat untuk memasukkan nilai output ke dalam pembuat model untuk mengekstraknya.
JPD

Jawaban:

17

Anda dapat melakukan ini menggunakan alat Hitung Nilai (Manajemen Data) dan beberapa sihir Python. Lihat juga pertanyaan terkait ini: Tambahkan kode arbitrer ke pembuat model Arcgis?

Sebuah variabel multivalue hanya string koma-delimited nilai-nilai, jadi apa yang multivaluesToCsvfungsi di bawah ini dilakukan adalah membagi variabel multivalue ke dalam daftar dan transpos mereka ke dalam baris yang kemudian ditulis ke CSV (comma-terpisah nilai) file teks.

Model iterator menjalankan SEMUA proses dalam model sekali per iterasi - ini tidak diinginkan untuk alat Nilai Hitung kami, yang kami hanya ingin menjalankan sekali di akhir. Cara Anda mencapainya adalah dengan menciptakan model luar lain untuk membungkus model dalam asli. Ini dibahas dalam topik bantuan Mengintegrasikan model dalam model .

Jadi, inilah yang perlu Anda lakukan agar ini berfungsi:

Inner Model - Iterate kelas fitur, proses, dan kumpulkan nilai:

  1. Dalam model asli Anda, yang akan menjadi model "dalam" kami, tambahkan alat Kumpulkan Nilai lain untuk mengumpulkan nilai Name-nilai variabel sehingga kami dapat memetakan nilai statistik jarak ke nama kelas fitur yang sesuai.
  2. Paparkan variabel input dan output sebagai parameter model (klik kanan oval dan periksa Parameter Model). Lakukan ini untuk setiap output dari alat Kumpulkan Nilai serta parameter input apa pun yang Anda perlukan seperti Input Workspace.
  3. Simpan dan tutup model bagian dalam.

Model Luar - Menjalankan model dalam, menjalankan alat Hitung Nilai hanya sekali ketika model dalam selesai:

  1. Buat model baru - ini akan menjadi model "luar" kami.
  2. Tambahkan variabel tipe Folderuntuk memungkinkan Anda menentukan di mana membuat file CSV output.
  3. Tambahkan variabel tipe Stringuntuk memungkinkan Anda menentukan nama file CSV output.
  4. Tambahkan Inner Model ke model baru (seret dan lepas dari ArcToolbox atau klik kanan dan Tambah Data atau Alat, telusuri model bagian dalam dan klik Tambah)
  5. Buat variabel untuk setiap parameter model dalam yang Anda ingin dapat atur dari model luar, seperti Input Workspace (klik kanan model bagian dalam dan pilih Make Variable-From Parameter).
  6. Tambahkan alat Hitung Nilai ke model baru
  7. Rekatkan yang berikut ini ke kotak yang sesuai pada alat Calculate Value:

    Ekspresi :

    multivaluesToCsv(r"%Output CSV File Location%", "%Output CSV File Name%", "%Feature Class Names%", "%Minimum Distance Values%", "%Average Distance Values%", "%Maximum Distance Values%")
    • Ini menggunakan substitusi variabel in-line untuk meneruskan variabel model ke dalam fungsi. Sesuaikan agar sesuai dengan nama variabel model Anda.
    • The rsebelum "%Output CSV File Location%"signifikan: ini menunjukkan bahwa ini adalah string mentah ; karena jalur sistem file Windows biasanya berisi backslash ( karakter pelarian dengan Python), kita harus menggunakan ini untuk mencegah Python dari salah mengartikan backslash dan karakter berikutnya sebagai urutan karakter khusus.
    • Pastikan untuk menempatkan tanda kutip di sekitar variabel in-line karena tanpa mereka Python akan berpikir mereka adalah pengidentifikasi, bukan string.

    Blok Kode:

    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. (Opsional) Ekspos variabel input dan output sebagai parameter model jika Anda ingin dapat menjalankannya dari dialog alat model atau rantai bersama dengan model / skrip lain. Output tunggal dari model luar adalah file CSV.

  9. (Opsional) Hubungkan variabel input dan output model dalam ke alat Calculate Value sebagai prasyarat. Saya tidak berpikir ini sebenarnya memiliki efek apa pun, hanya membuatnya lebih jelas secara visual tentang apa yang terjadi.

Saya telah menguji ini dengan ModelBuilder dan membuatnya berfungsi (lihat screenshot).

Model batin : Model dalam

Model Luar: Model Luar

Model dalam menjalankan semua prosesnya sekali per kelas fitur, dan kemudian alat Hitung Nilai berjalan sekali di akhir untuk menghasilkan file CSV sekali dan hanya sekali.

blah238
sumber
Halo, terima kasih telah berupaya keras untuk membalas dan meminta maaf atas jawaban saya yang terlambat. Saya mencoba menjalankan model seperti yang telah Anda jelaskan, tetapi saya mengalami masalah dengan CSV. Saya telah membuat file CSV kosong di Excel dan menyimpannya, lalu memuatnya ke dalam model. GALAT 000539: Ekspresi galat yang berjalan: multivaluesToCsv (r "% File CSV%", "% Nilai Nama FC%", "% Nilai Minimum%", "% Nilai Rata-rata%", "% Nilai Maksimum%", "% Nilai Maksimum%") pengecualian <type ' .IOError '>: [Errno 13] Izin ditolak: u'% File CSV% 'Gagal dieksekusi (Hitung Nilai). Saya terus mendapatkan kesalahan ini. CSV saya disebut CSVFile.csv.
JPD
1
Hanya memperbaikinya - ini adalah solusi sempurna. Terima kasih banyak atas bantuan Anda!
JPD
Kode Python akan membuat file CSV untuk Anda, tidak perlu membuatnya sebelumnya. Seperti yang Anda lihat, jika Anda membuka file di Excel, itu mengunci file dan tidak dapat ditulis oleh Python sampai Anda menutupnya.
blah238
2
FYI Saya telah memperbarui instruksi dan tangkapan layar untuk menggunakan model bersarang untuk menghindari Menghitung Nilai yang berjalan beberapa kali serta memperbaiki masalah di mana file teks harus ada sebelumnya (Anda sekarang menentukan lokasi output dan nama file sebagai dua parameter terpisah).
blah238
Jawaban yang sangat bagus! Membantu saya untuk memecahkan masalah yang sama dengan mengeluarkan statistik Validasi Lapisan Geostatistik ke file csv. Terima kasih @ blah238!
Cotton.Rockwood
1

Output yang dijelaskan oleh model Anda hanyalah sebuah nilai yang diperbarui di tabel atribut bukan? Bisakah Anda tidak hanya membuka file .dbf yang terkait dengan shapefile yang diperbarui?

Gagal ini, Pilih Tabel (Alat Analisis> Ekstrak) harus bekerja dengan query SQL.

veedub
sumber
Halo, terima kasih atas balasan Anda. Saya khawatir itu tidak memperbarui file .dbf dari masing-masing shapefile. Menambahkan 'Table Select' ke pembuat model tidak berfungsi, karena saya tidak dapat menghubungkan 'Minimum / Rata-rata / Jarak Maksimum' atau 'Nilai Output' sebagai input untuk alat ini.
JPD