ArcMap 내부에서 실행되는 Python 스크립트와 외부에서 실행되는 Python 스크립트?


10

방금 파이썬 스크립팅을 시작했습니다.

현재 프로세스를 자동화하는 스크립트를 만들고 있습니다.

기본적으로 사용자에게 클라이언트 이름을 묻고 사용 가능한 경우 프로젝션을 받고 C :에 클라이언트 용 드라이브를 생성하고 클라이언트 전용 드라이브 파일을 생성하며 필요한 데이터 세트를 생성하고 클라이언트 데이터와 관련된 기능 클래스를 생성합니다. 결국, 각 피처 클래스 및 기타 다른 것에 필수 필드를 추가합니다.

ArcMap을위한 Python 스크립팅의 적절한 에티켓을 알지 못하면서 이것을 시작했습니다. 그러나 지금까지 만든 것은 내가 믿는 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 %에 달려 있지만 ArcMap에서 raw_input을 전혀 사용할 수는 없습니다. 스크립트를 사용하는 유일한 사람이라면 raw_input을 통한 입력 또는 하드 코딩 경로를 스크립트의 변수로 가져 오는 데 아무런 문제가 없습니다. 다른 사람이 나 스크립팅 경험이있을 수도 있고 없을 수도 있습니다 스크립트를 사용하게 될 경우에는, 그것을 사용하는 것이 가장 좋습니다 getParameterAsText을 ()스크립트 도구로 스크립트를 구현 ArcMap의한다. 스크립트 도구를 만들면 사용자에게 대부분의 ESRI 도구 (예 : 버퍼 등의 표준 도구)에서 사용하는 인터페이스와 유사한 인터페이스가 제공됩니다.

주목해야 할 것은 raw_inputs를 설계 한 방식이 사용자와 스크립트 간의 단계별 상호 작용을 생성한다는 것입니다. 이것을 ArcMap에서 getParameterAsText ()를 사용하여 실행하면 단계별로 사라지고 스크립트를 실행하기 전에 입력되는 일련의 설정일뿐입니다.

스크립팅의 주요 목적 중 하나는 자동화입니다. 여러 데이터 세트에서 이것을 실행하려면 루프를 확인해야합니다 . 지금까지왔다면, 아마도 그것들에 대해 읽었을 것입니다. 그러나 그것들을 어떻게 사용할 수 있는지에 대한 예로써 같은 작업을 수행해야하는 여러 데이터 세트가 있다고 가정하십시오. 한 번 수행해야하는 프로세스에 대한 코드를 작성한 다음 데이터 세트 목록을 가져 와서 각각에 대해 작업을 수행하는 'for'루프를 포함시킬 수 있습니다.

공간 참조와 같은 경우 arcpy.Describe ()를 사용하여 기존 shapefile에서 공간 참조를 '훔치 거나'매개 변수를 공간 참조 입력으로 정의하는 한 getParameterAsText ()를 사용하여 공간 참조 입력을 얻을 수 있습니다. 스크립트 도구를 설정할 때). raw_input을 사용하여 경로 이름을 얻는 것은 약간 번거 롭습니다.


4
+1, 나는 매개 변수를 raw_input과 비교하는 것으로 확실히 전환 할 입니다. 많은 최종 사용자는 특히 ArcGIS의 지오 프로세싱 도구와 같은 도구에 익숙 할 때 GUI와 명령 줄 인터페이스를 사용하려고하지 않습니다.
blah238

10

@egdetti의 훌륭한 제안 외에도 모든 작은 조건에 대해 if / else 논리를 작성하는 대신 몇 가지 가정을함으로써 스크립트를 크게 단순화 할 수 있습니다.

예를 들면 다음과 같습니다.

  • 미리 각 항목이 존재하는지 확인하는 대신을 설정하고 설정하여 덮어 씁니다 arcpy.env.overwriteOutput = True. 이제 미리 확인 해야하는 이유가 있지만 덮어 쓰지 않는 것보다 좋습니다.

  • 공간 참조 옵션이 설정되어 있는지 확인하고 동일한 명령을 두 가지 다른 방식으로 호출하는 대신 공간 참조 변수를 명령에 한 번만 전달하면 null 또는 빈 문자열을 처리 할 수 있습니다.

  • os.path.join위험에 처한 문자열 연결을 사용하는 대신 파일 경로 요소를 결합하는 데 사용하십시오 .

    예를 들면 다음과 같습니다.

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

    사용하다:

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

대박! 내가 찾던 일종의 팁, 감사합니다! 사람들이 사용하는 가장 일반적인 기능 / 라이브러리를 보여주는 목록 유형에 대해 알고 있습니까? os.path.join과 같은? 너무나 많은 것이 압도적입니다. 내가 할 수 있다면 당신을 +1 할 것입니다. 그들은 내가 투표하지 않고 질문을 투표 할 수 있도록해야한다!
ianbroad

2
나는 당신이 이미 공식 파이썬 튜토리얼을 겪었다 고 가정 합니까? 표준 라이브러리에 편리한 섹션 ( 1 , 2 )이 있습니다. 또 다른 좋은 자료는 Doug Hellmann 's Module of the Week 목록입니다 : doughellmann.com/PyMOTW/contents.html
blah238

또한 압도하는 것보다 압도하는 것이 낫습니다.
blah238

글쎄, 나는 그것을 인정하는 것을 싫어하지만 아직 자습서를 거치지 않았습니다. 나는 단지 그것에 뛰어 들었다. 몇 년 전에 C ++ 수업을 들었으므로 기본 사항을 알고 있지만 자습서를 철저히 살펴볼 필요가 있습니다. 나는 항상 첫 번째 사람의 머리에서 다이빙을했습니다. 링크 주셔서 감사합니다.
ianbroad

diveintopython.net 도 좋아할 것입니다. :)
blah238
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.