Registre a exibição e a camada SDE

11

Estou construindo visualizações simples em relação ao ArcSDE Oracle RAC 10g. Minhas colunas SHAPE são do tipo de dados SDO_GEOMETRY. ArcSDE 9.3.1.

Eu tenho várias tabelas de pontos, com o seguinte esboço:

ID (Guid) Nome (string) Forma (SHAPE)

Eu construí uma visão simples, como esta no Oracle!

CREATE OR REPLACE VIEW VW_POINTS AS

    SELECT ID, Name, Shape from TABLE_A

        UNION ALL

    SELECT ID, Name, Shape from TABLE_B

        -- etc

A exibição no Oracle é criada perfeitamente. Eu registrei essa visualização na linha de comando:

sdetable -o create_view -T PONTOS -t VW_POINTS -c Id, Nome, FORMA etc

A visualização do ArcSDE é criada novamente, tudo bem. Posso usar o ArcObjects para consultá-lo, etc. Agora preciso criar uma camada. Eu tentei as ferramentas de linha de comando, sdelayer -o register, mas não tive sucesso. Me dá uma mensagem dizendo que as visualizações não são suportadas.

Precisarei fazer isso várias vezes, às vezes usando sintaxe complexa para criar a exibição.

Qual é o problema? Como visualizar essas visualizações espaciais como camadas SDE (não preciso editá-las, basta visualizá-las espacialmente dentro do ArcMap)

Obrigado pela contribuição!

EDITAR

Esta é uma captura de tela no ArcMap, para sua descrição: P

Screenshot do ArcMap para sua felicidade :

Conforme solicitado, a seguir vem a descrição_longo

// create_view C: \ Users \ H> sdetable -o create_view -s server -i port -u user -p pass -T view_airspace_points -t vw_airspace_points_oracle -c "*"

nesse ponto, alterei a visão do oracle, incluindo um elenco como numérico (38,0) antes do registro.

// registra a camada C: \ Users \ H> sdelayer -o registre -l view_airspace_points, shape -C OBJECTID, USER - servidor g RTREE -s servidor -i porta -u usuário -p pass -ep -P HIGH

ArcSDE 9.3.1 para Oracle10g Build 2784 Ter 27 de outubro 10:51:14 2009

Utilitário de administração de camada

Descrição da camada ....:

Proprietário da tabela ..........: SIGMAGIS2

Nome da tabela ...........: VIEW_AIRSPACE_POINTS

Coluna espacial .......: SHAPE

ID da camada .............: 1398

SRID .................: 79

Identificação mínima da forma .....: 1

Deslocamento ...............:

falsex: -180.000000

falsey: -90.000000

Unidades do sistema .........: 994200.000000

Deslocamento Z ..............: 0.000000

Unidades Z ..............: 1.000000

Medir deslocamento .......:

Unidades de medida ........:

Tolerância de cluster XY.: 2.0

Índice espacial ........:

parâmetro: SPIDX_RTREE

existe: sim

formulário da matriz: -2,0,0

Envelope de camada .......:

minx: -180.00000, miny: -90.00000

maxx: 180.00000, maxy: 90.00000

Entidades .............: p

Tipo de camada ...........: Tipo espacial em linha

Data de criação ........: 28/06/11 09:28:45

Modo de E / S .............: NORMAL

Bloqueio automático ..........: Ativado

Precisão .............: Alta

Privilégios de usuário ......: SELECT, UPDATE, INSERT, DELETE

