Ganti / perbarui server / layanan secara permanen di setiap Lapisan ArcSDE di MXD?

8

Menggunakan metode mxd.findAndReplaceWorkspacePaths, jika dan MXD diperbarui dan jalur file koneksi .sde bergerak lagi semua sumber data akan rusak lagi.

Apakah ada metode untuk memperbarui setiap lapisan SDE secara permanen dalam Daftar Isi MXD untuk secara permanen menyimpan Server dan Layanan SDE? Yaitu. Cukup ganti SERVER dan INSTANCE untuk setiap lapisan SDE dalam MXD menggunakan python atau ArcObjects di Pyhton?

MMV
sumber
Sejauh yang saya tahu, Arcmap selalu menggunakan path ke file koneksi, misalnya "Database Connections\Connection to Foobar.sde", dan tidak ada cara untuk hanya meneruskan atau menyimpan info SERVER dan SERVICE secara langsung. Saya akan senang terbukti salah. Saya bisa membayangkan hack untuk menyimpan file sde yang dihasilkan secara dinamis di direktori yang sama dengan mxd, atau bahkan mungkin di dalam mxd, dan kemudian merujuknya sebagai gantinya; tidak tahu bagaimana menerapkannya.
matt wilkie
1
@ Matt, saya pikir itu tidak sepenuhnya benar; ArcMap akan menggunakan properti koneksi yang ada di dalam layer. File koneksi SDE tidak pernah dilihat lagi, jalurnya hanya metadata. Masalahnya di sini tampaknya khusus untuk metode penggantian sumber data arcpy. Anda pasti dapat mengatur properti koneksi tanpa menggunakan file koneksi dengan ArcObjects (misalnya menggunakan antarmuka IWorkspaceName ). Namun dengan arcpy Anda terbatas pada metode yang disediakan.
blah238
@ tikar Anda benar. Saya menggunakan metode Arcpy. Saya tidak bisa mendapatkan properti koneksi untuk setiap lapisan 'simpan'. Ketergantungan untuk memperoleh properti koneksi dari path ke file koneksi tetap setelah mxd.save () atau mxd.saveACopy ()
MMV

Jawaban:

7

Saya telah menemukan solusi untuk memutus ketergantungan pada jalur ke file koneksi .sde menggunakan ArcPy dan metode berikut.

Cara ini bekerja:

lyr.replaceDataSource(sdeConn, "SDE_WORKSPACE", lyr.datasetName, False)
table.replaceDataSource(sdeConn, "SDE_WORKSPACE", lyr.datasetName, False)

Anda dapat mengganti nama atau menghapus file koneksi setelah MXD telah diperbaiki dan disimpan. Ini akan terus terbuka tanpa masalah setelah file koneksi tidak ada lagi.

Metode-metode ini JANGAN bekerja:

mxd.findAndReplaceWorkspacePaths
lyr.findAndReplaceWorkspacePath

Anda TIDAK BISA mengganti nama atau menghapus file koneksi setelah MXD telah diperbaiki. MXD akan mencari file koneksi .sde di lokasi yang sama selalu setiap kali dibuka.

MMV
sumber
Saya menggunakan lyr.replaceDataSource, namun tampaknya arcmap tidak dapat mendeteksi sumber data baru karena menunjukkan "!" sebelum lapisan, jadi saya harus Memperbaiki sumber data dengan tangan. Ini kode saya:
Smalis
impor busur; mxd = arcpy.mapping.MapDocument (r "C: \ Users \ SMALIS \ Documents \ ArcGIS \ pythonSwitchSource.mxd"); untuk lyr di arcpy.mapping.ListLayers (mxd): jika lyr.supports ("DATASOURCE"): lyr.replaceDataSource ("C: \ Users \ SMALIS \ AppData \ Roaming \ ESRI \ Desktop10.2 \ ArcCatalog \ DB1.sde" , "SDE_WORKSPACE", lyr.datasetName, False) mxd.saveACopy (r "C: \ Users \ SMALIS \ Documents \ ArcGIS \ 1.mxd"); del mxd;
Smalis
Komentar Anda tentang metode yang untuk dataset fitur yang TIDAK BEKERJA telah menyelamatkan saya dari banyak upaya yang gagal. BESAR TERIMA KASIH! Saya setuju bahwa ini juga tidak berhasil bagi saya, apakah itu bug? lyr.workspacePath menunjukkan dataset fitur
woodwa
1

Anda perlu berjalan lapisan grup bersarang lalu gunakan arcpy.CreateArcSDEConnectionFile_managementuntuk membuat sde baru menggunakan parameter dari lyr.serviceProperties, dan meneruskan parameter sebagai servProp.getatau arcpy.GetParameterAsText(0).

Jangan lupa gunakan os.remove(temp_sde) if os.path.exsists(temp_sde) else None.

for maplayer in lyr_list:
    walknestedgroups(maplayer)
    servProp = maplayer.serviceProperties
    if maplayer.serviceProperties["ServiceType"] == "SDE":
        host = servProp.get('Server','N\A')
    if host in ("MyServer"):
        remap_sde(maplayer)
Andy
sumber
0

Ini mungkin terlalu sederhana tapi ...
Jika Anda mengganti nama koneksi lama dan beri nama yang baru dengan nama lama apakah itu memberikan hasil yang lebih baik?

Brad Nesom
sumber
Jika Anda menunjuk kembali setiap Layer dalam MXD untuk menggunakan file koneksi yang terletak di '\\ corpshare \ sde \ corpsde.sde' semuanya berfungsi dengan baik. Namun jika jalur itu menjadi tidak tersedia, setiap MXD sekarang rusak. ' Saya lebih tertarik pada properti koneksi SERVER dan LAYANAN dalam file koneksi, daripada jalur untuk itu. Saya ingin memperbarui setiap lapisan SERVER dan SERVICE, jadi jika jalur itu menjadi tidak tersedia, MXD masih dapat mengakses server tanpa jalur ke file koneksi yang valid.
MMV
@ MMV, Anda yakin? Saya baru saja mencobanya: 1) Tambahkan layer ke peta menggunakan file koneksi SDE 2) Simpan MXD dan tutup ArcMap 3) Hapus / ganti nama file koneksi SDE 4) Buka MXD yang disimpan. Lapisan dimuat tanpa masalah.
blah238
@ Blah238 benar saya telah melihat ini - jika file sde hilang masih terhubung ??? Apa yang saya pikirkan adalah jika Anda mengubah properti koneksi dalam file sde (untuk mengarahkannya ke server / layanan lain, maka ia akan menemukannya. (Seperti halnya Anda tidak membuka dan merusak tautan terlebih dahulu. Saya akan mencobanya dan kembali
Brad Nesom
Cukup baca posting blah238 di atas. Saya tidak menyadarinya. karena saya pernah mengalami masalah kata sandi sebelumnya dan memperbaikinya dengan mengubah string koneksi. mungkin triknya adalah memecahnya dan memperbaikinya dengan string koneksi baru. tetapi untuk menghentikannya Anda harus menghentikan layanan yang ada. ??
Brad Nesom
@ blah238 Dengan membuat MXD secara manual di ArcMap, menyimpannya dan menghapus file koneksi semuanya akan terus berfungsi setelah path ke file .sde telah 'rusak'. Memperbarui MXD yang sudah ada menggunakan ArcPy, di sinilah ketergantungan pada jalur ke file koneksi tetap.
MMV