Python'da SDE Bağlantısı için Çalışma Alanını Tanımlama


Yanıtlar:


17

DEWright beni sadece dövdü, doğru, ArcCatalog'daki gibi bir bağlantı kullan. Ama burada benim sde bağlantı dosyasının doğrudan tam yolunu kullanarak, ArcMap Python isteminde yapılan benim almak:

>>> 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 bağlantı dosyamın yolunu almak için, Katalog ağacındaki SDE veritabanımı sağ tıklattım, özelliklere gittim, sonra Genel sekmesinde, Adı alanından yolu kopyaladım:

resim açıklamasını buraya girin


Teşekkürler efendim şimdi anladım. yardımın için sağol. Çok teşekkürler.
Ramakrishna Billakanti

5
Komut dosyalarınızı oluşturmak için ArcCatalog'daki Python penceresini kullanıyorsanız, bağlantınızı Python penceresine sürükleyip bırakabilirsiniz; yol düzgün bir şekilde biçimlendirilir.
Timothy Michael

@TimothyMichael Hayatımı yeni kurtardın. Teşekkür ederim.
ketar

21

Bu sayfadaki 3 ile 5 arasındaki örnekler bu sorun için şaşırtıcı: http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//0017000000q7000000

İşte ben sadece Sql Server doğrudan bağlantı kullanarak python anında bağlantıları yapmak sağlayan basitleştirilmiş bir versiyonu.

"""
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

Bu komut dosyasını kullanarak, sadece arayarak anında bir bağlantı dosyası yapabilirsiniz:

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

Bu, veritabanı bağlantı dosyalarının makineden makineye veya kullanıcı profilinden kullanıcı profiline tutarsız olması sorununu ortadan kaldırır.


Harika bir senaryo, ama gelişimim sırasında birkaç küçük sorun buldum. - Parolayı kaydeder, ancak dosya adının bir parçası olarak değil, bu yüzden farklı bir parola sağladığımda kod veritabanı için bir bağlantı dosyası buldu, ancak parolanın farklı olduğunu bilmiyordu. Adı olarak değiştirdim md5.new( server + "_" + ServiceConnFileName + "_" + database + "-" + version + "_" + username + password).hexdigest() - Dönüş için gönderideki girinti yanlış, bu yüzden bağlantımın başarısız olduğunu bilmiyordum. - Kod sürümü büyük harfe değiştirir,
Bryan

Eğer senaryoyu şimdi yapsaydım, dosya oluşturma zorlaması gibi şeyler için daha fazla seçenek olurdu (şifreyi değiştirdiğinizde).
blord-castillo

10

SDE bağlantı belgenizi normalde ArcCatalog'da yaptığınız gibi tanımlamanız gerekir; Daha sonra Python'da katmanın yolunu şu şekilde oluşturacaksınız:

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

Bu, .SDE dosyanızın bulunduğu yerin yolunu ayarlayacaktır, ancak daha sonra aradığınız katmanla bağlantı içindeki yolu ayarlamış olursunuz. Benim durumumda da bir Yıl değişkeni ayarladım.


Merhaba Wright, Cevabınız için teşekkürler, ne dediğini gerçekten anlamıyorum, yerel masaüstümden farklı bir sunucudaki sde bağlantımıza erişerek coğrafi işlem yapmam gerekiyor. Arc kataloğunda sde servisi için bağlantı oluşturdum. sde bağlantısından verilere erişmek istiyorsanız ne yapmalıyım.
Ramakrishna Billakanti

Günümüzde Esri, .sde bağlantı dosyası (sdeworkspace) değişkenine ve nesne adına katılmak için os.path.join kullanılmasını önerir. Yani indata = os.path.join (sdeworkspace, "FeatureClass") olacaktır.
Alex Tereshenkov

0

ayrıca bağlantı yolunu doğrudan Sorgunuzda da tanımlayabilirsiniz.

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

ve Arama vb.

with arcpy.da.SearchCursor(PathSdeConnection,("OBJECTID","SHAPE@","SHAPE@JSON"),{WhereClause})as cursor:
     for row in cursor:
                       .
                       .
                       . 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.