Sistema de coordenadas ....: GEOGCS ["Longitude / Latitude [WGS 84]", DATUM ["WGS 84", ESFÉIDE ["WGS 84", 6378137.0,298.257223563]], PRIMEM ["Greenwich", 0,0], UNIDADE [ "Decimal

Degree ", 0,0174532925199433]]

Configuração da camada ..: PADRÕES

George Silva
fonte
Então você precisa criar um arquivo de camada?
precisa saber é o seguinte
Não, preciso criar uma exibição dentro do geodatabase, que atue como uma classe de recurso.
George Silva
Então você precisa criar a visão espacial como você diz e eu mencionei abaixo; A única razão pela qual posso vê-lo não aparecer como uma camada espacial é fazer com as permissões. O ArcGIS / ArcSDE não o registrou corretamente; uma vez que esse é apenas o objetivo de uma camada espacial, unir dados espaciais e tabulares de maneira uniforme.
precisa saber é o seguinte
Quando você executa o description_long como 'sdetable -o descreva_longo -t victoria -u sasha -p polar.bear -i esri_40' na sua opinião, que resultados você obtém? Precisamos ver se a coluna espacial e o tipo de entidade estão sendo definidos e referenciados corretamente.
DEWright
1
DE obrigado pelo alerta. Eu fiz tudo corretamente, mas ainda não funciona. :( muito frustrante. Isso pode ser feito com uma pilha OpenSource com bastante facilidade .
George Silva

Respostas:

4

Eu tive isso (e problemas semelhantes) no passado. Sempre se resumia a duas coisas:

  1. A tabela espacial tinha algumas geometrias corrompidas / inválidas. O problema com o ArcMap é que, assim que encontrar uma geometria inválida, ele interromperá a renderização.

  2. O registro da camada está incorreto. O que também descobri é que o registro sdelayer -o nem sempre funciona corretamente e você precisa 'massagear' as entradas de registro.

Portanto, para verificar se a camada é válida, use PRIMEIRO a função SDO_GEOM.VALIDATE_LAYER_WITH_CONTEXT . Em seguida, use a função de validação do ArcSDE sdelayer -o feature_info -r invalid ... para obter recursos inválidos de acordo com o ArcSDE. Provavelmente junto com a lista sdelayer -o (veja aqui )

Para verificar o registro, você precisa voltar ao esquema do ArcSDE. As tabelas que controlam o registro são: SDE.LAYERS, SDE.TABLE_REGISTRY, SDE.COLUMN_REGISTRY, SDE.SPATIAL_REFERENCES e SDE.GEOMETRY_COLUMNS. Um truque que eu uso é que geralmente tenho uma camada 'base' que é semelhante (no que diz respeito aos tipos de geometria e colunas da chave primária) que EXIBE no ArcMap. Em seguida, comparo os registros de registro, entre a camada que é exibida e a que não é exibida. Você ficará surpreso ao descobrir a diferença que uma alteração de 1 em uma coluna inteira faz! :-)

Uma dica sobre COLUMN_REGISTRY - tudo o que você precisa fazer é garantir que a coluna Chave Primária (que é definida como ROWID_COLUMN no SDE.TABLE_REGISTRY) e a Coluna Espacial estejam corretas (ou iguais à camada exibida). Ignore todas as outras colunas. Se você adicionar a camada no ArcMap conectada como proprietário da tabela, as entradas ausentes na tabela COLUMN_REGISTRY serão adicionadas automaticamente.

Avise-me se isso ajudar!

mapoholic
fonte
agradecimentos mofólicos pela contribuição! Amanhã vou tentar! Espero que você esteja certo! Obrigado!
George Silva
respondeu mapoholic. Isso funcionou para diferentes tipos de registros, mas não para o UNIONED. No entanto, esta é uma dica incrível. Obrigado pela resposta.
George Silva
6

O que você está procurando é uma Visão espacial , agora a única questão importante que você verá aqui é que você precisa ter cuidado com os campos nos quais está ingressando. Esse é um processo muito bom, eu uso em todo o lugar em que generalizei meu DB para conversar com dados espaciais finos.

    sdetable -o create_view -T emp_region_view -t "employees,world.regions" 
-c "employees.name,employees.emp_id,world.regions.reg_id,world.regions.rname,world.regions.region"
-a "employee,eid,rid,region,area" -w "employees.emp_id = world.regions.emp_id"
-s myodbserver -i sde:oracle11g:ora1 -u gdb -p gdb.bdg

Isso deve ajudá-lo a encontrar o que deseja. A chave é fazer com que seus campos sejam mapeados corretamente. Costumo apenas fazer a visualização com o mínimo necessário e, em seguida, usar uma interface do usuário para editar essa visualização, uma vez registrada no SDE, para fazer meus ajustes mais detalhados.

DEWright
fonte
Olá DE Tentei esse método, mas ele não funciona. Pelo que entendi é que o ArcSDE cria um comando "CREATE FORCE VIEW", informando as colunas com antecedência e registrando apenas as colunas que você declara na cláusula. Tentei criar uma exibição vazia (usando apenas uma classe de recurso, para obter a definição geométrica) e substituí-la por outra definição. Ok, posso consultar isso via ArcMap, mas a geometria NÃO é mostrada no mapa.
George Silva
1
Se você arrastar a vista espacial do ArcCatalog para o ArcMap, ela não aparecerá com dados geométricos?
Britt Wescott
Como mencionado anteriormente, a camada não é exibida na visualização do ArcMap ou ArcCatalog, mas é listada como uma camada do tipo de geometria correta e é passível de consulta no ArcMap.
George Silva
1
Quando você executa o description_long como 'sdetable -o descreva_longo -t victoria -u sasha -p polar.bear -i esri_40' na sua opinião, que resultados você obtém? Precisamos ver se a coluna espacial e o tipo de entidade estão sendo definidos e referenciados corretamente.
DEWright
Vou postar os resultados aqui!
George Silva
3

Uma coisa que vejo faltando é uma coluna inteira exclusiva que o ArcObjects pode usar para o ID do objeto. Tente criar uma única sequência que manterá valores exclusivos para essa coluna de ID. Em seguida, crie disparadores de inserção em cada uma das tabelas para preencher a coluna de ID com o sequence.nextval.

No comando sdelayer -o register, certifique-se de definir o sinalizador -C na coluna de número inteiro com a palavra-chave USER, para que esri não tente gerenciar a coluna para você.

jrockers
fonte
1
Olá jrockers, o processo de registro funciona bem. leia minha própria resposta para o tópico. Estou usando uma coluna gerada pelo Oracle (ROWNUM) convertida como numérica (38,0). Obrigado pela dica, mas eu já tentei isso.
George Silva
3

Eu meio que examinei as respostas e ninguém parece ter observado que as consultas de união são um pouco problemáticas para visualizações espaciais com o ArcGIS. isso ocorre porque você quase certamente acabará com objetos duplicados. O mesmo se aplica às consultas de junção interna em que os predicados de junção não garantem um registro "pai" exclusivo. nos dois casos, embora a vista possa estar em conformidade com todos os requisitos de registro, ela não se comportará corretamente

Rob McPherson
fonte
Obrigado pela entrada Rob. Se você olhar atentamente a exibição que escrevi, ela gera OIDs rapidamente usando o Oracles ROWNUM. Eles são garantidos para ser único.
George Silva
1
Não estou 100% convencido sobre o uso do rownum se os dados estiverem sendo exibidos no arcmap (por exemplo). Rownum é uma função do conjunto de consultas oracle. portanto, cada vez que você executa uma consulta, obtém um novo conjunto de rownums a partir de 1. Isso pode significar que cada panorâmica / zoom etc produzirá um ID do objeto 1 e qualquer processo que espere usar ID do objeto em cache falhará, pois as consultas subsequentes produzirão um novo resultado. Você já viu a ferramenta make query table como uma opção para fazer com que o ArcGIS adicione a coluna objectid para você?
22611 Rob McPherson
2

Obrigado a todos que viram este tópico.

Bem, o processo é um pouco complicado, mas é possível registrar uma consulta complexa como uma camada, basta um pensamento astuto. Ainda não tenho certeza de quais são as implicações no desempenho nisso, mas tentarei manter isso atualizado. Também estou com problemas para visualizar os pontos no ArcMap, mas vou investigar mais.

Primeiro, crie uma visualização espacial complexa no seu RDBMS. Apenas certifique-se de ter uma coluna INTEGER UNIQUE NOT NULL na visualização, que pode ser usada posteriormente para registro no ArcSDE.

Minhas consultas eram apenas um monte de UNION ALL, semelhante a este:

    SELECT OBJECTID, ID_UNIQUE_ID, AIRSPACE_ID, NM_INDICATIVE, 'XXX' AS "ELEMENT_TYPE",SHAPE FROM tb_XXX    
        UNION ALL

    SELECT OBJECTID, ID_UNIQUE_ID, AIRSPACE_ID, NM_INDICATIVE, 'YYY' AS "ELEMENT_TYPE",SHAPE FROM TB_YYY

Nesse esquema, todos os meus objetos têm como PK ID_UNIQUE_ID, que é um GUID. Meus ObjectIDs se repetiram nas classes de recursos, portanto, não é uma boa opção para nosso ObjectID substituto.

Usei (no meu caso) a coluna virtual rownum do Oracle para agrupar todas as minhas consultas e criar uma exibição que tivesse um "objectID" efetivo. Dê uma olhada:

SELECT 
    CAST(ROWNUM AS NUMBER(38,0)) AS "FID",
    OBJECTID,
    ID_UNIQUE_ID,
    AIRSPACE_ID,
    NM_INDICATIVE,
    ELEMENT_TYPE,
    SHAPE 
FROM 
(
    SELECT OBJECTID, ID_UNIQUE_ID, AIRSPACE_ID, NM_INDICATIVE, 'ZZZ' AS "ELEMENT_TYPE",SHAPE FROM TB_ZZZ

        UNION ALL

    SELECT OBJECTID, ID_UNIQUE_ID, AIRSPACE_ID, NM_INDICATIVE, 'XXX' AS "ELEMENT_TYPE",SHAPE FROM tb_XXX

        UNION ALL

    SELECT OBJECTID, ID_UNIQUE_ID, AIRSPACE_ID, NM_INDICATIVE, 'YYY' AS "ELEMENT_TYPE",SHAPE FROM TB_YYY
)

Criei a visualização com a consulta acima e criei uma visualização em cima dela. Essa visão se tornará a camada espacial dentro do arcsde. Este é um processo bastante fácil.

Depois disso, tentei registrar minha visualização espacial como uma camada, mas sempre falhava. Quando você cria uma visão sobre ela, o ArcSDE assume que o FID é um número (38,10), um número de ponto flutuante, de acordo com o programa utilitário sdetable -o description.

No Oracle, esta era a definição para a exibição:

  CREATE OR REPLACE FORCE VIEW "schema"."layer_name" ("FID", "OBJECTID", "ID_UNIQUE_ID", "AIRSPACE_ID", "NM_INDICATIVE", "SHAPE") AS 
  SELECT  CAST(fid AS NUMBER(38,0)) AS FID, objectid, id_unique_id, airspace_id, nm_indicative, shape FROM  schema.VW_AIRSPACE_POINTS_ORACLE;

Depois de substituir a coluna fid por um elenco, tudo funcionou bem. Eu procedi ao registro da camada e ela correu bem.

EDITAR

A camada é exibida no ArcCatalog como uma camada de pontos e eu posso ver e selecionar a tabela no ArcMap como de costume (os pontos estão destacados), mas não consigo simbolizá-los e visualizá-los como uma camada regular. Algum pensamento?

Alguém tem alguma idéia de por que isso acontece? Está tudo bem, exceto que não consigo ver os objetos espaciais dentro do ArcMap. Alguma ideia?

George Silva
fonte
1
Você pode fazer muito com o desempenho dessa exibição, se você mantiver seus índices atualizados. Eu configurei trabalhos agendados para execução em sistemas com alto número de transações para manter os índices reconstruídos todas as noites. Então, quando você estiver fazendo suas junções, elas serão melhor ajustadas.
precisa saber é o seguinte
O que acontece se você arrastar e soltar do arccatalog para um novo mapa vazio no arcmap?
Kirk Kuykendall
O ArcMap o adiciona ao sumário, mas não renderiza nada. O estranho é que posso selecionar as linhas e a geometria dessa linha será desenhada (selecionada). Quando as linhas não são selecionadas, nada é desenhado. Consultar via ArcMap também funciona.
George Silva
1
Interessante. Se você escrever um código de objetos, como será o IGeoDataset.Extent para o featurelayer? E para a façanha?
Kirk Kuykendall
Vou tentar isso! Vamos ver.
George Silva
2

Por favor, tente executar o seguinte comando: sdelayer -o alter -l [-S] [-k] [-i | | ] [-s] [-D] -E calc -u [-p]

Priya J
fonte
Obrigado pelo comentário. Já tentei recalcular a extensão da camada.
George Silva
2

Na minha experiência, quando uma camada não está sendo exibida no Arc, é porque o índice espacial está ausente. As visualizações usam o índice espacial da tabela de origem, mas parece que você está criando um índice espacial para a visualização na sua declaração de registro.

Alguma das tabelas de origem possui índices espaciais? Caso contrário, tente criá-los no Oracle e registrar novamente a exibição sem o -g.

Outra possibilidade é que você esteja combinando geometria de duas tabelas em uma única coluna, sem ter certeza de que não, não tente antes.

MattL
fonte
Vou tentar isso Matt. Também estou combinando várias geometrias em uma em outra exibição e é meio crucial que isso funcione. Estamos construindo cadeias de linhas em uma visão e essa visão unida deveria ser o único ponto de suporte para essas camadas. Estou tentando outras abordagens, já que não estou vendo isso acontecer.
George Silva