Wo kann in ArcMap auf Feature-Cache zugegriffen werden, damit ArcObjects darauf zugreifen kann?

8

Es scheint, dass ArcMap einen Cache für jede Ebene verwaltet, die Feature-Daten enthält, und jedes Mal, wenn eine Ebene aktualisiert oder eine Änderung angewendet werden soll, dieser Cache verwendet wird. Wenn ArcMap eine Ebene von Grund auf neu zeichnen möchte, wird diese Abfrage an Geodatabase gesendet:

Wählen Sie ObjectId, Shape aus "featureClassName" [wobei "Layer Definition Query Expression"]

Im Bearbeitungsmodus scheinen bei Verwendung des Fangvorgangs die Feature-Daten in diesem Cache verwendet zu werden, um den Fangstatus während der Mausbewegung zu bestimmen. Ich weiß nicht, wie ArcMap räumliche Daten in diesem Cache, im ESRI-Formformat oder als WKB speichert, aber ich muss diese Feature-Daten abrufen.

Gibt es eine Möglichkeit, Feature-Daten eines Layers mithilfe seines Caches (Layer-Cache) abzurufen, anstatt eine IFeatureClass::get_FeatureMethode zu verwenden? ..... Vielleicht stimmt meine Idee nicht und eine Ebene hat keinen Cache (ich meine nicht den Cache, der für Ebenen optional ist und die Geschwindigkeit des Ebenenzeichnens erhöht), aber ich bin mir fast sicher, dass räumliche Daten vorhanden sind Die Anzahl der Layer (Map) wird irgendwo im ArcMap-Speicher gespeichert und von ArcMap für den Vorgang wie das Einrasten während des Bearbeitungsvorgangs verwendet. Gibt es eine Möglichkeit, auf diesen Teil der ArcMap-Daten zuzugreifen (falls tatsächlich vorhanden)?


Ich möchte keinen Cache einrichten, ich möchte Daten abrufen, ArcMap cache.ISpatialCacheManagerbietet keine Methode zum Abrufen bestimmter Daten daraus. Lassen Sie mich näher darauf eingehen, was ich meine.

Wenn ich diesen Code in mein Programm einfüge

//C#

IFeature ipF=ipMyFeatureClassObject.GetFeature(10);

ArcMap gibt einen Auswahlbefehl an die Geodatabase aus. Nehmen wir an:

select * from MyFeatureClassTableName Where ObjectId=10

und gibt eine Aufzeichnung von Daten zurück.

Im Bearbeitungsmodus kann ArcMap diese Methode nicht verwenden, um räumliche Daten abzurufen und den Fangstatus für Features auf der Karte zu berechnen, da diese Methode zeitaufwändig ist und die Fangberechnung einen Hochgeschwindigkeitsdatenabruf erfordert, auch weil sich die Maus überall auf der Karte bewegen kann Map and Snapping ist für jeden Zoom aktiviert. Alle diese Zeugen zeigen, dass räumliche Daten irgendwo im Speicher verfügbar sein müssen, und ich suche nach einer Methode, um darauf zuzugreifen.

Wenn all diese Verbrauchswerte nicht erfüllt werden, muss es eine perfekte Methode geben, mit der ArcMap räumliche Daten im laufenden Betrieb aus der Geodatabase abruft (z. B. räumliche Indizierung auf 4 oder 6 Ebenen basierend auf der Kartenausdehnung und die Mausposition, um nur einen Teil abzurufen von räumlichen Daten während der Mausbewegung sehr schnell, hat auf diese Weise nur dann Zugriff auf die Geodatabase, wenn sich der kleinste Indizierungsbereich der Maus ändert).

Ich beschäftige mich mit der Entwicklung eines Tools wie "Sketch Tool" und "Edit Tool" für eine andere Datenquelle als die ArcObject-Datenquelle und möchte keinen Cache parallel zu ArcMap einrichten. Wenn möglich, möchte ich dieselben Daten wie ArcMap verwenden speichert im Speicher für diese Datenquelle.

