ArcMap içinde çalışan Python komut dosyaları ile dışarıda çalışanlar mı?


10

Ben sadece iş için Python senaryosuna girmeye başladım.

Şu anda bir işlemi otomatikleştirmek için bir komut dosyası oluşturuyorum.

Temel olarak, kullanıcıya istemci adını sorar, varsa bir projeksiyon alır, istemci için C: sürücüsünde dizin oluşturur, istemciye özel dosya coğrafi veritabanı oluşturur, gerekli veri kümesini oluşturur ve istemci verilerine özel özellik sınıfları oluşturur. Sonunda, her özellik sınıfına ve muhtemelen başka şeylere gerekli alanları da ekleyecektir.

Bu gerçekten ArcMap için Python betik görgü kurallarını bilmeden başladım. Ama şimdiye kadar yarattığım şeyin sadece ArcMap dışında çalışacağını düşünüyorum.

Bu kabul edilebilir mi?

Az önce öğrendiğim arcpy.getparamaterastext () aracılığıyla kullanıcı girişi almak yerine raw_input () kullanıyorum.

Bu iyi mi?

İşe yarıyor, bunun komut dosyası yapmak için uygun bir yol olup olmadığından emin değilim.

İşte şimdiye kadar sahip olduğum kod.

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

Gerekli alanları eklemek gibi hala yapmam gereken işler var.

Yanıtlar:


18

Girdilerinizi nasıl alacağınız, son kullanıcının kim olacağına% 100 bağlıdır, ancak haklısınız, ArcMap'te raw_input'u kullanamayacaksınız. Komut dosyasını kullanan tek kişi olacaksanız, girişlerinizi raw_input veya sabit kodlama yollarını komut dosyanızda değişken olarak almakla ilgili yanlış bir şey yoktur. Başkasının veya herhangi bir komut dosyası deneyime sahip olmayabilir komut dosyası kullanarak edilecektir Ancak, kullanmak en iyisidir getParameterAsText () ve bir komut aracı olarak komut uygulamak ArcMap'te. Bir komut dosyası aracı oluşturmak, kullanıcıya çoğu ESRI aracı tarafından kullanılan ara yüze (arabellek gibi standart araçlar gibi) benzer bir arabirim sağlar.

Belirtilmesi gereken bir nokta, raw_input'larınızı tasarlama şeklinizin kullanıcı ve komut dosyası arasında adım adım etkileşim oluşturmasıdır. Bu, ArcMap'te getParameterAsText () kullanılarak çalıştırılırsa, adım adım gider ve komut dosyasını çalıştırmadan önce girilen bir dizi ayar olacaktır.

Komut dosyası yazmanın temel amaçlarından biri otomasyondur. Bunu birden çok veri kümesinde çalıştıracaksanız, döngülere göz atmalısınız . Şimdiye kadar geldiyseniz, muhtemelen en azından bunları okudunuz, ancak bunları nasıl kullanabileceğinize bir örnek olarak: aynı işlemi gerçekleştirmek için birden fazla veri kümeniz olduğunu varsayalım. Bir kez yapılması gereken işlemlerin kodunu yazabilir, ardından veri kümelerinin listesini alan ve her biri üzerinde işlemi gerçekleştiren bir 'for' döngüsü ekleyebilirsiniz.

Uzamsal başvuru gibi şeyler için, arcpy.Describe () kullanarak mevcut bir şekil dosyasından uzamsal bir referansı 'çalabilir' veya getParameterAsText () kullanarak uzamsal referans girişi alabilirsiniz (parametreyi uzamsal referans girişi olarak tanımladığınız sürece) komut dosyası aracını ayarlarken). Yol adlarını almak için raw_input komutunu kullanmak biraz zahmetlidir.


4
+1, kesinlikle raw_input'a karşı parametre almaya geçirdim . Pek çok son kullanıcı, özellikle ArcGIS'in coğrafi işleme araçları gibi bir şeye alıştıklarında, bir GUI'ye karşı bir komut satırı arayüzü kullanmak istemeyecektir.
blah238

10

@ Egdetti'nin harika önerilerine ek olarak , her küçük koşul için if / else mantığı yazmak yerine bazı varsayımlar yaparak betiğinizi büyük ölçüde basitleştirebilirsiniz.

Örneğin:

  • Her bir öğenin önceden var olup olmadığını kontrol etmek yerine, varsayalım ve ayarlayarak üzerine yazmanız yeterlidir arcpy.env.overwriteOutput = True. Şimdi önceden kontrol etmeniz gereken bir neden olabilir, ancak üzerine yazma işleminden daha iyidir.

  • Bunun yerine mekansal referans seçeneği ayarlanmış olup olmadığını kontrol etme ve aynı komut iki farklı şekilde çağırmak, sadece bir kez komuta mekansal referans değişkeni geçmek ve izin o sıfır veya boş dizelerden işlemek (ki gayet olacak).

  • os.path.joinTehlikelerle dolu dize birleştirme kullanmak yerine dosya yolu öğelerini birleştirmek için kullanın .

    Örneğin;

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

    kullanın:

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

Müthiş! Sadece aradığım ipuçları, teşekkürler! İnsanların kullandığı en yaygın işlevleri / kütüphaneleri gösteren herhangi bir liste biliyor musunuz? Os.path.join gibi mi? O kadar çok var ki, bunaltıcı. Eđer yapabilseydim sana +1 olurdum. Soruları onaylamama izin vermeli, sadece aşağı indirmemeli!
ianbroad

2
Zaten resmi Python öğreticisinden geçtiğinizi varsayıyorum ? Standart kütüphanede kullanışlı bölümlere ( 1 , 2 ) sahiptir. Başka bir iyi kaynak Doug Hellmann'ın Haftalık Modül listesidir: doughellmann.com/PyMOTW/contents.html
blah238

Ayrıca, bunalmış olmaktan çok daha iyi, diyorum!
blah238

Kabul etmekten nefret ediyorum, ama henüz öğreticiden geçmedim. Ben sadece içine atladým. Yıllar önce bir C ++ dersi aldım, bu yüzden temelleri biliyorum ama kesinlikle öğreticiye iyice bakmam gerekiyor. Ben her zaman ilk kişi başı başında dalış yaptım. Bağlantılar için teşekkürler.
ianbroad

Sen de beğenebilirsin diveintopython.net , o zaman :)
blah238
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.