Skrip python yang berjalan di dalam ArcMap vs yang berjalan di luar?


10

Saya baru mulai masuk ke scripting Python untuk bekerja.

Saat ini saya sedang membuat skrip untuk mengotomatisasi proses.

Pada dasarnya, ia meminta pengguna nama klien, mendapatkan proyeksi jika tersedia, membuat direktori pada drive C: untuk klien, membuat file geodatabase khusus untuk klien, membuat dataset yang diperlukan, dan membuat kelas fitur khusus untuk data klien. Akhirnya, itu juga akan menambahkan bidang yang diperlukan untuk setiap kelas fitur dan mungkin beberapa hal lainnya.

Saya mulai ini tidak benar-benar mengetahui etika yang tepat dari skrip Python untuk ArcMap. Tapi apa yang saya buat sejauh ini hanya akan berjalan di luar ArcMap, saya percaya.

Apakah ini dapat diterima?

Alih-alih mendapatkan input pengguna melalui arcpy.getparamaterastext (), yang baru saja saya ketahui, saya menggunakan raw_input ().

Apakah ini baik?

Ini berhasil, saya tidak yakin apakah ini cara yang tepat untuk melakukan scripting.

Inilah kode yang saya miliki sejauh ini.

import sys
import arcpy
import os

#Records name of the client
client = raw_input("Enter the name of the client: (letters and underscores only) \n")

#Records filepath of client to be created
clientpath = "C:/" + client

#Inquires if projection file exists
projection = raw_input("Is there a .prj or .shp available with correct projection? Y or N \n")

#Records the projection location if available
if projection.upper() == "Y":
    spatialr = raw_input("Drag the .prj or .shp here to record the filepath \n")
    nspatialr = spatialr.replace('"', "")
elif projection.upper() == "N":
    alert = raw_input("You must add the spatial reference manually, hit enter to continue. \n")
elif projection.upper() != "N" or "Y":
    exit = raw_input("That is not a valid response. Try again. \n")
    sys.exit()

#Checks if client folder exists; if not, creates one
if not os.path.exists(clientpath):
    os.makedirs(clientpath)

#Variable for file geodatabase location
FGBpath = clientpath + "/" + client + ".gdb"

#Checks if client file geodatabase exists; if not, creates one
if not arcpy.Exists(FGBpath):
    arcpy.CreateFileGDB_management(clientpath, client)

#Variable for dataset location
FDatasetpath = clientpath + "/" + client + ".gdb" + "/Network"

#Checks if dataset exists; if not, creates one
if not arcpy.Exists(FDatasetpath):
    if projection.upper() == "Y":
        arcpy.CreateFeatureDataset_management(FGBpath, "Network", nspatialr)
    elif projection.upper() == "N":
        arcpy.CreateFeatureDataset_management(FGBpath, "Network")

#Variable for cable feature class location
FCcablepath = clientpath + "/" + client + ".gdb" + "/Network" + "/cable"

#Checks if cable feature class exists; if not, creates one
if not arcpy.Exists(FCcablepath):
    if projection.upper() == "Y":
        arcpy.CreateFeatureclass_management (FDatasetpath, "cable", "POLYLINE", "", "", "", nspatialr)
    elif projection.upper() == "N":
        arcpy.CreateFeatureclass_management (FDatasetpath, "cable", "POLYLINE")

#Variable for splice point feature class location
FCsplicepath = clientpath + "/" + client + ".gdb" + "/Network" + "/splice_point"

#Checks if splice point feature class exists; if not, creates one
if not arcpy.Exists(FCsplicepath):
    if projection == 'Y' or projection == 'y':
        arcpy.CreateFeatureclass_management (FDatasetpath, "splice_point", "POINT", "", "", "", nspatialr)
    elif projection == 'N' or projection == 'n':
        arcpy.CreateFeatureclass_management (FDatasetpath, "splice_point", "POINT")

exit = raw_input("\n\n File geodatabase, dataset, and the cable \n and splice point feature classes successfully created. \n\n Hit enter to exit.")

Saya masih memiliki beberapa pekerjaan yang harus dilakukan, seperti menambahkan bidang yang diperlukan.

Jawaban:


18

Bagaimana Anda mendapatkan input Anda tergantung 100% pada siapa pengguna akhir akan, tetapi Anda benar, Anda tidak akan dapat menggunakan raw_input di ArcMap sama sekali. Jika Anda akan menjadi satu-satunya yang menggunakan skrip, tidak ada yang salah dengan mendapatkan input Anda melalui raw_input, atau jalur pengkodean keras sebagai variabel ke dalam skrip Anda. Namun, jika orang lain akan menggunakan skrip yang mungkin atau mungkin tidak memiliki pengalaman skrip, yang terbaik adalah menggunakan getParameterAsText () dan mengimplementasikan skrip Anda sebagai alat skrip di ArcMap. Membuat alat skrip akan memberikan pengguna antarmuka yang mirip dengan yang digunakan oleh sebagian besar alat ESRI (seperti alat standar seperti buffer, dll ...).