Glauben Sie, dass dies wahre Annahmen sind, und wenn ja, gibt es eine Möglichkeit, auf ArcMap-Geodaten in seinem Speicher zuzugreifen?

Reza
quelle
1
Wenn Sie mit ISpatialCacheManager einen Cache erstellt haben, gibt GetFeature (10) keine Select-Anweisung an die Datenbank aus, sondern verwendet das, was sich bereits im Speicher befindet. Mit anderen Worten, das Caching ist transparent. Ich wäre gespannt, was passiert, wenn Sie eine große Anzahl von Funktionen zwischenspeichern.
Kirk Kuykendall
1
Vielen Dank, Kirk. Wenn ich eine große Anzahl von Funktionen zwischenspeichern möchte, habe ich drei Möglichkeiten: 1. OnClick-Tool 2. OnMouseDown 3. OnMouseMove Die ersten beiden Optionen führen dazu, dass der Endbenutzer lange Zeit auf einen Sanduhr-Mauszeiger stößt, was nicht akzeptabel ist Für ihn benötigt der dritte einen Algorithmus, der die Mausbewegung für das Werkzeug nicht verzögert. Beispielsweise wird ein rechter Bereich um den Mauszeiger zwischengespeichert, und wenn der Cursor in einen anderen Bereich wechselt, wird der Cache aktualisiert, aber ich weiß nicht, wie dies funktioniert Der Mechanismus muss mithilfe der räumlichen Indizierung (wie von sqlserver2008 verwendet) oder mithilfe von ISpatialFilter implementiert werden. Gibt es eine Idee, ihn zu implementieren?
Reza
1
Bitte geben Sie weitere Details zu Ihrem Workflow an. Vielleicht versuchen Sie, Bearbeitungsfunktionen für eine Plugindatasource bereitzustellen? Wenn nicht, stellen Sie diese Frage vielleicht trotzdem: "Wie kann ich die Bearbeitung von Plugindatasources unterstützen?" Vielleicht würde dies eine Antwort für Sie liefern. Auch wenn Ihre speziellen Anforderungen unterschiedlich sein können, würde eine allgemeinere Frage mehr Antworten finden.
Kirk Kuykendall
Ja, Kirk, es ist fast wahr, da Sie wissen, dass die Plugin-Datenquelle schreibgeschützt ist und ich eine Symbolleiste wie "Editor" für eine Plugin-Datenquelle oder in meinem Fall "OLEDB-Datenquelle" möchte, da die Editor-Symbolleiste für diese Datenquellen nicht aktiviert wird ( und auch für benutzerdefinierte Ebenen). Gerade jetzt habe ich meine Werkzeuge und die Erweiterung für "Mein eigener Editor", aber ich möchte meinen Werkzeugen Fangfunktionen hinzufügen, und dafür benötige ich einen Cache aller in Ebenen geladenen Geometrien (oder bei Zumindest ein Teil davon um den Mauszeiger herum), damit ich während der Mausbewegung keine Datenbank abfragen muss. Gibt es überhaupt einen Zugriff auf den ArcMap-Cache für Plugin-Oledb-Funktionen?
Reza

Antworten:

6

Grundsätzlich verwaltet die Editor-Erweiterung im Bearbeitungsmodus eine Reihe von Snap-Agenten (siehe ISnapEnvironment ). Jedem dieser Fangagenten ist möglicherweise ein Feature-Cache ( IFeatureSnapAgent.FeatureCache ) zugeordnet, sodass das Fangen ohne Ausführen einer räumlichen Abfrage bei jedem Bewegen des Mauszeigers durchgeführt werden kann. Es gibt also keinen einzelnen Feature-Cache, sondern in der Regel mehr davon, abhängig von der Anzahl der bearbeitbaren Ebenen und der Anzahl der aktivierten Fangagenten.

