पाइकॉन स्क्रिप्ट जो आर्कपेज़ बनाम अंदर चलने वाले हैं जो बाहर चलती हैं?


10

मैं सिर्फ काम के लिए पायथन स्क्रिप्टिंग में आना शुरू कर रहा हूं।

मैं वर्तमान में एक प्रक्रिया को स्वचालित करने के लिए एक स्क्रिप्ट बना रहा हूं।

मूल रूप से, यह उपयोगकर्ता को क्लाइंट नाम पूछता है, यदि उपलब्ध हो तो एक प्रोजेक्शन मिलता है, क्लाइंट पर निर्देशिका बनाता है: क्लाइंट के लिए ड्राइव बनाता है, क्लाइंट के लिए विशिष्ट फाइल जियोडेटाबेस बनाता है, आवश्यक डेटासेट बनाता है, और क्लाइंट डेटा के लिए विशिष्ट वर्ग बनाता है। आखिरकार, यह प्रत्येक फ़ीचर वर्ग और शायद कुछ अन्य चीज़ों के लिए आवश्यक फ़ील्ड भी जोड़ देगा।

मैंने इसे वास्तव में आर्केप के लिए पायथन स्क्रिप्टिंग के उचित शिष्टाचार को नहीं जानना शुरू किया। लेकिन जो मैंने अब तक बनाया है वह केवल आर्कपैक के बाहर चलेगा, मुझे विश्वास है।

क्या यह स्वीकार्य है?

इसके बजाय उपयोगकर्ता इनपुट मिलने के बजाय arcpy.getparamaterastext (), जिसके बारे में मुझे अभी पता चला है, मैं raw_input () का उपयोग कर रहा हूं।

यह ठीक है?

यह काम करता है, मुझे यकीन नहीं है कि यह स्क्रिप्टिंग करने का एक उचित तरीका है।

यहाँ अब तक का कोड मेरे पास है।

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

मुझे अभी भी कुछ काम करना है, जैसे कि आवश्यक क्षेत्रों को जोड़ना।

जवाबों:


18

आप अपने इनपुट को कैसे प्राप्त करते हैं, यह निर्भर करता है कि अंतिम उपयोगकर्ता कौन होगा, पर 100% निर्भर करता है, लेकिन आप सही हैं, आप ArcMap में raw_input का उपयोग करने में सक्षम नहीं होंगे। यदि आप स्क्रिप्ट का उपयोग करने वाले केवल एक होने जा रहे हैं, तो आपके स्क्रिप्ट में चर के रूप में कच्चे_input, या हार्ड कोडिंग पथ के माध्यम से आपके इनपुट प्राप्त करने में कुछ भी गलत नहीं है। हालाँकि, यदि कोई अन्य व्यक्ति स्क्रिप्ट का उपयोग कर रहा है या उसके पास कोई स्क्रिप्टिंग अनुभव नहीं हो सकता है, तो getParameterAsText () का उपयोग करना और अपनी स्क्रिप्ट को ArcMap में स्क्रिप्ट टूल के रूप में लागू करना सबसे अच्छा है । एक स्क्रिप्ट टूल बनाने से उपयोगकर्ता को एक इंटरफ़ेस मिलेगा जो कि ज्यादातर ईएसआरआई टूल (जैसे बफर, आदि ...) जैसे मानक टूल द्वारा उपयोग किए जाने वाले के समान है।

इंगित करने वाली एक बात यह है कि आपके पास जिस तरह से आपके रॉ_इनपुट डिज़ाइन किए गए हैं, वह उपयोगकर्ता और स्क्रिप्ट के बीच एक चरणबद्ध तरीके से एक कदम बनाता है। अगर यह ArcPMap में getParameterAsText () का उपयोग करके चलाया जाता है, तो चरण दर चरण दूर हो जाएगा, और यह केवल उन सेटिंग्स की एक श्रृंखला होगी जो स्क्रिप्ट चलाने से पहले इनपुट हैं।

स्क्रिप्टिंग का एक मुख्य उद्देश्य स्वचालन है। यदि आप कई डेटासेट पर इसे चलाने जा रहे हैं, तो आपको लूप की जांच करनी चाहिए । यदि आप यह बहुत दूर आ गए हैं, तो आपने शायद उनके बारे में कम से कम पढ़ा है, लेकिन उदाहरण के लिए कि आप उनका उपयोग कैसे कर सकते हैं: कहते हैं कि आपके पास कई डेटासेट हैं जिनके लिए आपको उसी ऑपरेशन को करने की आवश्यकता है। आप उन प्रक्रियाओं के लिए कोड लिख सकते हैं जिन्हें एक बार पूरा करने की आवश्यकता है, फिर एक 'for' लूप शामिल करें जो डेटासेट की एक सूची लेता है और उनमें से प्रत्येक पर ऑपरेशन करता है।

