Сценарії 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, крок за кроком відійде, і це буде просто ряд налаштувань, які вводяться перед запуском сценарію.

Однією з головних цілей сценаріїв є автоматизація. Якщо ви збираєтеся виконувати це на кількох наборах даних, слід перевірити цикли . Якщо ви зайшли так далеко, ви, мабуть, читали про них принаймні, але як приклад того, як ви могли їх використовувати: скажіть, у вас є кілька наборів даних, які вам потрібно виконати в одній операції. Ви можете написати код для процесів, які потрібно виконати один раз, а потім включити цикл 'для', який бере список наборів даних і виконує операцію над кожним з них.

Для таких речей, як просторова посилання, ви можете "вкрасти" просторову посилання з наявного файлу форми за допомогою arcpy.Describe () , або ви можете отримати вхід просторової посилання за допомогою getParameterAsText () (якщо ви визначаєте параметр як вхід просторової посилання). при налаштуванні інструменту сценарію). Використання raw_input для отримання імен шляхів трохи громіздке.


4
+1, я б точно перейшов до прийому параметрів порівняно з raw_input. Не багато кінцевих користувачів захочуть використовувати інтерфейс командного рядка проти графічного інтерфейсу, особливо коли вони звикли до чогось подібного до інструментів геообробки ArcGIS.
blah238

10

На додаток до чудових пропозицій @ egdetti , ви можете значно спростити свій сценарій, зробивши деякі припущення замість того, щоб писати логіку if / else для кожної невеликої умови.

Наприклад:

  • Замість того, щоб перевірити, чи існує кожен елемент заздалегідь, просто припустіть, що він є, і перезапишіть його, встановивши 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 ). Ще один хороший ресурс - Модуль списку Тижня Модель
Дуга

Крім того, краще бути перевантаженим, ніж підтопленим, я кажу!
blah238

Ну, я ненавиджу це визнавати, але ще не пройшов підручник. Я наче просто вскочив у це. Я взяв клас C ++ років тому, тому я якось знаю основи, але мені обов'язково потрібно ретельно переглядати підручник. Я завжди був зануренням у голову першого типу людини. Дякуємо за посилання.
ianbroad

Можливо, вам сподобається і diveintopython.net , тоді :)
blah238
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.