Python에서 SDE 연결을위한 작업 공간 정의


답변:


17

DEWright는 그냥 나를 이겼습니다. 그는 맞습니다. ArcCatalog와 같은 연결을 사용하십시오. 그러나 다음은 ArcMap의 Python 프롬프트에서 sde 연결 파일의 직접 전체 경로를 사용하여 수행 한 것입니다.

>>> import arcpy
>>> arcpy.env.workspace = "C:\\Users\\chad\\AppData\\Roaming\\ESRI\\Desktop10.0\\ArcCatalog\\anrc_water (anrcuser).sde"
>>> fdlist = arcpy.ListDatasets()
>>> for fd in fdlist:
...     print fd
... 
anrc_water.DBO.ChadTest
anrc_water.DBO.Temp_Data
anrc_water.DBO.Master_Datasets
ANRC_WATER.DBO.ENF_FILL_FACC
ANRC_WATER.DBO.ENF_FILL_FDIR

>>> 

내 sde 연결 파일의 경로를 얻으려면 카탈로그 트리에서 SDE 데이터베이스를 마우스 오른쪽 버튼으로 클릭하고 속성으로 이동 한 다음 일반 탭에서 이름 필드에서 경로를 복사하십시오.

여기에 이미지 설명을 입력하십시오


감사합니다 당신의 도움에 정말 감사합니다. 고마워
Ramakrishna Billakanti

5
ArcCatalog에서 Python 창을 사용하여 스크립트를 생성하는 경우 연결을 Python 창으로 끌어서 놓으면 경로의 형식이 올바르게 지정됩니다.
Timothy Michael

@TimothyMichael 당신은 내 생명을 구했습니다. 감사합니다.
ketar

21

이 페이지의 예제 3-5는이 문제에 놀랍습니다. http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//0017000000q7000000

다음은 Sql Server 직접 연결 만 사용하여 Python에서 즉시 연결을 수행 할 수있는 단순화 된 버전입니다.

"""
Name: sdeconn.py
Description: Utility functions for sde connections
"""

# Import system modules
import arcpy, os, sys

def connect(database, server="<default server>", username="<default user>", password="<default password>", version="SDE.DEFAULT"):
    # Check if value entered for option
    try:
        #Usage parameters for spatial database connection to upgrade
        service = "sde:sqlserver:" + server 
        account_authentication = 'DATABASE_AUTH'
        version = version.upper()
        database = database.lower()

        # Check if direct connection
        if service.find(":") <> -1:  #This is direct connect
            ServiceConnFileName = service.replace(":", "")
            ServiceConnFileName = ServiceConnFileName.replace(";", "")
            ServiceConnFileName = ServiceConnFileName.replace("=", "")
            ServiceConnFileName = ServiceConnFileName.replace("/", "")
            ServiceConnFileName = ServiceConnFileName.replace("\\", "")
        else:
            arcpy.AddMessage("\n+++++++++")
            arcpy.AddMessage("Exiting!!")
            arcpy.AddMessage("+++++++++")
            sys.exit("\nSyntax for a direct connection in the Service parameter is required for geodatabase upgrade.")

        # Local variables
        Conn_File_NameT = server + "_" + ServiceConnFileName + "_" + database + "_" + username    

        if os.environ.get("TEMP") == None:
            temp = "c:\\temp"   
        else:
            temp = os.environ.get("TEMP")

        if os.environ.get("TMP") == None:
            temp = "/usr/tmp"       
        else:
            temp = os.environ.get("TMP")  

        Connection_File_Name = temp + os.sep + Conn_File_NameT + ".sde"
        if os.path.isfile(Connection_File_Name):
            return Connection_File_Name

        # Check for the .sde file and delete it if present
        arcpy.env.overwriteOutput=True


        # Variables defined within the script; other variable options commented out at the end of the line
        saveUserInfo = "SAVE_USERNAME" #DO_NOT_SAVE_USERNAME
        saveVersionInfo = "SAVE_VERSION" #DO_NOT_SAVE_VERSION


        print "\nCreating ArcSDE Connection File...\n"
        # Process: Create ArcSDE Connection File...
        # Usage: out_folder_path, out_name, server, service, database, account_authentication, username, password, save_username_password, version,   save_version_info
        print temp
        print Conn_File_NameT
        print server
        print service
        print database
        print account_authentication
        print username
        print password
        print saveUserInfo
        print version
        print saveVersionInfo
        arcpy.CreateArcSDEConnectionFile_management(temp, Conn_File_NameT, server, service, database, account_authentication, username, password, saveUserInfo, version, saveVersionInfo)
        for i in range(arcpy.GetMessageCount()):
            if "000565" in arcpy.GetMessage(i):   #Check if database connection was successful
                arcpy.AddReturnMessage(i)
                arcpy.AddMessage("\n+++++++++")
                arcpy.AddMessage("Exiting!!")
                arcpy.AddMessage("+++++++++\n")
                sys.exit(3)            
            else:
                arcpy.AddReturnMessage(i)
                arcpy.AddMessage("+++++++++\n")
                return Connection_File_Name
    #Check if no value entered for option   
    except SystemExit as e:
        print e.code
        return