Satu hal yang perlu diperhatikan adalah cara Anda mendesain raw_inputs Anda menciptakan interaksi langkah demi langkah antara pengguna dan skrip. Jika ini dijalankan menggunakan getParameterAsText () di ArcMap, langkah demi langkah akan hilang, dan itu hanya akan menjadi serangkaian pengaturan yang diinput sebelum menjalankan skrip.

Salah satu tujuan utama untuk scripting adalah otomatisasi. Jika Anda akan menjalankan ini pada beberapa dataset, Anda harus memeriksa loop . Jika Anda sudah sejauh ini, Anda mungkin sudah membaca setidaknya, tetapi sebagai contoh bagaimana Anda bisa menggunakannya: katakan Anda memiliki beberapa set data yang Anda perlukan untuk melakukan operasi yang sama. Anda dapat menulis kode untuk proses yang perlu diselesaikan satu kali, kemudian menyertakan loop 'untuk' yang mengambil daftar kumpulan data dan melakukan operasi pada masing-masingnya.

Untuk hal-hal seperti referensi spasial, Anda bisa 'mencuri' referensi spasial dari shapefile yang ada menggunakan arcpy.Description () , atau Anda bisa mendapatkan input referensi spasial menggunakan getParameterAsText () (selama Anda menetapkan parameter sebagai input referensi spasial saat menyiapkan alat skrip). Menggunakan raw_input untuk mendapatkan nama path agak rumit.


4
+1, saya pasti akan beralih untuk mengambil parameter vs raw_input. Tidak banyak pengguna akhir yang ingin menggunakan antarmuka baris perintah vs GUI, terutama ketika mereka terbiasa dengan sesuatu seperti alat geoprosesing ArcGIS.
blah238

10

Selain saran bagus @ egdetti , Anda dapat sangat menyederhanakan skrip Anda dengan membuat beberapa asumsi alih-alih menulis logika if / else untuk setiap kondisi kecil.

Sebagai contoh:

  • Alih-alih memeriksa apakah setiap item ada sebelumnya, anggap saja hal itu terjadi dan timpa dengan pengaturan arcpy.env.overwriteOutput = True. Sekarang Anda mungkin memiliki beberapa alasan mengapa Anda perlu memeriksanya terlebih dahulu tetapi lebih sering tidak menimpa tidak masalah.

  • Alih-alih memeriksa apakah opsi referensi spasial diatur, dan memanggil perintah yang sama dua cara yang berbeda, cukup kirimkan variabel referensi spasial ke perintah sekali dan biarkan ia menangani string nol atau kosong (yang hanya akan baik-baik saja).

  • Gunakan os.path.joinuntuk bergabung dengan elemen jalur file alih-alih menggunakan penggabungan string, yang penuh dengan bahaya.

    Misalnya bukannya:

    FGBpath = clientpath + "/" + client + ".gdb"

    Menggunakan:

    FGBpath = os.path.join(clientpath, client + ".gdb")

Luar biasa! Hanya tip yang saya cari, terima kasih! Apakah Anda tahu jenis daftar apa pun yang menunjukkan fungsi / perpustakaan paling umum yang digunakan orang? Seperti os.path.join? Ada begitu banyak sehingga agak luar biasa. Saya akan memberi Anda +1 jika saya bisa. Mereka seharusnya mengizinkan saya untuk menjawab pertanyaan, hanya tidak mengundurkan diri!
ianbroad

2
Saya menganggap Anda sudah melalui tutorial resmi Python ? Ini memiliki bagian praktis ( 1 , 2 ) di perpustakaan standar. Sumber lain yang bagus adalah daftar Modul Minggu Ini dari Doug Hellmann: doughellmann.com/PyMOTW/contents.html
blah238

Juga, lebih baik dikalahkan daripada underwhelmed, kataku!
blah238

Yah, aku benci mengakuinya, tapi aku belum melalui tutorialnya. Aku agak melompat ke dalamnya. Saya mengambil kelas C ++ tahun yang lalu, jadi saya agak tahu dasar-dasarnya tapi saya harus benar-benar melihat tutorialnya. Saya selalu menjadi orang pertama yang suka menyelam di kepala. Terima kasih atas tautannya.
ianbroad

Anda mungkin juga menyukai diveintopython.net :)
blah238
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.