¿Dónde está el caché de entidades en ArcMap para que ArcObjects acceda?


8

Parece que ArcMap mantiene un caché para cada capa que contiene datos de entidades y cada vez que desea actualizar la capa o aplicar un cambio, utiliza este caché. Como descubrí, cuando ArcMap quiere dibujar una capa desde cero, envía esta consulta a la geodatabase:

seleccione ObjectId, Shape desde "featureClassName" [donde "expresión de consulta de definición de capa"]

En el modo de edición, cuando se usa el ajuste, parece que los datos de características en este caché se usan para determinar el estado de ajuste mientras se mueve el mouse. No sé cómo ArcMap almacena datos espaciales en este caché, en formato de forma ESRI o como WKB, pero necesito recuperar estos datos de entidades.

¿Hay alguna forma de recuperar datos de características de una capa usando su caché (caché de capa) en lugar de usar el IFeatureClass::get_Featuremétodo? ..... Tal vez mi idea no es correcta y una capa no tiene caché (no me refiero a la caché, que es opcional para las capas y aumenta la velocidad del dibujo de la capa), pero estoy casi seguro de datos espaciales de capas (mapa) se almacena en la memoria de ArcMap en algún lugar y ArcMap lo usa para su operación, como el ajuste durante la operación de edición. ¿Hay alguna forma de acceder a esta parte de los datos de ArcMap (si realmente existe)?


No quiero configurar un caché, quiero recuperar datos de ArcMap cache.ISpatialCacheManagerque no ofrece ningún método para obtener datos específicos de él. Déjame discutir lo que quiero decir con más detalles.

Cuando pongo este código dentro de mi programa

//C#

IFeature ipF=ipMyFeatureClassObject.GetFeature(10);

ArcMap emite un comando de selección para geodatabase, supongamos:

select * from MyFeatureClassTableName Where ObjectId=10

y devuelve un registro de datos.

En el modo de edición, ArcMap no puede usar este método para obtener datos espaciales y calcular el estado de ajuste para las entidades en el mapa debido a que este método consume mucho tiempo y el cálculo de ajuste necesita una recuperación de datos de alta velocidad, también porque el mouse puede moverse por todas partes el mapa y el ajuste están habilitados para cualquier zoom, todos estos testigos muestran que los datos espaciales deben estar disponibles en algún lugar de la memoria y estoy buscando un método para acceder a ellos.

Si todos estos consumos no se hacen realidad, entonces debe haber un método perfecto que ArcMap use para recuperar datos espaciales de la geodatabase sobre la marcha (por ejemplo, indexación espacial de 4 o 6 niveles en función de la extensión del mapa y use la posición del mouse para recuperar solo una parte de datos espaciales mientras el movimiento del mouse es muy rápido, de esta manera solo tiene acceso a la geodatabase cuando cambia el área de indexación más pequeña del mouse).

Estoy tratando de desarrollar una herramienta como "Herramienta de croquis y" Herramienta de edición "para una fuente de datos distinta de la fuente de datos de ArcObject y no quiero configurar una caché paralela a ArcMap. Si es posible, quiero usar los mismos datos que ArcMap almacena en la memoria para esta fuente de datos.

Ahora, ¿piensan que estos son supuestos verdaderos y si es así, hay alguna forma de acceder a los datos espaciales de ArcMap en su memoria?


1
Si ha creado una memoria caché con ISpatialCacheManager, GetFeature (10) no emitirá una instrucción Select a la base de datos, utilizará lo que ya está en la memoria. En otras palabras, el almacenamiento en caché es transparente. Sin embargo, me gustaría saber qué sucede si almacena en caché una gran cantidad de funciones.
Kirk Kuykendall

1
Gracias Kirk, si quiero almacenar en caché una gran cantidad de funciones, tengo 3 opciones, 1.OnClick tool 2.OnMouseDown 3.OnMouseMove Las primeras 2 opciones hacen que el usuario final encuentre un puntero de reloj de arena durante mucho tiempo, lo cual no es aceptable para él, el tercero necesita un algoritmo que no demore el movimiento del mouse para la herramienta, por ejemplo, se almacena en caché un área derecha alrededor del cursor del mouse y cuando el cursor entra en otra área, la caché se actualiza, pero no sé cómo esto El mecanismo debe implementarse, usando indexación espacial (como lo que utiliza sqlserver2008) o usando ISpatialFilter. ¿Alguna idea de implementarlo?
Reza

1
Proporcione más detalles de su flujo de trabajo. ¿Quizás está tratando de proporcionar capacidades de edición para una fuente de datos de plugin? Si no, tal vez haga esta pregunta de todos modos: "¿Cómo puedo soportar la edición de fuentes de datos de plugin?" Tal vez esto le brinde una respuesta. Aunque sus requisitos particulares pueden diferir, una pregunta más general atraería más respuestas.
Kirk Kuykendall

