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

У меня еще есть работа, например, добавление необходимых полей.

ianbroad
источник

Ответы:

18

То, как вы получите свои данные, на 100% зависит от того, кем будет конечный пользователь, но вы правы, вы вообще не сможете использовать raw_input в ArcMap. Если вы собираетесь быть единственным, кто использует скрипт, нет ничего плохого в том, чтобы вводить ваши данные через raw_input или жесткие пути кодирования в качестве переменных в ваш скрипт. Однако, если кто-то еще будет использовать сценарий, который может иметь или не иметь никакого опыта написания сценариев, лучше всего использовать getParameterAsText () и реализовать свой сценарий как инструмент-скрипт в ArcMap. Создание инструмента-скрипта предоставит пользователю интерфейс, похожий на тот, который используется большинством инструментов ESRI (таких как стандартные инструменты, такие как буфер и т. Д.).

Одна вещь, на которую следует обратить внимание, заключается в том, что способ, которым вы спроектировали raw_inputs, создает пошаговое взаимодействие между пользователем и сценарием. Если это выполняется с использованием getParameterAsText () в ArcMap, пошаговый шаг исчезнет, ​​и это будет просто набор настроек, которые вводятся до запуска скрипта.

Одна из основных целей сценариев - автоматизация. Если вы собираетесь использовать это для нескольких наборов данных, вы должны проверить циклы . Если вы зашли так далеко, вы, вероятно, хотя бы прочитали о них, но в качестве примера того, как вы можете их использовать: скажем, у вас есть несколько наборов данных, с которыми вам нужно выполнить одну и ту же операцию. Вы можете написать код для процессов, которые необходимо выполнить один раз, а затем включить цикл for, который принимает список наборов данных и выполняет операции с каждым из них.

Для таких вещей, как пространственная привязка, вы можете «украсть» пространственную привязку из существующего шейп- файла, используя arcpy.Describe () , или вы можете получить вход пространственной привязки, используя getParameterAsText () (при условии, что вы определяете параметр как вход пространственной привязки при настройке скриптового инструмента). Использование raw_input для получения имен путей немного громоздко.

bluefoot
источник
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")
blah238
источник
Потрясающие! Просто советы, которые я искал, спасибо! Знаете ли вы какой-либо список, который показывает наиболее распространенные функции / библиотеки, которые люди используют? Такие как os.path.join? Их так много, что это ошеломляет. Я бы +1 тебе, если бы мог. Они должны позволять мне поднимать вопросы, а не понижать их!
ianbroad
2
Я полагаю, вы уже прошли официальный урок по Python ? Имеет удобные разделы ( 1 , 2 ) в стандартной библиотеке. Другим хорошим ресурсом является список модуля недели Дуга
Хеллмана
Кроме того, лучше быть подавленным, чем пораженным, говорю я!
blah238
Ну, я ненавижу это признавать, но я еще не прошел этот урок. Я как бы прыгнул в это. Я учился на C ++ несколько лет назад, так что я немного знаком с основами, но мне определенно нужно тщательно изучить учебник. Я всегда был погруженным в голову первым человеком. Спасибо за ссылки.
ianbroad
Возможно, вам тоже понравится diveintopython.net :)
blah238