ArcObjects for ArcObjectsのフィーチャキャッシュはどこにアクセスしますか?


8

ArcMapはフィーチャデータを含むすべてのレイヤーのキャッシュを保持しているようで、レイヤーを更新したり変更を適用したりするたびに、このキャッシュを使用します。私が見つけたように、ArcMapが最初からレイヤーを描画する場合、このクエリをジオデータベースに送信します。

"featureClassName"からObjectId、Shapeを選択します[ここで "レイヤー定義クエリ式"]

編集モードでスナップを使用する場合、このキャッシュ内のフィーチャデータは、マウスの移動中のスナップ状態を決定するために使用されるようです。ArcMapが空間データをこのキャッシュ、ESRIシェイプ形式、またはWKBとしてどのように格納するのかわかりませんが、これらのフィーチャデータを取得する必要があります。

IFeatureClass::get_Featureメソッドを使用する代わりに、そのキャッシュ(レイヤーキャッシュ)を使用してレイヤーのフィーチャデータを取得する方法はありますか?.....たぶん私の考えは正しくなく、レイヤーにキャッシュがありません(レイヤーのオプションであり、レイヤー描画の速度を向上させるキャッシュを意味するわけではありません)が、空間データはほぼ確実ですレイヤー(マップ)の一部はArcMapのメモリのどこかに保存され、ArcMapは編集操作中のスナップなどの操作にそれを使用します。ArcMapデータのこの部分にアクセスする方法はありますか(実際に存在する場合)?


キャッシュをセットアップしたくありArcMap cache.ISpatialCacheManagerません。データを取得したいのですが、キャッシュから特定のデータを取得する方法がありません。私が何を言っているのかをもっと詳しく説明しましょう。

このコードをプログラム内に配置すると

//C#

IFeature ipF=ipMyFeatureClassObject.GetFeature(10);

ArcMapがジオデータベースに選択コマンドを発行するとします。

select * from MyFeatureClassTableName Where ObjectId=10

データの記録を返します。

編集モードでは、ArcMapはこのメソッドを使用して空間データを取得し、マップ上のフィーチャのスナップ状態を計算できません。このメソッドには時間がかかり、スナップ計算には高速データの取得が必要です。また、マウスはどこにでも移動できるためです。マップとスナップはすべてのズームで有効になっています。これらすべての目撃者は、空間データがメモリ内のどこかで利用可能でなければならないことを示しており、それにアクセスする方法を探しています。

これらすべての消費量が満たされない場合、ArcMapがジオデータベースから空間データをその場で取得するために使用する完璧な方法が必要です(たとえば、マップ範囲に基づいた4または6レベルの空間インデックスとマウス位置を使用してパーツのみを取得する)マウスの動きが非常に速いときの空間データのこの方法では、マウスの最小インデックス領域が変更されたときにのみジオデータベースにアクセスできます。

ArcObjectデータソース以外のデータソース用に「スケッチツール」や「編集ツール」などのツールを開発していて、ArcMapと並行してキャッシュを設定したくない場合は、ArcMapと同じデータを使用したいこのデータソースのメモリに格納します。

さて、皆さんはこれらが本当の前提であると思いますか?そうであれば、そのメモリ内のArcMap空間データにアクセスする方法はありますか?


1
ISpatialCacheManagerを使用してキャッシュを構築した場合、GetFeature(10)はデータベースにSelectステートメントを発行せず、すでにメモリにあるものを使用します。つまり、キャッシングは透過的です。ただし、多数の機能をキャッシュするとどうなるか知りたいです。
カークカイケンダル

1
Kirkに感謝します。多数の機能をキャッシュしたい場合は、3つの選択肢があります。1.OnClickツール2.OnMouseDown 3.OnMouseMove最初の2つの選択肢により、エンドユーザーが砂時計のマウスポインターに長時間遭遇するため、許容できません。彼にとって、3番目には、ツールのマウスの動きを遅延させないアルゴリズムが必要です。たとえば、マウスカーソルの周りの右側の領域がキャッシュされ、カーソルが別の領域に移動すると、キャッシュが更新されますが、これがどのように行われるかわかりません(sqlserver2008が使用するような)空間インデックスを使用するか、ISpatialFilterを使用してメカニズムを実装する必要があります。
Reza

