Melakukan beberapa perhitungan di Tabel Atribut ArcGIS?


8

Saya memiliki spreadsheet Excel yang ada dikembangkan untuk melacak data hidran spesifik, ini diperbarui secara berkala dan bergabung dengan data hidran spasial di ArcGIS. Di spreadsheet ada sejumlah kolom untuk memasukkan data yang terkait dengan Tekanan Statis, Tekanan Sisa, dan Laju Alir.

masukkan deskripsi gambar di sini

Memanfaatkan Kapasitas Nilai pada 20 PSI dalam rumus Tes Aliran Api untuk menghitung aliran api, spreadsheet secara otomatis menghitung. Perhitungannya adalah sebagai berikut.

Fire Flow = Flow * ((Static - 20)/(Static - Residual))^0.54

Saya tidak yakin cara terbaik untuk menyerang ini dan saya sedang mencari saran. Berdasarkan hasil perhitungan, saya memiliki kolom tambahan dengan pernyataan IF yang menunjukkan warna aliran api yang sesuai dengan hydrant yang harus dicat. Bagi yang tidak tahu, warna hidran adalah indikator untuk memadamkan personil dalam keadaan darurat kondisi aliran api. Saya telah melakukan penelitian dan mengembangkan skrip python berikut:

def Reclass !Bon_Color!:
     if ( !Fire_Flow! <= 0):
       return Black
     elif ( !Fire_Flow! >= 1 and !Fire_Flow! <= 499):
       return  Red
     elif ([Fire_Flow] > 499 and [Fire_Flow] <= 999):
       return Orange
     elif ( !Fire_Flow! > 999 and !Fire_Flow! <= 1499):
         return Green
     elif ( !Fire_Flow! > 1499):
         return Blue
  end if

Saya ingin tahu apakah perhitungan yang disebutkan di atas, yang digunakan dalam lembar kerja Excel dapat direplikasi dalam tabel atribut database menggunakan kalkulator bidang dan pengurai python? Daripada mengandalkan spreadsheet Excel dan kebutuhan untuk bergabung kembali dengan data.


5
Mereka bisa, tetapi ini lebih merupakan pertanyaan SQL daripada pertanyaan GIS.
Dan C

Mereka bagian kedua dapat dilakukan melalui Field Calculator, saya hanya perlu mendapatkan Python Coding dengan benar.
LandArch

Jika ini adalah pertanyaan tentang ArcGIS Field Calculator dan Python Parser-nya maka saya pikir Anda harus mengeditnya untuk memperjelas dan menghindarinya karena terlalu luas (dengan mengajukan dua pertanyaan).
PolyGeo

Saya pikir Anda akan memiliki waktu yang lebih mudah dengan ini jika Anda melakukannya di bagian belakang, di SQL db yang menyimpan fitur. Anda dapat mengatur kueri pembaruan untuk dijalankan setiap hari atau seberapa sering untuk menghitung nilai-nilai ini dan Anda tidak perlu memikirkannya lagi. Anda juga dapat membuatnya sebagai 'kolom terkomputasi', yang secara otomatis akan diisi dengan nilai yang benar saat Anda mengedit lapisan. Bicaralah dengan admin db Anda.
Dan C

@Dan CI tidak setuju dengan Anda. Sayangnya kami tidak memiliki administrator basis data. Saya kira saya adalah dia. Saya menemukan cukup untuk mengatur PostgreSQL sehingga kita bisa menggunakan data di lapangan di Aplikasi Kolektor ARCGIS pada tablet. Saya berpikir bahwa Python dan bidang kalkulator mungkin menjadi pilihan saya yang lebih baik hanya sehingga saya belajar sesuatu yang dapat saya gunakan nanti.
LandArch

Jawaban:


4

Kode python Anda masuk akal tetapi memiliki beberapa kesalahan. Rekatkan ini ke kotak "Kode skrip pra-logika" di bidang kalkulator:

def Reclass (fire_flow):
     if (fire_flow <= 0):
       return "Black"
     elif (fire_flow >= 1 and fire_flow <= 499):
       return "Red"
     elif (fire_flow > 499 and fire_flow <= 999):
       return "Orange"
     elif (fire_flow > 999 and fire_flow <= 1499):
       return "Green"
     elif (fire_flow > 1499):
       return "Blue"

Kemudian pada kotak di bawahnya, tempel:

Reclass (!Fire_Flow!)

