Các tập lệnh Python chạy bên trong ArcMap so với các tập lệnh chạy bên ngoài?


10

Tôi mới bắt đầu tham gia vào kịch bản Python cho công việc.

Tôi hiện đang tạo một tập lệnh để tự động hóa một quy trình.

Về cơ bản, nó hỏi người dùng tên máy khách, nhận một phép chiếu nếu có, tạo thư mục trên ổ C: cho máy khách, tạo tệp cơ sở dữ liệu địa lý cụ thể cho máy khách, tạo tập dữ liệu cần thiết và tạo các lớp đối tượng cụ thể cho dữ liệu máy khách. Cuối cùng, nó cũng sẽ thêm các trường bắt buộc vào từng lớp tính năng và có thể một số thứ khác.

Tôi bắt đầu điều này không thực sự biết nghi thức đúng đắn của kịch bản Python cho ArcMap. Nhưng những gì tôi đã tạo cho đến nay sẽ chỉ chạy bên ngoài ArcMap tôi tin.

điều này có chấp nhận được không?

Thay vì nhận đầu vào của người dùng thông qua arcpy.getparamaterastext () mà tôi vừa tìm hiểu, tôi đang sử dụng raw_input ().

Cái này có ổn không

Nó không hoạt động, tôi chỉ không chắc đây có phải là một cách thích hợp để thực hiện kịch bản hay không.

Đây là mã tôi có cho đến nay.

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

Tôi vẫn còn một số việc phải làm, như thêm các trường cần thiết.

Câu trả lời:


18

Cách bạn nhận được đầu vào của mình phụ thuộc 100% vào người dùng cuối sẽ là ai, nhưng bạn nói đúng, bạn sẽ không thể sử dụng raw_input trong ArcMap. Nếu bạn sẽ là người duy nhất sử dụng tập lệnh, sẽ không có gì sai khi lấy đầu vào của bạn thông qua raw_input hoặc các đường dẫn mã hóa cứng làm biến trong tập lệnh của bạn. Tuy nhiên, nếu bất kỳ ai khác sẽ sử dụng tập lệnh có thể có hoặc không có bất kỳ kinh nghiệm về tập lệnh nào, tốt nhất là sử dụng getParameterAsText ()triển khai tập lệnh của bạn như một công cụ tập lệnh trong ArcMap. Tạo một công cụ tập lệnh sẽ cung cấp cho người dùng một giao diện tương tự như giao diện được sử dụng bởi hầu hết các công cụ ESRI (chẳng hạn như các công cụ tiêu chuẩn như bộ đệm, v.v ...).

Một điều cần chỉ ra là cách bạn thiết kế raw_inputs tạo ra sự tương tác từng bước giữa người dùng và tập lệnh. Nếu điều này được chạy bằng getParameterAsText () trong ArcMap, từng bước sẽ biến mất và nó sẽ chỉ là một loạt các cài đặt được nhập trước khi chạy tập lệnh.

Một trong những mục đích chính cho kịch bản là tự động hóa. Nếu bạn đang chạy nó trên nhiều bộ dữ liệu, bạn nên kiểm tra các vòng lặp . Nếu bạn đã đi xa đến mức này, có lẽ bạn đã đọc về chúng ít nhất, nhưng là một ví dụ cho cách bạn có thể sử dụng chúng: giả sử bạn có nhiều bộ dữ liệu mà bạn cần thực hiện cùng một thao tác. Bạn có thể viết mã cho các quy trình cần phải hoàn thành một lần, sau đó bao gồm một vòng lặp 'for' để lấy danh sách các bộ dữ liệu và thực hiện thao tác trên mỗi quy trình.

Đối với những thứ như tham chiếu không gian, bạn có thể 'đánh cắp' một tham chiếu không gian từ một shapefile hiện có bằng arcpy.Describe () hoặc bạn có thể lấy đầu vào tham chiếu không gian bằng cách sử dụng getParameterAsText () (miễn là bạn xác định tham số là đầu vào tham chiếu không gian khi thiết lập công cụ script). Sử dụng raw_input để lấy tên đường dẫn là một chút rườm rà.


4
+1, tôi chắc chắn sẽ chuyển sang lấy tham số so với raw_input. Không có nhiều người dùng cuối sẽ muốn sử dụng giao diện dòng lệnh so với GUI, đặc biệt là khi họ đã quen với một cái gì đó như các công cụ xử lý địa lý của ArcGIS.
blah238

10

Ngoài các đề xuất tuyệt vời của @ egdetti , bạn có thể đơn giản hóa rất nhiều tập lệnh của mình bằng cách đưa ra một số giả định thay vì viết logic if / other cho mọi điều kiện nhỏ.

Ví dụ:

  • Thay vì kiểm tra xem từng mục có tồn tại trước đó hay không, chỉ cần giả sử nó và ghi đè lên nó bằng cách cài đặt arcpy.env.overwriteOutput = True. Bây giờ bạn có thể có một số lý do tại sao bạn cần kiểm tra trước nhưng thường xuyên hơn không ghi đè là tốt.

  • Thay vì kiểm tra xem tùy chọn tham chiếu không gian đã được đặt hay chưa và gọi cùng một lệnh theo hai cách khác nhau, chỉ cần chuyển biến tham chiếu không gian cho lệnh một lần và để xử lý các chuỗi rỗng hoặc rỗng (điều này sẽ ổn).

  • Sử dụng os.path.joinđể tham gia các phần tử đường dẫn tệp thay vì sử dụng nối chuỗi, điều này đầy rủi ro.

    Ví dụ: thay vì:

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

    Sử dụng:

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

Tuyệt vời! Chỉ là loại lời khuyên tôi đang tìm kiếm, cảm ơn! Bạn có biết bất kỳ loại danh sách hiển thị các chức năng / thư viện phổ biến nhất mà mọi người sử dụng không? Chẳng hạn như os.path.join? Có rất nhiều thứ quá sức. Tôi sẽ +1 bạn nếu tôi có thể. Họ nên cho phép tôi upvote câu hỏi, chỉ cần không downvote chúng!
ianbroad

2
Tôi cho rằng bạn đã trải qua hướng dẫn Python chính thức ? Nó có các phần tiện dụng ( 1 , 2 ) trên thư viện tiêu chuẩn. Một tài nguyên tốt khác là danh sách Mô-đun trong Tuần của Doug Hellmann: doughellmann.com/PyMOTW/contents.html
blah238

Ngoài ra, tốt hơn là bị choáng ngợp hơn là bị áp đảo, tôi nói!
blah238

Chà, tôi ghét phải thừa nhận nó, nhưng tôi chưa xem qua hướng dẫn này. Tôi chỉ nhảy vào đó. Tôi đã tham gia một lớp học C ++ nhiều năm trước, vì vậy tôi biết những điều cơ bản nhưng tôi chắc chắn cần phải xem kỹ hướng dẫn. Tôi luôn là người lặn trong đầu. Cảm ơn các liên kết.
ianbroad

Bạn cũng có thể thích diveintopython.net :)
blah238
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.