1
ワークフローの詳細を入力してください。おそらく、あなたはplugindatasourceに編集機能を提供しようとしていますか?そうでない場合は、とにかくこの質問をする:「plugindatasourcesの編集をサポートするにはどうすればよいですか?」おそらくこれはあなたに答えを与えるでしょう。特定の要件が異なる場合でも、より一般的な質問はより多くの回答を集めます。
カークカイケンダル

はい、Kirk、それはほぼ真実です。プラグインデータソースが読み取り専用であり、プラグインデータソースに「エディター」のようなツールバーが必要であるか、または私自身のケースでは「OLEDBデータソース」が必要な場合、エディターツールバーがこれらのデータソースに対して有効になっていないためです(とカスタムレイヤーの場合も)今、「自分のエディター」用のツールと拡張機能がありますが、ツールにスナップ機能を追加したいので、レイヤーに読み込まれたすべてのジオメトリのキャッシュが必要です(または少なくともマウスカーソルの周りの一部)、マウスの移動中にデータベースを照会する必要はありません。プラグインoledb機能のArcMapキャッシュにアクセスする方法はありますか?
Reza

回答:


6

基本的に、エディター拡張機能は、編集モードのときに一連のスナップエージェントを管理します(ISnapEnvironmentを参照)。これらの各スナップエージェントには、関連する機能キャッシュ(IFeatureSnapAgent.FeatureCache)があり、マウスカーソルを移動するたびに空間クエリを実行せずにスナップを実行できます。そのため、単一の機能キャッシュはありませんが、通常、編集可能なレイヤーの数とオンになっているスナップエージェントの数に応じて、より多くのキャッシュがあります。

エディターを操作する必要なく、FeatureCacheクラスを個別に使用することもできます。


EDNヘルプによれば、petrに感謝します。featurecacheは少数のフィーチャ用で、ArcMapは多数のフィーチャの編集モードでスナップするための計算をどのように行うことができますか。範囲、ArcMapはまだ頂点とエッジのスナップを実行できますか?
Reza、2011

1
通常、スナップエージェントは、キャッシュが最後に構築された領域からマウスが離れるたびに、FeatureCacheインスタンスを再構築します。これにより、キャッシュ内の機能の数が少なくなります。スナップする場合、IFeatureCache(FeatureCacheクラス)の使用以外のキャッシュメカニズムはありません。:バッファスナップエージェントのサンプルを参照してくださいresources.esri.com/help/9.3/ArcGISDesktop/dotnet/...
ペトル・クレブス

データソースはArcObjectのものではないため、Edior Objectが実装する一部のインターフェイスは使用できません。たとえば、エディターツールバーの代わりに独自のスケッチツールを使用する必要があります。
Reza

1
わかりましたが、ArcMapのキャッシュからのみArcObjectsデータにアクセスできます。ArcObjects以外のデータ用のArcObjectsベースのキャッシュメカニズムは、もちろん利用できません。(独自のツールを使用して)新しい非ArcObjectsデータを作成しているが、ArcMapのようにキャッシュを利用して、ArcObjectsデータにスナップしたいという質問です。そのためには、エディターを使用できます。ただし、すべてが必要なわけではありません。FeatureCacheは、エディターとは別に使用すればニーズを満たします。
Petr Krebs

1
独自の非AOデータソースにスナップする場合は、明確ではないため、質問を再定式化してください。しかし、その場合は、スナップのためにArcMapで採用されているキャッシュメカニズムはとにかく役に立たないでしょう。
ペトルクレブス

7

ISpatialCacheManager3を使用してキャッシュを構築した場合、IFeatureClass.GetFeatureはより高速に動作するはずです...

機能のキャッシュを有効にすると、クエリジオメトリがキャッシュされた領域内にあるすべての空間検索のパフォーマンスが向上し、オブジェクトID(たとえば、GetRow、GetFeature、GetRows、GetFeatures)で機能を取得するすべてのクエリのパフォーマンスも向上します。 ArcGISリリース9.0以降では、ISpatialCacheManagerを使用するためにアクティブな編集セッションは必要ありません。


コメントセクションのスペースの制限のため、元の質問にいくつかの行を追加しました。このディスカッションに参加してくれたすべての人に感謝します。
Reza

@KirkKuykendallこの回答は少し古くなっていますが、まだ関連性があるようです。ご存知のように、ISpatialCacheManagerはISelectionSetなどの他のメソッドにどのように影響しますか?SDE機能クラスで現在使用されている既存のアドインに機能キャッシュを組み込む方法に興味があります。
バルバロッサ、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.