Làm cách nào để xác định Kết nối SDE cho không gian làm việc trong Python Scripting?
Làm cách nào để xác định Kết nối SDE cho không gian làm việc trong Python Scripting?
Câu trả lời:
DEWright chỉ cần đánh bại tôi với nó, anh ấy đúng, sử dụng kết nối giống như trong ArcCatalog. Nhưng đây là của tôi, được thực hiện tại dấu nhắc Python trong ArcMap, sử dụng đường dẫn đầy đủ trực tiếp đến tệp kết nối 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
>>>
Để có được đường dẫn đến tệp kết nối sde của tôi, tôi chỉ cần nhấp chuột phải vào cơ sở dữ liệu SDE của mình trong cây Danh mục, đi đến các thuộc tính, sau đó trên tab Chung, sao chép đường dẫn từ trường Tên:
Các ví dụ 3 đến 5 trên trang này rất tuyệt vời cho vấn đề này: http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//0017000000q7000000
Đây là một phiên bản đơn giản mà tôi đã tạo cho phép tôi thực hiện các kết nối bay trong python chỉ bằng cách sử dụng kết nối trực tiếp Sql Server.
"""
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
Sử dụng tập lệnh này, tôi có thể tạo một tệp kết nối nhanh chóng bằng cách gọi:
import arcpy, sdeconn
myconnect1 = sdeconn.connect("database1", "server")
myconnect2 = sdeconn.connect("database2", "server")
Điều này giúp loại bỏ vấn đề các tệp kết nối cơ sở dữ liệu không nhất quán từ máy này sang máy hoặc hồ sơ người dùng đến hồ sơ người dùng.
md5.new( server + "_" + ServiceConnFileName + "_" + database + "-" + version + "_" + username + password).hexdigest()
- Việc thụt lề trong bài đăng để trả lại là không chính xác, vì vậy tôi không biết kết nối của mình bị lỗi. - Mã thay đổi phiên bản thành chữ hoa, phiên bản của tôi là chữ thường
Bạn cần xác định tài liệu kết nối SDE của mình như bình thường trong ArcCatalog; Sau đó, bạn sẽ tạo đường dẫn đến lớp trong Python như thế này:
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
Điều này sẽ đặt đường dẫn của bạn đến nơi tệp .SDE của bạn sống, nhưng sau đó bạn đặt đường dẫn bên trong kết nối đó đến lớp bạn đang tìm kiếm. Trong trường hợp của tôi, tôi cũng đặt một biến Năm.
bạn cũng có thể xác định đường dẫn kết nối trực tiếp trong Truy vấn của mình.
PathSdeConnection= "C:\\Users\\{Username Of windows}\\AppData\\Roaming\\ESRI\\Desktop10.2\\ArcCatalog\\{name of ConenctionString}.sde
và sử dụng nó trong Tìm kiếm và vv
with arcpy.da.SearchCursor(PathSdeConnection,("OBJECTID","SHAPE@","SHAPE@JSON"),{WhereClause})as cursor:
for row in cursor:
.
.
.