Di mana cache fitur di ArcMap untuk ArcObjects untuk diakses?


8

Tampaknya ArcMap menyimpan cache untuk setiap lapisan yang berisi data fitur dan setiap kali ingin menyegarkan lapisan atau menerapkan perubahan, gunakan cache ini. Seperti yang saya temukan, ketika ArcMap ingin menggambar lapisan dari awal, mengirimkan kueri ini ke geodatabase:

pilih ObjectId, Shape dari "featureClassName" [di mana "ekspresi kueri definisi layer"]

Dalam mode pengeditan, saat menggunakan snapping, sepertinya fitur data dalam cache ini digunakan untuk menentukan snapping state saat pergerakan mouse. Saya tidak tahu bagaimana ArcMap menyimpan data spasial dalam cache ini, dalam format bentuk ESRI atau sebagai WKB, Tapi saya perlu retrive data fitur ini.

Apakah ada cara untuk mengambil kembali data fitur dari suatu lapisan menggunakan cache (lapisan cache) alih-alih menggunakan IFeatureClass::get_Featuremetode? ..... Mungkin ide saya tidak benar dan layer tidak memiliki cache (maksud saya cache yang opsional untuk layer dan meningkatkan kecepatan layer draw), tapi saya hampir yakin data spasial lapisan (peta) disimpan dalam memori ArcMap di suatu tempat dan ArcMap menggunakannya untuk operasinya seperti gertakan selama operasi edit. Apakah ada cara untuk mengakses bagian data ArcMap ini (jika benar-benar ada)?


Saya tidak ingin mengatur cache, saya ingin mengambil data dari ArcMap cache.ISpatialCacheManagertidak menawarkan metode apa pun untuk mendapatkan data tertentu dari itu. Biarkan saya membahas apa yang saya maksud dengan lebih detail.

Ketika saya memasukkan kode ini ke dalam program saya

//C#

IFeature ipF=ipMyFeatureClassObject.GetFeature(10);

ArcMap mengeluarkan perintah pilih untuk geodatabase, mari misalkan:

select * from MyFeatureClassTableName Where ObjectId=10

dan memberikan kembali catatan data.

Dalam mode edit, ArcMap tidak dapat menggunakan metode ini untuk mendapatkan data spasial dan menghitung status gertakan untuk fitur-fitur di peta karena penggunaan waktu yang dimiliki metode ini dan perhitungan gertakan memerlukan pengambilan data kecepatan tinggi, juga karena mouse dapat bergerak ke mana saja pada peta dan gertakan diaktifkan untuk zoom apa pun, semua saksi ini menunjukkan bahwa data spasial harus tersedia di suatu tempat di memori dan saya sedang mencari metode untuk mengaksesnya.

Jika semua konsumsi ini tidak menjadi kenyataan, maka harus ada metode sempurna yang ArcMap gunakan untuk mengambil data spasial dari geodatabase dengan cepat (misalnya pengindeksan spasial level 4 atau 6 level berdasarkan luas peta dan gunakan posisi mouse untuk mengambil sebagian saja data spasial sementara pergerakan mouse sangat cepat, dengan cara ini hanya memiliki akses ke geodatabase ketika area pengindeksan terkecil perubahan mouse).

Saya sedang berurusan dengan mengembangkan alat seperti "Sketch Tool dan" Edit tool "untuk sumber data selain dari sumber data ArcObject dan saya tidak ingin mengatur cache paralel dengan ArcMap. Jika memungkinkan saya ingin menggunakan data yang sama dengan ArcMap menyimpan dalam memori untuk sumber data ini.

Sekarang, apakah kalian pikir ini adalah asumsi yang benar dan jika ya apakah ada cara untuk mengakses data spasial ArcMap di memorinya?


1
Jika Anda telah membangun cache menggunakan ISpatialCacheManager, maka GetFeature (10) tidak akan mengeluarkan pernyataan Select ke database, itu akan menggunakan apa yang sudah ada dalam memori. Dengan kata lain caching transparan. Saya ingin tahu apa yang terjadi jika Anda menyimpan banyak fitur.
Kirk Kuykendall

1
Terima kasih Kirk, jika saya ingin men-cache sejumlah besar fitur, saya punya 3 pilihan, 1.OnClick tool 2.OnMouseDown 3.OnMouseMove 2 pilihan pertama menyebabkan enduser menjumpai penunjuk mouse jam pasir untuk waktu yang lama yang tidak dapat diterima baginya, yang ketiga membutuhkan algoritme yang tidak membuat penundaan dalam gerakan mouse untuk alat, misalnya area yang tepat di sekitar kursor mouse di-cache dan ketika kursor masuk ke cache area lain disegarkan, tapi saya tidak tahu bagaimana ini mekanisme harus diimplementasikan, menggunakan pengindeksan spasial (seperti apa sqlserver2008 menggunakan) atau menggunakan ISpatialFilter. Apakah ada ide o mengimplementasikannya?
Reza

1
Berikan detail lebih lanjut tentang alur kerja Anda. Mungkin Anda mencoba memberikan kemampuan mengedit untuk plugindatasource? Jika tidak, tanyakan pertanyaan ini: "Bagaimana saya bisa mendukung pengeditan plugindatasources?" Mungkin ini akan memberikan jawaban untuk Anda. Meskipun persyaratan khusus Anda mungkin berbeda, pertanyaan yang lebih umum akan menarik lebih banyak jawaban.
Kirk Kuykendall

