Onde está o cache de recursos no ArcMap for ArcObjects para acessar?


8

Parece que o ArcMap mantém um cache para cada camada que contém dados de recursos e toda vez que deseja atualizar a camada ou aplicar uma alteração, usa esse cache. Como descobri, quando o ArcMap deseja desenhar uma camada do zero, envia essa consulta ao geodatabase:

selecione ObjectId, Shape em "featureClassName" [where "layer definition query expression"]

No modo de edição, ao usar o snap, parece que os dados dos recursos desse cache são usados ​​para determinar o estado do snap durante o movimento do mouse. Não sei como o ArcMap armazena dados espaciais nesse cache, no formato de forma ESRI ou como WKB, mas preciso recuperar esses dados de recursos.

Existe alguma maneira de recuperar dados de recurso de uma camada usando seu cache (cache de camada) em vez de usar o IFeatureClass::get_Featuremétodo? ..... Talvez minha ideia não esteja correta e uma camada não tenha nenhum cache (não me refiro ao cache, que é opcional para camadas e aumenta a velocidade do desenho da camada), mas tenho quase certeza de dados espaciais de camadas (mapa) é armazenado na memória do ArcMap em algum lugar e o ArcMap o utiliza para sua operação, como encaixe durante a operação de edição. Existe alguma maneira de acessar essa parte dos dados do ArcMap (se realmente existir)?


Não quero configurar um cache, quero recuperar dados ArcMap cache.ISpatialCacheManagernão oferece nenhum método para obter dados específicos dele. Deixe-me discutir o que quero dizer com mais detalhes.

Quando eu coloco esse código dentro do meu programa

//C#

IFeature ipF=ipMyFeatureClassObject.GetFeature(10);

O ArcMap emite um comando select para o geodatabase, vamos supor:

select * from MyFeatureClassTableName Where ObjectId=10

e devolve um registro de dados.

No modo de edição, o ArcMap não pode usar esse método para obter dados espaciais e calcular o estado de snap para recursos no mapa, devido ao tempo que esse método possui e o cálculo de snap precisa de uma recuperação de dados em alta velocidade, também porque o mouse pode se mover em qualquer lugar do map and snapping está ativado para qualquer zoom, todas essas testemunhas mostram que os dados espaciais devem estar disponíveis em algum lugar da memória e estou procurando um método para acessá-los.

Se todos esses consumos não se concretizarem, deve haver um método perfeito que o ArcMap use para recuperar dados espaciais do geodatabase em tempo real (por exemplo, indexação espacial de 4 ou 6 níveis com base na extensão do mapa e use a posição do mouse para recuperar apenas parte de dados espaciais enquanto o mouse se move muito rápido, dessa maneira só tem acesso ao banco de dados geográfico quando a menor área de indexação do mouse é alterada).

Estou lidando com o desenvolvimento de uma ferramenta como "Sketch Tool e" Edit tool "para uma fonte de dados que não seja a fonte de dados ArcObject e não quero configurar um cache paralelo ao ArcMap. Se possível, quero usar os mesmos dados que o ArcMap armazena na memória essa fonte de dados.

Agora, vocês acham que essas são suposições verdadeiras e se sim, existe alguma maneira de acessar os dados espaciais do ArcMap em sua memória?


1
Se você criou um cache usando o ISpatialCacheManager, o GetFeature (10) não emitirá uma instrução Select no banco de dados, ele utilizará o que já está na memória. Em outras palavras, o armazenamento em cache é transparente. Eu ficaria curioso para saber o que acontece se você armazenar em cache um grande número de recursos.
Kirk Kuykendall

1
Obrigado Kirk, se eu quiser armazenar em cache um grande número de recursos, tenho 3 opções: ferramenta 1.OnClick 2.OnMouseDown 3.OnMouseMove as 2 primeiras escolhas fazem com que o usuário encontre um ponteiro de ampulheta por um longo tempo, o que não é aceitável para ele, o terceiro precisa de um algoritmo que não atrase o movimento do mouse para a ferramenta, por exemplo, uma área correta ao redor do cursor do mouse é armazenada em cache e quando o cursor entra em outra área, o cache é atualizado, mas não sei como isso O mecanismo deve ser implementado, usando a indexação espacial (como o que o sqlserver2008 usa) ou usando o ISpatialFilter. Alguma idéia para implementá-lo?
Reza

1
Forneça mais detalhes do seu fluxo de trabalho. Talvez você esteja tentando fornecer recursos de edição para um plugindatasource? Se não, talvez faça esta pergunta de qualquer maneira: "Como posso suportar a edição de plugindatasources?" Talvez isso lhe dê uma resposta. Mesmo que seus requisitos particulares possam diferir, uma pergunta mais geral atrairia mais respostas.
21411 Kirk Kuykendall