Sí Kirk, es casi cierto, ya que sabe que la fuente de datos del complemento es de solo lectura y supongo que quiero una barra de herramientas como "Editor" para una fuente de datos del complemento o en mi propio caso "fuente de datos OLEDB", porque la barra de herramientas del editor no se habilita para estas fuentes de datos ( y también para capas personalizadas). Por ahora, tengo mis herramientas y extensión para "Mi propio editor", pero quiero agregar la capacidad de ajuste a mis herramientas y para esto, necesito un caché de todas las geometrías cargadas en capas (o en menos parte de él alrededor del cursor del mouse), por lo que no tengo que consultar la base de datos mientras se mueve el mouse. ¿Hay alguna forma de acceder al caché de ArcMap para las características de plugin-oledb?
Reza

Respuestas:


6

Básicamente, la extensión del Editor, cuando está en modo de edición, gestiona un conjunto de agentes de ajuste (vea ISnapEnvironment ). Cada uno de estos agentes de ajuste puede tener un caché de características asociado ( IFeatureSnapAgent.FeatureCache ) para que el ajuste se pueda realizar sin ejecutar una consulta espacial cada vez que mueva el cursor del mouse. Por lo tanto, no hay una única memoria caché de características, pero generalmente hay más de ellas dependiendo de la cantidad de capas editables y la cantidad de agentes de ajuste activados.

También puede usar la clase FeatureCache por separado, sin la necesidad de trabajar con el Editor.


Gracias petr, de acuerdo con la ayuda de EDN, Featurecache es para un pequeño número de características, cómo ArcMap puede hacer cálculos para ajustar en modo de edición para una gran cantidad de características, por ejemplo, tengo más de 5,000 polilíneas en una capa e incluso en su totalidad Hasta cierto punto, ArcMap todavía puede hacer snap para vértices y bordes?
Reza

1
Los agentes de ajuste generalmente reconstruyen su instancia de FeatureCache cada vez que el mouse abandona el área sobre la cual se construyó la caché por última vez. Esto mantiene el número de características en el caché pequeño. Al ajustar, no hay ningún mecanismo de almacenamiento en caché que no sea el uso de IFeatureCache (clase FeatureCache). Vea el ejemplo de Buffer Snap Agent: resources.esri.com/help/9.3/ArcGISDesktop/dotnet/…
Petr Krebs

Tenga en cuenta que mi datasourse no es ArcObject, por lo que algunas interfaces que implementa Edior Object no puedo usar, por ejemplo, tengo que usar mi propia herramienta Sketch Tool en lugar de la barra de herramientas Editor.
Reza

1
Entiendo eso, pero obviamente solo puede acceder a los datos de ArcObjects desde la caché de ArcMap. Por supuesto, los mecanismos de almacenamiento en caché basados ​​en ArcObjects para datos que no son de ArcObjects no están disponibles. Su pregunta parece que está creando nuevos datos que no son de ArcObjects (usando sus propias herramientas), pero desea ajustar los datos de ArcObjects, aprovechando el almacenamiento en caché como lo hace ArcMap. Para eso, PUEDES trabajar con el editor. Pero no es necesario para todos, FeatureCache satisface sus necesidades si se usa por separado del editor.
Petr Krebs

1
Si desea elegir su propia fuente de datos que no sea AO, reformule su pregunta porque no está clara. Pero si ese es el caso, los mecanismos de almacenamiento en caché empleados por ArcMap para el ajuste serán inútiles para usted de todos modos.
Petr Krebs

7

Si ha creado una memoria caché con ISpatialCacheManager3 , IFeatureClass.GetFeature debería funcionar más rápido ...

La habilitación del almacenamiento en caché de características mejora el rendimiento de todas las búsquedas espaciales cuya geometría de consulta se encuentra dentro del área en caché y también mejora el rendimiento de todas las consultas que recuperan características por ID de objeto (por ejemplo, GetRow, GetFeature, GetRows y GetFeatures) ... En ArcGIS versión 9.0 y superior, el uso de ISpatialCacheManager no requiere una sesión de edición activa.


Agregué algunas líneas a la pregunta de origen debido a la restricción de espacio en la sección de comentarios. Gracias a todos los que participan en esta discusión.
Reza

@KirkKuykendall Esta respuesta está un poco anticuada, pero aún parece relevante. Que usted sepa, ¿cómo afecta ISpatialCacheManager a otros métodos, como ISelectionSet? Tengo curiosidad sobre cómo incorporar una memoria caché de características en un complemento existente, que ahora se está utilizando en las clases de características SDE.
Barbarroja
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.