Lekukan di blok atas itu agak tidak biasa, tetapi jumlah lekukan yang tepat tidak masalah selama garis-garis tersebut diindentasi dengan benar relatif satu sama lain.

Kesalahan:

def Reclass !Bon_Color!:

Saat Anda mendefinisikan suatu fungsi, Anda harus mengikutinya dengan daftar parameter yang digunakan fungsi untuk melakukan fungsinya. Daftarnya harus dalam tanda kurung. Dalam kasus Anda, Anda hanya menggunakan satu parameter input, nomor Fire_Flow Anda.

if ( !Fire_Flow! <= 0):
   return Black

Anda akan masuk !Fire_Flow!ke dalam fungsi, begitu Anda berada di fungsi yang nilainya ditugaskan ke variabel fire_flow, jadi rujuk ke variabel itu sebagai gantinya. Juga, Anda perlu memasukkan Blacktanda kutip, sehingga string dikembalikan. Cara Anda memilikinya di sini, skrip Anda mencari variabel bernama Blackuntuk kembali, dan tidak ada.

end if

Anda tidak perlu mengakhiri jika dengan Python.

Untuk bidang pertama Anda, angka aliran api, Anda harus memberi nama bidang Anda dengan tepat dan operator untuk eksponen dalam Python adalah **, bukan ^.paste ini ke kotak bawah di kalkulator bidang:

!Fire_Flow! = !Flow! * ((!Static! - 20)/(!Static! - !Residual!))**0.54

Jika Anda perlu memperbarui lebih dari satu bidang secara bersamaan, saya setuju dengan MacroZED bahwa kursor pembaruan adalah cara yang lebih baik, tetapi itu bisa sedikit membingungkan jika Anda baru menggunakan Python.


Terima kasih, ini berhasil menghitung warna kap mesin, apakah ada pemikiran untuk menghitung bagian lain dari if?
LandArch

@ LandArch Maaf, saya pikir pertanyaannya mengatakan bahwa bagian itu sudah diurus. Saya akan menambahkannya.
Dan C

2

Ini bisa dilakukan di ArcGIS tanpa harus di excel. Jika bidang ini (Tekanan Statis, Tekanan Sisa, dan Laju Alir) sudah ada dalam dataset, maka kita bisa menggunakan kursor berikut untuk menambahkan bidang baru dan memperbaruinya:

import arcpy

ds = r"path/to/dataset"    

with arcpy.da.UpdateCursor(ds, ["Fire_Flow", "Colour"]) as ucursor:
    with arcpy.da.SearchCursor(ds, ["Static", "Residual", "Flow", "Fire_Flow"]) as scursor:
        for urow in ucursor:
             for srow in scursor:
                 urow[0] = "{}" * (("{}"-20)/("{}"-"{}"))**0.54.format(srow[2], srow[0], srow[0], srow[1])
                 ucursor.updateRow(urow)
                 if srow[3] <= 0:
                     urow[1] = "Black"
                     if srow[3] >= 1 and srow[3] <= 499:
                         urow[1] = "Red"
                         if srow[3] > 499 and srow[3] <= 999:
                             urow[1] = "Orange"
                             if srow[3] > 999 and srow[3] <= 1499:
                                 urow[1] = "Green"
                                 if srow[3] > 1499:
                                     urow[1] = "Blue"
                                     ucursor.updateRow(urow)

Saya tidak ingin menambahkan kolom, saya hanya ingin memperbarui kemudian ketika pengujian Static, Residual, dan Flow dilakukan dan angka ditambahkan.
LandArch

tidak masalah, Anda bisa menghapusnya. sakit mengedit skrip untuk mencerminkan ini. Skrip harus dijalankan ulang setiap kali nilai Statis, Sisa atau Aliran berubah. Tetapi metode ini akan lebih cepat daripada Menghitung bidang.
MacroZED

Saya mendapatkan kesalahan berikut, apakah [#] harus diubah karena tidak baris 1 hingga 3 di tabel atribut? Runtime error Traceback (panggilan terakhir terakhir): File "<string>", baris 5, dalam <module> RuntimeError: tidak dapat membuka 'path / to / dataset'
LandArch

Tidak, kesalahannya adalah karena Anda belum menentukan dataset. Variabel "ds" perlu diubah ke dataset aktual Anda.
MacroZED

Maaf untuk memegang tangan, saya harus memasukkan jalur fisik, misalnya C: / ....
LandArch
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.