이 스크립트를 사용하여 간단히 다음을 호출하여 연결 파일을 즉석에서 만들 수 있습니다.

import arcpy, sdeconn
myconnect1 = sdeconn.connect("database1", "server")
myconnect2 = sdeconn.connect("database2", "server")

이렇게하면 데이터베이스 연결 파일이 시스템에서 시스템으로 또는 사용자 프로파일에서 사용자 프로파일로 일치하지 않는 문제점이 제거됩니다.


대본이지만 개발 중에 약간의 문제가 발견되었습니다. -암호를 저장하지만 파일 이름의 일부는 아니므로 다른 암호를 제공하면 코드가 데이터베이스의 연결 파일을 찾았지만 암호가 다른 것을 알지 못했습니다. 이름을 다음과 같이 변경했습니다. md5.new( server + "_" + ServiceConnFileName + "_" + database + "-" + version + "_" + username + password).hexdigest() – 반품 게시에 대한 들여 쓰기가 잘못되어서 연결이 실패한 것을 몰랐습니다. -코드는 버전을 대문자로 변경합니다. 내 버전은 소문자입니다.
Bryan

예, 스크립트를 작성했다면 파일을 생성하는 것과 같은 옵션이 더 있습니다 (암호 변경시).
blord-castillo

10

일반적으로 ArcCatalog에서와 같이 SDE 연결 문서를 정의해야합니다. 그런 다음 Python에서 레이어의 경로를 다음과 같이 만듭니다.

DataConnections = "C:\\AGS_GCSS_Tools\\DatabaseConnections\\" 
TCA_Connection = "prod_sde.sde\\prod_SDE.GIS.PropertyTax" + CAPSYear + "\\prod_SDE.GIS.Tca"
TCA_Layer = DataConnections + TCA_Connection

그러면 경로가 .SDE 파일이있는 위치로 설정되지만 해당 연결 내부의 경로는 찾고있는 레이어로 설정됩니다. 제 경우에는 Year 변수도 설정했습니다.


안녕하세요 Wright, 귀하의 답변에 감사드립니다. 나는 당신이 무엇을 말하는지 이해하지 못합니다. 다른 서버의 sde 연결에 액세스하는 로컬 데스크톱에서 지오 프로세싱을 실행해야합니다. arc 카탈로그의 sde 서비스에 대한 연결이 작성되었습니다. sde 연결에서 데이터에 액세스하려면 어떻게해야합니까?
Ramakrishna Billakanti

현재 Esri는 .sde 연결 파일 (sdeworkspace) 변수와 개체 이름을 결합하기 위해 os.path.join을 사용하는 것이 좋습니다. 따라서 indata = os.path.join (sdeworkspace, "FeatureClass")이됩니다.
Alex Tereshenkov

0

Query에서 직접 연결 경로를 정의 할 수도 있습니다.

PathSdeConnection= "C:\\Users\\{Username Of windows}\\AppData\\Roaming\\ESRI\\Desktop10.2\\ArcCatalog\\{name of ConenctionString}.sde

검색 등에서 사용하십시오.

with arcpy.da.SearchCursor(PathSdeConnection,("OBJECTID","SHAPE@","SHAPE@JSON"),{WhereClause})as cursor:
     for row in cursor:
                       .
                       .
                       . 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.