Sejauh mana bahasa SQL dapat diakses melalui alat ArcGIS?

10

Pertanyaan itu terdengar sangat berlebihan ...
Bagaimanapun, saya telah diminta untuk mengeksplorasi penggunaan SQL di ArcGIS. Kami menggunakan SDE DB untuk semua penyimpanan sisi server dan pengelolaan DB / pengeditan skala besar. Namun, saya mencoba untuk menggali lebih dalam tentang seberapa terintegrasi SQL dalam alat-alat ArcGIS. Ada catatan dalam Panduan Referensi Kueri SQL dari bantuan ArcGIS 10 yang secara jelas menyatakan sintaks SQL tidak berfungsi saat menggunakan alat Kalkulator Bidang. Saya menemukan ini sangat mengecewakan karena akan tampak sangat berguna untuk dapat menarik dan memotong informasi langsung dari database itu sendiri ketika menghitung nilai-nilai bidang.

Apa batasan dan jebakan terbesar yang mungkin ada ketika mencoba menggunakan SQL di ArcGIS? Alat mana yang melihat fungsionalitas terbaik ketika terintegrasi dengan SQL?

Jika diperlukan contoh untuk menjadikan ini pertanyaan yang lebih jelas, saya mencoba melacak jumlah tempat menarik yang memiliki tipe tertentu di wilayah tertentu. Setiap titik memiliki atribut yang menggambarkan jenis dan wilayahnya. Solusi saya saat ini melibatkan penggunaan kursor yang banyak untuk penghitungan dan pengambilan data, tetapi seorang superior menunjukkan bahwa query SQL sederhana dapat melakukan semua ini dan lebih banyak lagi. Sayangnya, sepertinya fungsinya tidak ada untuk ini.

Atau itu?

Nathanus
sumber
Apakah salah satu tabel yang diminta versi versi?
Michael Todd
Berversi? Saya tidak berpikir saya akrab dengan istilah itu.
Nathanus
1
Versi sebuah lapisan memungkinkan seseorang untuk membuat perubahan pada lapisan sambil mempertahankan fitur sebelumnya. Jadi, jika suatu fitur dihapus, versi layer saat ini menunjukkan bahwa fitur tersebut tidak ada lagi; Namun, fitur tersebut sebenarnya masih ada di layer "base" dan alat GIS dapat digunakan untuk melihat berbagai versi layer yang menunjukkan fitur tersebut. Anda dapat mengetahui apakah layer Anda diversi dengan mengklik kanan layer di ArcCatalog dan memilih Properties. Bagian bawah tab General memiliki bagian yang disebut Versioning dan informasi di sini akan memberi tahu Anda jika layer tersebut diversi.
Michael Todd

Jawaban:

9

Jika Anda ingin menggunakan Python, lihat perintah ArcSDESQLExecute . Ini akan memungkinkan Anda menjalankan SQL arbitrer tetapi harus terhubung melalui SDE. Jika hasil kueri adalah serangkaian baris, atribut akan dikembalikan sebagai daftar daftar Python. Kalau tidak, itu akan mengembalikan True jika SQL dijalankan dengan sukses atau Tidak ada jika tidak. Lihat juga: Menjalankan SQL menggunakan koneksi ArcSDE

blah238
sumber
Saya pasti akan melakukannya! Sepertinya ini yang saya cari, dalam konteks ini. Terima kasih banyak.
Nathanus
5

Jika Anda menulis ArcObjects kustom, Anda dapat mengeksekusi SQL arbitrer terhadap WorkEdace SDE dengan menggunakan metode ExecuteSQL . Metode ini terbatas pada kueri yang tidak mengembalikan set hasil, seperti INSERT, UPDATE, atau beberapa prosedur tersimpan.

Jika Anda bekerja melalui ArcMap UI, opsi Anda sedikit lebih terbatas. Alasan mengapa Anda tidak dapat menggunakan SQL melalui Calculate Field adalah karena ekspresi sebenarnya adalah VBScript dan / atau Python. Anda bisa menggunakan VBScript atau Python untuk mengeksekusi ekspresi SQL sewenang-wenang dan menarik nilai dari kursor yang dihasilkan, tetapi saya tidak akan merekomendasikannya.

Atau, Anda dapat menggunakan jawaban Regan dan membuat Layer Kueri. Untuk data hanya baca, ini adalah pendekatan terbaik Anda. Jika Anda perlu memperbarui data, ini sedikit lebih rumit. Anda harus membuat lapisan kueri dengan nilai "baru" Anda, melakukan gabungan terhadap tabel yang ada, dan kemudian menggunakan bidang hitung. Ini dapat dikombinasikan dengan ExecuteSQL untuk melakukan pembaruan kompleks dan kemudian melihat hasilnya (agak kikuk).

Alternatif terakhir Anda adalah mengeksekusi SQL terhadap tabel ArcSDE secara langsung.

James Schek
sumber
1
Poin terakhir Anda (mengeksekusi SQL terhadap tabel secara langsung) adalah mengapa saya menanyakan pertanyaan versi saya. Kueri SQL di tingkat basis data hanya menarik dari lapisan dasar (kecuali jika seseorang mengatur tampilan multiversion), sehingga tidak akan berfungsi jika lapisan tersebut diversi.
Michael Todd
Pekerjaan yang saya lakukan sebagian besar dalam Python, tetapi tampaknya semakin banyak fungsi sebenarnya di UI bergantung pada ArcObjects.
Nathanus
Semuanya dibangun di atas ArcObjects secara internal, termasuk fungsionalitas python.
James Schek
jika ArcSDESQLExecute dalam Python dapat mengembalikan hasil, bagaimana hal yang sama dapat dicapai melalui IWorkspace.ExecuteSQL?
Petr Krebs
@petr Anda tidak bisa langsung ... Saya sudah memperbarui jawaban saya.
James Schek
1

Bergantung pada RDBMS apa yang Anda gunakan, Anda dapat memanfaatkan pustaka SQL di luar ArcObjects atau arcpy, selama Anda tidak bergantung pada mendapatkan data fitur kembali. Banyak pertanyaan dalam database SQL Server yang saya gunakan setiap hari tidak bersifat spasial, jadi saya akan menggunakan kelas System.Data di dalam .NET, atau pymssql Python library di dalam aplikasi Python. Jika Anda memang membutuhkan penggunaan data spasial, maka Query Layers adalah pilihan terbaik Anda. Satu-satunya peringatan dengan Layers Query adalah mereka hanya bekerja dengan data yang disimpan menggunakan tipe data spasial (bukan tipe SDEBINARY standar).

SagebrushGIS
sumber
Ini mulai menjadi intens. Saya kira saya perlu lebih hati-hati mengevaluasi kebutuhan saya. Saya tidak akan membutuhkan data "spasial", jika Anda maksudkan hal-hal seperti poligon dan titik / garis itu sendiri, tetapi cukup nilai dalam bidang teks / bilangan bulat.
Nathanus
Jika Anda perlu mengembalikan tipe geometri, maka saya akan menggunakan akses data ArcObjects / arcpy standar. Jika semua yang Anda lakukan adalah mengakses data "tabular" (tidak ada tipe spasial yang terlibat) maka cukup buat panggilan basis data menggunakan SqlConnections biasa (untuk SQL Server - tipe koneksi Anda mungkin berbeda). Hasilnya lebih fleksibel daripada apa yang Anda dapatkan dari ICursor. Jika saya mengerti pertanyaan Anda, dan Anda terbatas menggunakan kalkulator bidang, maka Anda tidak akan dapat menggunakan SQL mentah.
SagebrushGIS