Xác định không gian làm việc cho kết nối SDE trong Python


Câu trả lời:


17

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:

nhập mô tả hình ảnh ở đây


Cảm ơn ngài, tôi đã nhận nó ngay bây giờ. Tôi thực sự đánh giá cao sự giúp đỡ của bạn. Cảm ơn rất nhiều.
Ramakrishna Billakanti

5
Nếu bạn đang sử dụng cửa sổ Python trong ArcCatalog để tạo tập lệnh của mình, bạn có thể kéo và thả kết nối của mình vào cửa sổ Python và nó sẽ định dạng đường dẫn chính xác.
Timothy Michael

@TimothyMichael Bạn vừa cứu mạng tôi. Cảm ơn bạn.
ketar

21

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.


Kịch bản tuyệt vời, nhưng tôi đã tìm thấy một vài vấn đề nhỏ với nó trong quá trình phát triển của mình. - Nó lưu mật khẩu, nhưng không phải là một phần của tên tệp, vì vậy khi tôi cung cấp một mật khẩu khác, mã tìm thấy một tệp kết nối cho cơ sở dữ liệu nhưng không biết mật khẩu là khác nhau. Tôi đã đổi tên thành 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
Bryan

Vâng, nếu tôi tạo tập lệnh bây giờ, nó sẽ có thêm một số tùy chọn cho những thứ như bắt buộc tạo tệp (khi bạn thay đổi mật khẩu).
blord-castillo

10

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.


Xin chào Wright, Cảm ơn phản hồi của bạn Tôi thực sự không hiểu bạn đang nói gì, tôi cần chạy xử lý địa lý từ máy tính để bàn cục bộ truy cập kết nối sde của tôi trên một máy chủ khác. Tôi có kết nối được tạo cho dịch vụ sde trên danh mục hồ quang. Tôi nên làm gì nếu muốn truy cập dữ liệu từ kết nối sde.
Ramakrishna Billakanti

Ngày nay, Esri khuyên bạn nên sử dụng os.path.join để tham gia biến tệp kết nối .sde (sdeworkspace) và tên đối tượng. Vì vậy, nó sẽ là indata = os.path.join (sdeworkspace, "FeatureClass").
Alex Tereshenkov

0

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:
                       .
                       .
                       . 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.