Möglicherweise können Sie die FeatureCache- Klasse auch separat verwenden, ohne mit dem Editor arbeiten zu müssen.

Petr Krebs
quelle
Vielen Dank, petr, laut EDN-Hilfe ist Featurecache für eine kleine Anzahl von Features gedacht, wie ArcMap Berechnungen für das Einrasten im Bearbeitungsmodus für eine große Anzahl von Features durchführen kann, zum Beispiel habe ich mehr als 5.000 Polylinien auf einer Ebene und sogar vollständig Inwieweit kann ArcMap weiterhin nach Scheitelpunkten und Kanten suchen?
Reza
1
Die Fangagenten erstellen normalerweise ihre FeatureCache-Instanz jedes Mal neu, wenn die Maus den Bereich verlässt, über dem der Cache zuletzt erstellt wurde. Dies hält die Anzahl der Funktionen im Cache klein. Beim Einrasten gibt es keinen anderen Caching-Mechanismus als die Verwendung von IFeatureCache (FeatureCache-Klasse). Siehe das Buffer Snap Agent-Beispiel: resources.esri.com/help/9.3/ArcGISDesktop/dotnet/…
Petr Krebs
Bitte beachten Sie, dass mein Datenbestand kein ArcObject ist. Daher kann ich einige Schnittstellen, die Edior Object implementiert, nicht verwenden. Beispielsweise muss ich mein eigenes Skizzenwerkzeug anstelle der Editor-Symbolleisten verwenden.
Reza
1
Ich verstehe das, aber Sie können natürlich nur über den ArcMap-Cache auf ArcObjects-Daten zugreifen. ArcObjects-basierte Caching-Mechanismen für Nicht-ArcObjects-Daten sind natürlich nicht verfügbar. Ihre Frage klingt so, als würden Sie neue Nicht-ArcObjects-Daten erstellen (mit Ihren eigenen Werkzeugen), möchten jedoch an ArcObjects-Daten fangen und das Caching wie ArcMap nutzen. Dafür können Sie mit dem Editor arbeiten. Sie müssen jedoch nicht alle, FeatureCache erfüllt Ihre Anforderungen, wenn es separat vom Editor verwendet wird.
Petr Krebs
1
Wenn Sie auf Ihre eigene Nicht-AO-Datenquelle zugreifen möchten, formulieren Sie Ihre Frage neu, da dies nicht klar ist. In diesem Fall sind die von ArcMap zum Einrasten verwendeten Caching-Mechanismen für Sie ohnehin nutzlos.
Petr Krebs
7

Wenn Sie mit ISpatialCacheManager3 einen Cache erstellt haben, sollte IFeatureClass.GetFeature schneller funktionieren ...

Durch Aktivieren des Feature-Caching wird die Leistung aller räumlichen Suchvorgänge verbessert, deren Abfragegeometrie im zwischengespeicherten Bereich liegt, und die Leistung aller Abfragen, die Features anhand der Objekt-ID abrufen (z. B. GetRow, GetFeature, GetRows und GetFeatures) Für ArcGIS Release 9.0 und höher ist für die Verwendung von ISpatialCacheManager keine aktive Bearbeitungssitzung erforderlich.

Kirk Kuykendall
quelle
Ich habe der Ursprungsfrage einige Zeilen hinzugefügt, da der Platz im Kommentarbereich eingeschränkt ist. Vielen Dank an alle, die an dieser Diskussion teilnehmen.
Reza
@KirkKuykendall Diese Antwort ist etwas veraltet, scheint aber immer noch relevant zu sein. Wie wirkt sich der ISpatialCacheManager Ihrer Kenntnis nach auf andere Methoden aus, z. B. ISelectionSet? Ich bin gespannt, wie ein Feature-Cache in ein vorhandenes Add-In integriert werden kann, das jetzt für SDE-Feature-Classes verwendet wird.
Barbarossa