Sim Kirk, é quase verdade, como você sabe que a fonte de dados do plug-in é somente leitura e, como eu quero, uma barra de ferramentas como "Editor" para uma fonte de dados do plug-in ou, no meu próprio caso, "OLEDB datasource", porque a barra de ferramentas do editor não é ativada para essas fontes de dados ( e agora também para camadas personalizadas. Agora, tenho minhas ferramentas e extensão para "Meu próprio editor", mas quero adicionar capacidade de encaixe às minhas ferramentas e, para isso, preciso de um cache de todas as geometrias carregadas nas camadas (ou em menos parte dele em torno do cursor do mouse), para que eu não precise consultar o banco de dados durante o movimento do mouse. Existe alguma maneira de acessar o cache do ArcMap para obter os recursos do plugin-oledb?
Reza

Respostas:


6

Basicamente, a extensão do Editor, no modo de edição, gerencia um conjunto de agentes de snap (consulte ISnapEnvironment ). Cada um desses agentes de snap pode ter um cache de recurso associado ( IFeatureSnapAgent.FeatureCache ) para que o snap possa ser feito sem executar uma consulta espacial toda vez que você mover o cursor do mouse. Portanto, não há um único cache de recurso, mas normalmente mais deles, dependendo do número de camadas editáveis ​​e do número de agentes de snap ativados.

Você também pode usar a classe FeatureCache separadamente, sem a necessidade de trabalhar com o Editor.


Obrigado petr, de acordo com a ajuda do EDN, featurecache é para um pequeno número de recursos, como o ArcMap pode fazer cálculos para encaixar no modo de edição de um grande número de recursos, por exemplo, tenho mais de 5.000 polilinhas em uma camada e até na íntegra extensão, o ArcMap ainda pode fazer snap para vértices e arestas?
Reza

1
Os agentes de snap geralmente reconstroem sua instância do FeatureCache sempre que o mouse sai da área sobre a qual o cache foi criado pela última vez. Isso mantém pequeno o número de recursos no cache. Ao encaixar, não há mecanismo de armazenamento em cache que não seja o uso IFeatureCache (classe FeatureCache). Veja o exemplo do Buffer Snap Agent: resources.esri.com/help/9.3/ArcGISDesktop/dotnet/…
Petr Krebs

Por favor, preste atenção que meu curso de dados não é do ArcObject; portanto, algumas interfaces que o Edior Object implementa, não posso usar, por exemplo, tenho que usar minha própria ferramenta de esboço em vez da barra de ferramentas do editor.
Reza

1
Entendo isso, mas obviamente você pode acessar apenas os dados do ArcObjects a partir do cache do ArcMap. Os mecanismos de cache baseados em ArcObjects para dados que não são do ArcObjects obviamente não estão disponíveis. Sua pergunta parece que você está criando novos dados que não são do ArcObjects (usando suas próprias ferramentas), mas deseja fazer o snap aos dados do ArcObjects, aproveitando o cache como o ArcMap. Para isso, você PODE trabalhar com o editor. Mas você não precisa de tudo, o FeatureCache satisfaz suas necessidades se usado separadamente do editor.
Petr Krebs

1
Se você deseja ajustar à sua própria fonte de dados que não seja AO, reformule sua pergunta porque ela não está clara. Mas, se for esse o caso, os mecanismos de cache empregados pelo ArcMap para o snap serão inúteis para você de qualquer maneira.
Petr Krebs

7

Se você criou um cache usando ISpatialCacheManager3 , o IFeatureClass.GetFeature deve funcionar mais rápido ...

A ativação do cache de recursos melhora o desempenho de todas as pesquisas espaciais cuja geometria de consulta está dentro da área em cache e também melhora o desempenho de todas as consultas que recuperam recursos por ID do objeto (por exemplo, GetRow, GetFeature, GetRows e GetFeatures) ... O ArcGIS versão 9.0 e superior, usando ISpatialCacheManager, não requer uma sessão de edição ativa.


Eu adicionei algumas linhas para a pergunta de origem por causa da restrição de espaço na seção de comentários. Obrigado a todos os que participam dessa discussão.
Reza

@KirkKuykendall Esta resposta é um pouco datada, mas ainda parece relevante. Para seu conhecimento, como o ISpatialCacheManager afeta outros métodos, como ISelectionSet? Estou curioso para saber como incorporar um cache de recursos em um suplemento existente, que agora está sendo usado nas classes de recursos SDE.
Barbarossa
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.