Registra vista SDE e livello


11

Sto costruendo viste semplici contro un ArcSDE Oracle RAC 10g. Le mie colonne SHAPE sono del tipo di dati SDO_GEOMETRY. ArcSDE 9.3.1.

Ho diverse tabelle di punti, con il seguente schema:

ID (Guid) Nome (stringa) Forma (FORMA)

Ho creato una vista semplice come quella in 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

La vista in Oracle è stata creata perfettamente. Ho registrato questa vista con la riga di comando:

sdetable -o create_view -T POINTS -t VW_POINTS -c ID, nome, FORMA ecc

La vista ArcSDE viene nuovamente creata, bene. Posso usare ArcObjects per interrogarlo, ecc. Ora ho bisogno di creare un livello. Ho provato gli strumenti da riga di comando, sdelayer -o register, ma non ho avuto successo. Mi dà un messaggio, dicendo che le visualizzazioni non sono supportate.

Dovrò farlo più volte, a volte usando una sintassi complessa per costruire la vista.

Qual è il problema? Come posso visualizzare queste viste spaziali come livelli SDE (non ho bisogno di modificarle, basta vederle spazialmente all'interno di ArcMap)

Grazie per l'input!

MODIFICARE

Questo è uno screenshot in ArcMap, per la tua delicatezza: P

Screenshot ArcMap per la tua felicità :

Come richiesto, ecco la descrizione

// 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 "*"

a questo punto ho modificato la vista sull'oracolo, incluso un cast come numerico (38,0) prima della registrazione.

// registra il livello C: \ Users \ H> sdelayer -o register -l view_airspace_points, shape -C OBJECTID, USER - g RTREE -s server -i port -u user -p pass -ep -P HIGH

ArcSDE 9.3.1 per Oracle10g Build 2784 mar 27 ott 10:51:14 2009

Utilità di amministrazione dei livelli

Descrizione del livello ....:

Proprietario della tabella ..........: SIGMAGIS2

Nome tabella ...........: VIEW_AIRSPACE_POINTS

Colonna spaziale .......: FORMA

ID livello .............: 1398

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

ID forma minima .....: 1

Compensare ...............:

falsex: -180.000000

falso: -90.000000

Unità di sistema .........: 994200.000000

Z Offset ..............: 0.000000

Unità Z ..............: 1.000000

Misura offset .......:

Unità di misura ........:

Tolleranza cluster XY.: 2.0

Indice spaziale ........:

parametro: SPIDX_RTREE

esiste: si

modulo array: -2,0,0

Busta a strati .......:

minx: -180.00000, miny: -90.00000

maxx: 180.00000, maxy: 90.00000

Entità .............: p

Tipo di livello ...........: Tipo spaziale in linea

Data di creazione ........: 28/06/11 09:28:45

Modalità I / O .............: NORMALE

Blocco automatico ..........: abilitato

Precisione .............: alta

Privilegi utente ......: SELEZIONA, AGGIORNA, INSERISCI, ELIMINA

Sistema di coordinate ....: GEOGCS ["Longitudine / Latitudine [WGS 84]", DATUM ["WGS 84", SPHEROID ["WGS 84", 6378137.0.298.257223563]], PRIMEM ["Greenwich", 0.0], UNIT [ "Decimale

Grado", ,0174532925199433]]

Configurazione layer ..: DEFAULTS


Quindi è necessario creare un file di livello?
DEWright,

No, devo creare una vista all'interno del geodatabase, che si comporta come una featureclass.
George Silva,

Quindi dovrai creare la vista spaziale come dici tu e menzionerò di seguito; L'unico motivo per cui riesco a vederlo non comparire come layer spaziale è quello delle autorizzazioni. ArcGIS / ArcSDE non lo hanno registrato correttamente; poiché quello è solo lo scopo di un livello spaziale, unire dati spaziali e tabulari in modo uniforme.
DEWright,

Quando esegui la descrizione_long come 'sdetable -o descritto_long -t victoria -u sasha -p polar.bear -i esri_40' a tuo avviso, quali risultati ottieni? Dobbiamo vedere se la colonna spaziale e il tipo di entità vengono impostati e referenziati correttamente.
DEWright,

1
DE grazie per l'avviso. Ho fatto tutto correttamente, ma ancora non funziona. :( molto frustating. Questo può essere fatto abbastanza facilmente con uno stack OpenSource .
George Silva,

Risposte:


4

Ho avuto questo (e problemi simili) in passato. Si riduceva sempre a due cose:

  1. La tabella spaziale aveva alcune geometrie corrotte / non valide. Il problema con ArcMap è che non appena rileva una geometria non valida, il rendering si interrompe.

  2. La registrazione del livello non è corretta. Quello che ho anche scoperto è che il registro sdelayer -o non funziona sempre correttamente e devi "massaggiare" le voci di registrazione.

Quindi, per verificare se il layer è valido, usare FIRST la funzione SDO_GEOM.VALIDATE_LAYER_WITH_CONTEXT . Quindi utilizzare la funzione di convalida ArcSDE sdelayer -o feature_info -r invalid ... per ottenere funzionalità non valide secondo ArcSDE. Probabilmente insieme a sdelayer -o list (vedi qui )

Per controllare la registrazione, è necessario tornare allo schema ArcSDE. Le tabelle che controllano la registrazione sono: SDE.LAYERS, SDE.TABLE_REGISTRY, SDE.COLUMN_REGISTRY, SDE.SPATIAL_REFERENCES e SDE.GEOMETRY_COLUMNS. Un trucco che uso è che di solito ho un livello 'base' simile (per quanto riguarda i tipi di geometria e le colonne chiave primaria) che VISUALIZZA in ArcMap. Quindi confronto i record di registrazione, tra il livello visualizzato e poi uno che non lo fa. Sarai sorpreso di scoprire che differenza fa una modifica di 1 in una colonna intera! :-)

Un suggerimento su COLUMN_REGISTRY: tutto ciò che devi fare è assicurarti che la colonna Chiave primaria (che è definita come ROWID_COLUMN in SDE.TABLE_REGISTRY) e la Colonna spaziale siano corrette (o uguali al livello visualizzato). Ignora tutte le altre colonne. Se aggiungi il layer in ArcMap connesso come proprietario della tabella, le voci mancanti nella tabella COLUMN_REGISTRY verranno aggiunte automaticamente.

Fammi sapere se questo aiuta!


grazie mapholic per l'input! Lo proverò prima cosa domani! Spero tu abbia ragione! Grazie!
George Silva,

rispose mapoholic. Questo ha funzionato per diversi tipi di registrazioni, ma non per UNIONED. Tuttavia, questo è un consiglio straordinario. Grazie per la risposta.
George Silva,

6

Quello che stai cercando è una Vista spaziale , ora l'unico grande problema che vedrai qui è che devi stare attento con i campi su cui ti stai unendo. Questo è un processo piuttosto carino, lo uso dappertutto dove ho generalizzato il mio DB per parlare con dati spaziali sottili.

    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

Questo dovrebbe portarti sulla buona strada per quello che vuoi. La chiave sta facendo in modo che i campi vengano mappati correttamente. Tendo a fare la vista con il minimo necessario, quindi utilizzare un'interfaccia utente per modificare quella vista una volta registrata in SDE per fare le mie modifiche più precise.


Ciao DE Ho provato questo metodo ma non funziona. Per quello che ho capito è che ArcSDE crea un comando "CREATE FORCE VIEW", indicando prima le colonne e registrando solo le colonne che dichiari nella clausola. Ho provato a creare una vista vuota (usando solo una classe di funzionalità, per ottenere la definizione geometrica) e sostituirla con un'altra definizione. Ok, posso interrogarlo tramite ArcMap, ma la geometria NON è mostrata nella mappa.
George Silva,

1
Se trascini la vista spaziale da ArcCatalog a ArcMap, non viene visualizzata con i dati geometrici?
Britt Wescott,

Come affermato in precedenza, il livello non viene visualizzato nell'anteprima di ArcMap o ArcCatalog, ma è elencato come un livello del tipo di geometria corretto ed è interrogabile in ArcMap.
George Silva,

1
Quando esegui la descrizione_long come 'sdetable -o descritto_long -t victoria -u sasha -p polar.bear -i esri_40' a tuo avviso, quali risultati ottieni? Dobbiamo vedere se la colonna spaziale e il tipo di entità vengono impostati e referenziati correttamente.
DEWright,

Pubblicherò i risultati qui!
George Silva,

3

Una cosa che mi manca è una colonna intera univoca che ArcObjects può usare per l'ID oggetto. Prova a creare una singola sequenza che manterrà valori univoci per questa colonna ID. Quindi creare trigger di inserimento su ciascuna delle tabelle per popolare la colonna ID con sequenza.nextval.

Nel comando sdelayer -o register, assicurati di impostare il flag -C sulla colonna ID intero con la parola chiave USER in modo che esri non tenti di gestire la colonna per te.


1
Ciao jrockers, il processo di registrazione funziona bene. leggi la mia risposta alla discussione. Sto usando una colonna generata da Oracle (ROWNUM) lanciata come numerica (38,0). Grazie per la punta, ma l'ho già provato.
George Silva,

3

Ho analizzato le risposte e nessuno sembra aver osservato che le query sindacali sono un po 'un problema per le viste spaziali con ArcGIS. questo perché quasi sicuramente finirai con duplicati di objectid. Lo stesso vale per le query di join interne in cui i predicati di join non garantiscono un record "parent" univoco. in entrambi i casi, sebbene la vista possa essere conforme a tutti i requisiti di registrazione, non si comporterà correttamente


Grazie per l'input Rob. Se dai un'occhiata da vicino alla vista che ho scritto, genera OID al volo usando Oracles ROWNUM. Sono garantiti per essere unici.
George Silva,

1
Non sono convinto al 100% dell'utilizzo del rownum se i dati vengono visualizzati in arcmap (ad esempio). Rownum è una funzione del set di query oracle. quindi ogni volta che si esegue una query si ottiene un nuovo set di rown a partire da 1. Ciò può significare che ogni panoramica / zoom ecc produrrà un objectid di 1 e qualsiasi processo che prevede di utilizzare gli objectid memorizzati nella cache fallirà poiché le query successive produrranno un nuovo risultato. Hai considerato lo strumento Crea tabella query come un'opzione per ottenere ArcGIS per aggiungere la colonna objectid per te?
Rob McPherson,

2

Grazie a tutti coloro che hanno visualizzato questa discussione.

Bene, il processo è un po 'complicato, ma è possibile registrare una query complessa come livello, ci vuole solo un pensiero furbo. Non sono ancora sicuro di quali siano le implicazioni sulla performance, ma cercherò di mantenerlo aggiornato. Ho anche problemi con la visualizzazione dei punti in ArcMap, ma approfondirò ulteriormente.

Prima di tutto, crea una complessa vista spaziale nel tuo RDBMS. Assicurati solo di avere una colonna INTEGER UNIQUE NOT NULL nella vista, che può essere utilizzata in seguito per la registrazione con ArcSDE.

Le mie domande erano solo un mucchio di UNION ALL, simili a questo:

    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

In questo schema, tutti i miei oggetti hanno PK ID_UNIQUE_ID, che è un GUID. I miei ObjectID si sono ripetuti attraverso le classi di caratteristiche, quindi non è una buona scelta per il nostro ObjectID surrogato.

Ho usato (nel mio caso) la colonna virtuale di rownum di Oracle per racchiudere tutte le mie query e creare una vista con un "objectID" efficace. Guarda:

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
)

Ho creato la vista con la query sopra e ho creato una vista sopra di essa. Questa vista diventerà il livello spaziale all'interno di arcsde. Questo è un processo abbastanza semplice.

Dopo ciò, ho provato e provato a registrare la mia vista spaziale come un livello, ma ho sempre fallito. Quando si crea una vista al di sopra di essa, ArcSDE presuppone che FID sia un NUMERO (38,10), un numero in virgola mobile, secondo lo sdetable -o descrivi il programma di utilità.

In Oracle, questa era la definizione per la vista:

  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;

Dopo aver sostituito la colonna fid con un cast, tutto ha funzionato bene. Ho proceduto alla registrazione del livello ed è andato tutto bene.

MODIFICARE

Il livello viene visualizzato in ArcCatalog come un livello punto e posso vedere e selezionare la tabella in ArcMap come al solito (i punti sono anche evidenziati), ma non posso simbolizzarli e visualizzarli come un livello normale. Qualche rospo?

Qualcuno ha qualche idea sul perché questo accada? Va tutto bene, tranne per il fatto che non riesco a vedere gli oggetti spaziali all'interno di ArcMap. Qualche idea?


1
Puoi fare molto con le tue prestazioni di quella vista se mantieni aggiornati gli indici, ho impostato lavori pianificati per l'esecuzione su sistemi con un numero elevato di transazioni per mantenere ricostruiti gli indici ogni notte. Quindi, quando fai i tuoi join, sono meglio sintonizzati.
DEWright,

Cosa succede se si trascina e rilascia da arccatalog in una nuova mappa vuota in arcmap?
Kirk Kuykendall,

ArcMap lo aggiunge al sommario, ma non rende nulla. La cosa strana è che posso selezionare le righe e la geometria di quella riga disegnerà (selezionata). Quando le righe non sono selezionate, non viene disegnato nulla. Anche le query tramite ArcMap funzionano.
George Silva,

1
Interessante. Se scrivi il codice arcobjects che aspetto ha IGeoDataset.Extent per il featurelayer? E per la featureclass?
Kirk Kuykendall,

Ci proverò! Vediamo.
George Silva,

2

Prova a eseguire il comando seguente: sdelayer -o alter -l [-S] [-k] [-i | | ] [-s] [-D] -E calc -u [-p]


Grazie per il commento. Ho già provato a ricalcolare l'estensione del livello.
George Silva,

2

Nella mia esperienza, quando un livello non viene visualizzato in Arc, è perché manca l'indice spaziale. Le viste utilizzano l'indice spaziale della tabella di origine, ma sembra che tu stia creando un indice spaziale per la vista nella tua dichiarazione di registrazione.

Una delle tabelle di origine ha indici spaziali? In caso contrario, prova a crearli in Oracle e a ri-registrare la vista senza -g.

Un'altra possibilità è che stai combinando la geometria di due tabelle in una singola colonna, non sei sicuro che sia un no-no, non l'hai mai provato prima.


Proverò quel Matt. Sto anche combinando più geometrie in una in un'altra vista ed è un po 'cruciale che funzioni. Stiamo costruendo linestring su una vista e quella vista unita doveva essere il punto di supporto unico per quei livelli. Sto provando altri approcci, poiché non vedo che questo accada.
George Silva,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.