สคริปต์ Python ที่ทำงานใน ArcMap เทียบกับสคริปต์ที่ทำงานภายนอก?


10

ฉันเพิ่งเริ่มทำงานกับสคริปต์ Python เพื่อทำงาน

ฉันกำลังสร้างสคริปต์เพื่อทำให้กระบวนการเป็นไปโดยอัตโนมัติ

โดยทั่วไปแล้วมันจะถามชื่อลูกค้าของผู้ใช้รับการฉายถ้ามีสร้างไดเรกทอรีบนไดรฟ์ C: สำหรับลูกค้าสร้างฐานข้อมูลไฟล์ทางภูมิศาสตร์เฉพาะสำหรับลูกค้าสร้างชุดข้อมูลที่ต้องการและสร้างคลาสคุณลักษณะเฉพาะสำหรับข้อมูลลูกค้า ในที่สุดมันจะเพิ่มฟิลด์ที่จำเป็นให้กับแต่ละฟีเจอร์คลาสและอาจเป็นอย่างอื่น

ฉันเริ่มสิ่งนี้โดยไม่รู้ถึงมารยาทที่เหมาะสมของการเขียนสคริปต์ Python สำหรับ ArcMap แต่สิ่งที่ฉันสร้างขึ้นจนถึงตอนนี้จะทำงานนอก ArcMap ที่ฉันเชื่อเท่านั้น

เป็นที่ยอมรับหรือไม่?

แทนที่จะได้รับการป้อนข้อมูลของผู้ใช้ผ่าน 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% ว่าผู้ใช้จะเป็นใคร แต่คุณถูกต้องคุณจะไม่สามารถใช้ raw_input ใน ArcMap ได้เลย หากคุณจะเป็นคนเดียวที่ใช้สคริปต์ไม่มีอะไรผิดปกติกับการรับอินพุตของคุณผ่าน raw_input หรือเส้นทางการเข้ารหัสฮาร์ดเป็นตัวแปรในสคริปต์ของคุณ อย่างไรก็ตามหากผู้อื่นจะใช้สคริปต์ที่อาจหรืออาจไม่มีประสบการณ์การเขียนสคริปต์ใด ๆ ที่ดีที่สุดคือใช้getParameterAsText ()และใช้สคริปต์ของคุณเป็นเครื่องมือสคริปต์ใน ArcMap การสร้างเครื่องมือสคริปต์จะให้ส่วนต่อประสานกับผู้ใช้ที่คล้ายกับเครื่องมือที่ใช้โดยเครื่องมือ ESRI ส่วนใหญ่ (เช่นเครื่องมือมาตรฐานเช่นบัฟเฟอร์ ฯลฯ ... )

สิ่งหนึ่งที่ชี้ให้เห็นก็คือวิธีที่คุณออกแบบ raw_inputs ของคุณจะสร้างการโต้ตอบทีละขั้นตอนระหว่างผู้ใช้และสคริปต์ หากสิ่งนี้ถูกเรียกใช้โดยใช้ getParameterAsText () ใน ArcMap ทีละขั้นตอนจะหายไปและมันจะเป็นชุดของการตั้งค่าที่อินพุตก่อนที่จะเรียกใช้สคริปต์

หนึ่งในวัตถุประสงค์หลักสำหรับการเขียนสคริปต์คือระบบอัตโนมัติ หากคุณกำลังไปได้ทำงานนี้ในชุดข้อมูลหลายคุณควรตรวจสอบลูป หากคุณมาไกลขนาดนี้คุณอาจได้อ่านอย่างน้อยก็เป็นตัวอย่างสำหรับวิธีใช้: บอกว่าคุณมีชุดข้อมูลหลายชุดที่คุณต้องใช้ในการทำงานแบบเดียวกัน คุณสามารถเขียนโค้ดสำหรับกระบวนการที่ต้องทำให้สำเร็จหนึ่งครั้งจากนั้นรวมลูป 'for' ที่ใช้รายการชุดข้อมูลและดำเนินการกับแต่ละชุด

สำหรับสิ่งต่าง ๆ เช่นการอ้างอิงเชิงพื้นที่คุณสามารถ 'ขโมย' การอ้างอิงเชิงพื้นที่จาก Shapefile ที่มีอยู่โดยใช้arcpy.Describe ()หรือคุณสามารถรับอินพุตอ้างอิงเชิงพื้นที่โดยใช้ getParameterAsText () (ตราบใดที่คุณกำหนดพารามิเตอร์เป็นอินพุตอ้างอิงเชิงพื้นที่ เมื่อตั้งค่าเครื่องมือสคริปต์) การใช้ raw_input เพื่อรับชื่อพา ธ นั้นค่อนข้างยุ่งยาก


4
+1 ผมจะแน่นอนสลับไปยังการพารามิเตอร์กับ raw_input มีผู้ใช้จำนวนไม่น้อยที่ต้องการใช้อินเตอร์เฟสบรรทัดคำสั่งเปรียบเทียบกับ GUI โดยเฉพาะเมื่อพวกเขาคุ้นเคยกับบางอย่างเช่นเครื่องมือประมวลผลทางภูมิศาสตร์ของ ArcGIS
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 คุณถ้าทำได้ พวกเขาควรอนุญาตให้ฉันตอบคำถามไม่ได้ลงคะแนนพวกเขา!
ianbroad

2
ฉันคิดว่าคุณได้ผ่านการสอน Pythonอย่างเป็นทางการแล้วหรือยัง? มันมีส่วนที่มีประโยชน์ ( 1 , 2 ) ในห้องสมุดมาตรฐาน แหล่งข้อมูลที่ดีอีกอย่างคือรายการโมดูลประจำสัปดาห์ของ Doug Hellmann: doughellmann.com/PyMOTW/contents.html
blah238

นอกจากนี้ดีกว่าที่จะจมน้ำท่วมฉันพูด!
blah238

ดีฉันเกลียดที่จะยอมรับ แต่ฉันยังไม่ได้ผ่านการสอน ฉันแค่กระโดดลงไป ฉันเรียน C ++ เมื่อหลายปีก่อนดังนั้นฉันจึงรู้พื้นฐาน แต่ฉันต้องดูการสอนอย่างถี่ถ้วน ฉันมักจะดำน้ำในหัวของคนประเภทแรก ขอบคุณสำหรับลิงค์
ianbroad

คุณอาจจะชอบdiveintopython.netเช่นกัน :)
blah238
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.