स्थानिक संदर्भ जैसी चीजों के लिए, आप arcpy.Describe () का उपयोग करके एक मौजूदा आकार-प्रकार से एक स्थानिक संदर्भ 'चोरी' कर सकते हैं, या आप getParameterAsText () का उपयोग करके एक स्थानिक संदर्भ इनपुट प्राप्त कर सकते हैं (जब तक आप पैरामीटर को स्थानिक संदर्भ इनपुट के रूप में परिभाषित करते हैं। स्क्रिप्ट टूल सेट करते समय)। पथ नामों को प्राप्त करने के लिए raw_input का उपयोग करना थोड़ा बोझिल है।


4
+1, मैं निश्चित रूप से पैरामीटर्स बनाम रॉ_इनपुट पर स्विच करूंगा। बहुत से अंत उपयोगकर्ता एक कमांड लाइन इंटरफेस बनाम एक जीयूआई का उपयोग नहीं करना चाहेंगे, खासकर जब उन्हें आर्कगिस के जियोप्रोसेसिंग टूल जैसे कुछ के लिए उपयोग किया जाता है।
blah238

10

के अलावा @ egdetti के महान सुझाव , आप बहुत कुछ मान्यताओं बनाने के बजाय हर छोटी हालत के लिए करता है, तो / किसी और तर्क लिख कर अपनी स्क्रिप्ट को आसान बनाने में कर सकते हैं।

उदाहरण के लिए:

  • प्रत्येक आइटम पहले से मौजूद है या नहीं, इसकी जाँच करने के बजाय, मान लें कि यह करता है और सेटिंग द्वारा इसे अधिलेखित कर देता है arcpy.env.overwriteOutput = True। अब आपके पास कुछ कारण हो सकते हैं कि आपको पहले से जांच करने की आवश्यकता है लेकिन अधिक बार ओवरराइटिंग ठीक नहीं है।

  • यह जाँचने के बजाय कि क्या स्थानिक संदर्भ विकल्प सेट किया गया था, और एक ही कमांड को दो अलग-अलग तरीकों से कॉल कर रहा है, बस एक बार कमांड के लिए स्थानिक संदर्भ चर पास करें और इसे अशक्त या खाली तारों (जो यह ठीक होगा) को संभालने दें ।

  • os.path.joinस्ट्रिंग संघनन का उपयोग करने के बजाय फ़ाइल पथ तत्वों में शामिल होने के लिए उपयोग करें , जो कि खतरों से भरा है।

    उदाहरण के बजाय:

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

    उपयोग:

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

बहुत बढ़िया! बस जिस तरह की युक्तियों की मुझे तलाश थी, धन्यवाद! क्या आप किसी भी प्रकार की सूची के बारे में जानते हैं जो सबसे आम कार्यों / पुस्तकालयों का उपयोग लोगों को दिखाती है? इस तरह के os.path.join? वहाँ बहुत सारे हैं कि यह भारी है। अगर मैं कर सकता तो मैं आपको +1 करता। उन्हें मुझे सवालों को उठाने देना चाहिए, बस उन्हें नीचा नहीं दिखाना चाहिए!
२३:२२

2
मुझे लगता है कि आप पहले से ही आधिकारिक पायथन ट्यूटोरियल के माध्यम से चले गए हैं ? यह मानक पुस्तकालय पर आसान खंड ( 1 , 2 ) है। एक और अच्छा संसाधन है डॉग हेलमैन का वीकली
blah238

इसके अलावा, अभिभूत होने से बेहतर है, मैं कहता हूं!
23:23 पर blah238

खैर, मैं इसे स्वीकार करने से नफरत करता हूं, लेकिन मैं अभी तक ट्यूटोरियल से नहीं गुजरा हूं। मैं तरह तरह से उसमें कूद गया। मैंने वर्षों पहले C ++ क्लास लिया था, इसलिए मुझे मूल बातें पता हैं लेकिन मुझे निश्चित रूप से ट्यूटोरियल के माध्यम से पूरी तरह से देखने की जरूरत है। मैं हमेशा सिर में पहली तरह का व्यक्ति रहा हूं। लिंक के लिए धन्यवाद।
ianbbroad

आपको diveintopython.net भी पसंद सकती है, फिर :)
blah238
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.