Scripts Python que são executados dentro do ArcMap versus scripts que são executados fora?


10

Estou apenas começando a trabalhar nos scripts Python.

Atualmente, estou criando um script para automatizar um processo.

Basicamente, ele pergunta ao usuário o nome do cliente, obtém uma projeção, se disponível, cria um diretório na unidade C: para cliente, cria um banco de dados geográfico específico para o cliente, cria um conjunto de dados necessário e cria classes de recursos específicas para os dados do cliente. Eventualmente, ele também adicionará os campos obrigatórios a cada classe de recurso e provavelmente algumas outras coisas.

Comecei isso sem realmente conhecer a etiqueta adequada dos scripts Python para o ArcMap. Mas o que eu criei até agora só será executado fora do ArcMap, acredito.

Isso é aceitável?

Em vez de obter a entrada do usuário através do arcpy.getparamaterastext (), sobre o qual acabei de descobrir, estou usando raw_input ().

Tudo bem?

Funciona, mas não tenho certeza se essa é uma maneira adequada de criar scripts.

Aqui está o código que tenho até agora.

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

Ainda tenho algum trabalho a fazer, como adicionar os campos necessários.

Respostas:


18

Como você obtém suas entradas depende 100% de quem será o usuário final, mas você está certo, não poderá usar raw_input no ArcMap. Se você for o único a usar o script, não há nada de errado em obter suas entradas através de raw_input ou caminhos de codificação rígida como variáveis ​​em seu script. No entanto, se alguém mais estiver usando o script que pode ou não ter alguma experiência com scripts, é melhor usar getParameterAsText () e implementar seu script como uma ferramenta de script no ArcMap. A criação de uma ferramenta de script fornecerá ao usuário uma interface semelhante à usada pela maioria das ferramentas ESRI (como ferramentas padrão como buffer, etc ...).

Uma coisa a destacar é que a maneira como você projetou seus raw_inputs cria uma interação passo a passo entre o usuário e o script. Se isso for executado usando getParameterAsText () no ArcMap, o passo a passo desaparecerá e haverá apenas uma série de configurações inseridas antes da execução do script.

Um dos principais objetivos do script é a automação. Se você estiver executando isso em vários conjuntos de dados, verifique os loops . Se você chegou até aqui, provavelmente já leu sobre eles, pelo menos, mas como um exemplo de como usá-los: diga que você tem vários conjuntos de dados nos quais precisa executar a mesma operação. Você pode escrever o código para os processos que precisam ser realizados uma vez e depois incluir um loop 'for' que pega uma lista de conjuntos de dados e executa a operação em cada um deles.

Para coisas como referência espacial, você pode 'roubar' uma referência espacial de um arquivo shapefile existente usando arcpy.Describe () ou obter uma entrada de referência espacial usando getParameterAsText () (desde que você defina o parâmetro como uma entrada de referência espacial ao configurar a ferramenta de script). Usar raw_input para obter nomes de caminho é um pouco complicado.


4
+1, eu definitivamente mudaria para assumir parâmetros vs. raw_input. Não são muitos os usuários finais que desejam usar uma interface de linha de comando versus uma GUI, especialmente quando estão acostumados a algo como as ferramentas de geoprocessamento do ArcGIS.
blah238

10

Além das ótimas sugestões de @ egdetti , você pode simplificar bastante seu script fazendo algumas suposições em vez de escrever a lógica if / else para cada pequena condição.

Por exemplo:

  • Em vez de verificar se cada item existe antes, apenas assuma que existe e substitua-o, definindo arcpy.env.overwriteOutput = True. Agora você pode ter algum motivo para verificar com antecedência, mas com mais freqüência do que não substituir é bom.

  • Em vez de verificar se a opção de referência espacial foi configurada e chamar o mesmo comando de duas maneiras diferentes, basta passar a variável de referência espacial para o comando uma vez e deixá- lo manipular cadeias nulas ou vazias (o que será bom).

  • Use os.path.joinpara associar elementos do caminho do arquivo em vez de usar a concatenação de cadeias, que está repleta de perigos.

    Por exemplo, em vez de:

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

    Usar:

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

Impressionante! Apenas o tipo de dicas que eu estava procurando, obrigado! Você conhece algum tipo de lista que mostre as funções / bibliotecas mais comuns que as pessoas usam? Como o os.path.join? Há tantos que é meio esmagador. Eu marcaria você com +1, se pudesse. Eles devem permitir que eu vote com antecedência, mas não com voto negativo!
Ianbroad

2
Eu suponho que você já passou pelo tutorial oficial do Python ? Possui seções úteis ( 1 , 2 ) na biblioteca padrão. Outro bom recurso é Módulo da lista Week de Doug Hellmann: doughellmann.com/PyMOTW/contents.html
blah238

Além disso, é melhor ficar impressionado do que decepcionado, eu digo!
blah238

Bem, odeio admitir, mas ainda não fiz o tutorial. Eu meio que pulei nele. Tomei uma aula de C ++ anos atrás, então eu meio que conheço o básico, mas eu definitivamente preciso examinar completamente o tutorial. Eu sempre fui um mergulho na cabeça primeiro tipo de pessoa. Obrigado pelos links.
Ianbroad #

Você pode gostar diveintopython.net também, então :)
blah238
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.