파이썬 스크립팅에서 작업 공간에 대한 SDE 연결을 어떻게 정의합니까?
파이썬 스크립팅에서 작업 공간에 대한 SDE 연결을 어떻게 정의합니까?
답변:
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 데이터베이스를 마우스 오른쪽 버튼으로 클릭하고 속성으로 이동 한 다음 일반 탭에서 이름 필드에서 경로를 복사하십시오.
이 페이지의 예제 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()
– 반품 게시에 대한 들여 쓰기가 잘못되어서 연결이 실패한 것을 몰랐습니다. -코드는 버전을 대문자로 변경합니다. 내 버전은 소문자입니다.
일반적으로 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 변수도 설정했습니다.
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:
.
.
.