Ya Kirk, itu hampir benar, karena Anda tahu plugin dataource hanya dapat dibaca dan asumsikan saya ingin toolbar seperti "Editor" untuk sumber data plugin atau dalam kasus saya sendiri "OLEDB dataource", karena toolbar editor tidak diaktifkan untuk sumber data ini ( dan untuk lapisan kustom juga). Sekarang, saya memiliki alat dan ekstensi untuk "Editor saya sendiri", tetapi saya ingin menambahkan kemampuan gertakan ke alat saya dan untuk ini, saya perlu cache dari semua geometri yang dimuat dalam lapisan (atau pada Setidaknya bagian dari itu di sekitar kursor mouse), jadi saya tidak perlu query database saat pergerakan mouse. Apakah ada juga untuk mengakses cache ArcMap untuk fitur plugin-oledb?
Reza

Jawaban:


6

Pada dasarnya, ekstensi Editor, saat dalam mode edit, mengelola sekumpulan snap agent (lihat ISnapEnvironment ). Setiap agen snap ini mungkin memiliki fitur cache yang terkait ( IFeatureSnapAgent.FeatureCache ) sehingga memotret dapat dilakukan tanpa mengeksekusi kueri spasial setiap kali Anda memindahkan kursor mouse. Jadi tidak ada cache fitur tunggal, tetapi biasanya lebih dari mereka tergantung pada jumlah lapisan yang dapat diedit dan jumlah agen gertakan dihidupkan.

Anda juga dapat menggunakan kelas FeatureCache secara terpisah, tanpa harus bekerja dengan Editor.


Terima kasih petr, menurut bantuan EDN, Featureecache adalah untuk sejumlah kecil fitur, bagaimana ArcMap dapat melakukan perhitungan untuk memotret dalam mode edit untuk sejumlah besar fitur, misalnya saya memiliki lebih dari 5.000 polyline pada sebuah layer dan bahkan secara penuh Sejauh ini, ArcMap masih dapat melakukan gertakan untuk simpul dan tepi?
Reza

1
Agen gertakan biasanya membangun kembali instance FeatureCache mereka setiap kali mouse meninggalkan area di mana cache terakhir dibuat. Ini membuat jumlah fitur dalam cache tetap kecil. Saat memotret, tidak ada mekanisme caching selain dari penggunaan IFeatureCache (kelas FeatureCache). Lihat contoh Agen Snap Buffer: resources.esri.com/help/9.3/ArcGISDesktop/dotnet/…
Petr Krebs

Harap perhatikan bahwa data saya bukan ArcObject, jadi beberapa antarmuka yang mengimplementasikan Edior Object, saya tidak dapat gunakan, misalnya saya harus menggunakan Sketch Tool saya sendiri, bukan dari toolbar toolbar Editor.
Reza

1
Saya mengerti itu, tetapi Anda jelas hanya dapat mengakses data ArcObjects dari cache ArcMap. Mekanisme caching berbasis ArcObjects untuk data non-ArcObjects tentu saja tidak tersedia. Pertanyaan Anda terdengar bahwa Anda sedang membuat data non-ArcObjects baru (menggunakan alat Anda sendiri), tetapi ingin mengambil snap ke data ArcObjects, meningkatkan caching seperti yang dilakukan ArcMap. Untuk itu, Anda BISA bekerja dengan editor. Tapi Anda tidak perlu semua, FeatureCache TIDAK memenuhi kebutuhan Anda jika digunakan secara terpisah dari editor.
Petr Krebs

1
Jika Anda ingin snap ke sumber data non-AO Anda sendiri, maka silakan formulasi ulang pertanyaan Anda karena tidak jelas. Tetapi jika itu masalahnya, mekanisme caching yang digunakan oleh ArcMap untuk memotret tidak akan berguna bagi Anda.
Petr Krebs

7

Jika Anda telah membangun cache menggunakan ISpatialCacheManager3 maka IFeatureClass.GetFeature akan bekerja lebih cepat ...

Mengaktifkan caching fitur meningkatkan kinerja semua pencarian spasial yang geometri kueri-nya terletak di dalam area yang di-cache dan dan juga meningkatkan kinerja semua kueri yang mengambil fitur berdasarkan ID objek (misalnya, GetRow, GetFeature, GetRows, dan GetFeatures) ... Di ArcGIS rilis 9.0 dan lebih tinggi, menggunakan ISpatialCacheManager tidak memerlukan sesi edit aktif.


Saya menambahkan beberapa baris ke pertanyaan asal karena pembatasan ruang dalam komentar bagian. Terima kasih kepada semua yang berpartisipasi dalam diskusi ini.
Reza

@KirkKuykendall Jawaban ini sedikit bertanggal, tetapi masih relevan. Sepengetahuan Anda, bagaimana ISpatialCacheManager memengaruhi metode lain, seperti ISelectionSet? Saya ingin tahu bagaimana cara memasukkan cache fitur ke dalam addin yang ada, yang sekarang digunakan pada kelas fitur SDE.
Barbarossa
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.