Enregistrer la vue et la couche SDE

11

Je crée des vues simples sur un ArcSDE Oracle RAC 10g. Mes colonnes SHAPE sont de type de données SDO_GEOMETRY. ArcSDE 9.3.1.

J'ai plusieurs tableaux de points, avec le plan suivant:

ID (Guid) Nom (chaîne) Forme (SHAPE)

J'ai construit une vue simple dans 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 vue dans Oracle est très bien créée. J'ai enregistré cette vue avec la ligne de commande:

sdetable -o create_view -T POINTS -t VW_POINTS -c Id, nom, FORME, etc.

La vue ArcSDE est à nouveau créée, très bien. Je peux utiliser ArcObjects pour l'interroger, etc. J'ai besoin maintenant de créer une couche. J'ai essayé les outils de ligne de commande, sdelayer -o register, mais je n'ai pas réussi. Cela me donne un message, disant que les opinions ne sont pas soutenues.

Je devrai le faire plusieurs fois, en utilisant parfois une syntaxe complexe pour construire la vue.

Quel est le problème? Comment visualiser ces vues spatiales sous forme de couches SDE (je n'ai pas besoin de les modifier, il suffit de les visualiser spatialement dans ArcMap)

Merci pour la contribution!

ÉDITER

Ceci est une capture d'écran dans ArcMap, pour votre deligth: P

Capture d'écran ArcMap pour votre bonheur :

Comme demandé, voici le decrire_long

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

à ce stade, j'ai modifié la vue sur oracle, y compris une distribution numérique (38,0) avant l'enregistrement.

// enregistrer la couche 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 pour Oracle10g Build 2784 mar 27 oct 10:51:14 2009

Utilitaire d'administration des couches

Description de la couche ....:

Propriétaire de la table ..........: SIGMAGIS2

Nom de la table ...........: VIEW_AIRSPACE_POINTS

Colonne spatiale .......: FORME

ID de couche .............: 1398

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

ID de forme minimum .....: 1

Décalage ...............:

falsex: -180.000000

falsey: -90.000000

Unités système .........: 994200.000000

Décalage Z ..............: 0,000000

Unités Z ..............: 1.000000

Décalage de mesure .......:

Unités de mesure ........:

Tolérance de cluster XY.: 2.0

Index spatial ........:

paramètre: SPIDX_RTREE

existe: Oui

forme de tableau: -2,0,0

Enveloppe de calque .......:

minx: -180.00000, miny: -90.00000

maxx: 180.00000, maxy: 90.00000

Entités .............: p

Type de couche ...........: Type spatial en ligne

Date de création ........: 28/06/11 09:28:45

Mode E / S .............: NORMAL

Verrouillage automatique ..........: activé

Précision .............: élevée

Privilèges utilisateur ......: SELECT, UPDATE, INSERT, DELETE

Système de coordonnées ....: GEOGCS ["Longitude / Latitude [WGS 84]", DATUM ["WGS 84", SPHEROID ["WGS 84", 6378137.0,298.257223563]], PRIMEM ["Greenwich", 0,0], UNIT [ "Décimal

Degré ", 0,0174532925199433]]

Configuration de la couche ..: PAR DÉFAUT

George Silva
la source
Vous devez donc créer un fichier de couches?
DEWright
Non, je dois créer une vue à l'intérieur de la géodatabase, qui agit comme une classe de traits.
George Silva
Ensuite, vous devez créer la vue spatiale comme vous le dites et je le mentionne ci-dessous; La seule raison pour laquelle je peux le voir ne pas apparaître comme une couche spatiale est de faire des autorisations. Soit ArcGIS / ArcSDE ne l'a pas enregistré correctement; puisque c'est juste le but d'une couche spatiale, de joindre des données spatiales et tabulaires de manière uniforme.
DEWright
Lorsque vous exécutez la description_long comme 'sdetable -o describe_long -t victoria -u sasha -p polar.bear -i esri_40' sur votre vue, quels résultats obtenez-vous? Nous devons voir si la colonne spatiale et le type d'entité sont définis et référencés correctement.
DEWright
1
DE merci pour l'alerte. J'ai tout fait correctement, mais ne fonctionne toujours pas. :( très frustrant. Cela peut être fait avec une pile OpenSource assez facilement .
George Silva

Réponses:

4

J'ai eu cela (et des problèmes similaires) dans le passé. Cela se résumait toujours à deux choses:

  1. La table spatiale avait des géométries corrompues / invalides. Le problème avec ArcMap est que dès qu'il trouve une géométrie non valide, il arrête le rendu.

  2. L'enregistrement de couche est incorrect. Ce que j'ai également constaté, c'est que le registre sdelayer -o ne fonctionne pas toujours correctement et que vous devez «masser» les entrées d'enregistrement.

Donc, pour vérifier si la couche est valide, utilisez d' abord la fonction SDO_GEOM.VALIDATE_LAYER_WITH_CONTEXT . Utilisez ensuite la fonction de validation ArcSDE sdelayer -o feature_info -r invalid ... pour obtenir des entités non valides selon ArcSDE. Probablement avec sdelayer -o list (voir ici )

Pour vérifier l'enregistrement, vous devez revenir dans le schéma ArcSDE. Les tables qui contrôlent l'enregistrement sont: SDE.LAYERS, SDE.TABLE_REGISTRY, SDE.COLUMN_REGISTRY, SDE.SPATIAL_REFERENCES et SDE.GEOMETRY_COLUMNS. Une astuce que j'utilise est que j'ai généralement une couche «de base» qui est similaire (en ce qui concerne les types de géométrie et les colonnes de clé primaire) à DISPLAYS dans ArcMap. Je compare ensuite les enregistrements d'enregistrement, entre la couche qui s'affiche et celle qui ne le fait pas. Vous serez étonné de voir quelle différence fait un changement de 1 dans une colonne entière! :-)

Un conseil sur COLUMN_REGISTRY - tout ce que vous avez à faire est de vous assurer que la colonne de clé primaire (ce qui est défini comme ROWID_COLUMN dans SDE.TABLE_REGISTRY) et la colonne spatiale sont correctes (ou identiques à la couche qui s'affiche). Ignorez toutes les autres colonnes. Si vous ajoutez la couche dans ArcMap connecté en tant que propriétaire de la table, les entrées manquantes dans la table COLUMN_REGISTRY seront ajoutées automatiquement.

Faites-moi savoir si cela aide!

mapoholic
la source
merci mapholic pour l'entrée! Je vais l'essayer dès demain! J'espère que tu as raison! Merci!
George Silva
répondit mapoholic. Cela a fonctionné pour différents types d'enregistrements, mais pas pour UNIONED. Néanmoins, c'est une astuce incroyable. Merci d'avoir répondu.
George Silva
6

Ce que vous recherchez est une vue spatiale , maintenant le seul problème majeur que vous verrez ici est que vous devez faire attention aux champs sur lesquels vous vous joignez. C'est un processus assez agréable, je l'utilise partout où j'ai généralisé ma base de données pour parler avec des données spatiales minces.

    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

Cela devrait vous aider à atteindre ce que vous voulez. La clé consiste à obtenir vos champs pour une carte correcte. J'ai tendance à faire la vue avec le minimum dont j'ai besoin, puis à utiliser une interface utilisateur pour modifier cette vue une fois enregistrée dans SDE pour faire mes réglages les plus fins.

DEWright
la source
Bonjour DE J'ai essayé cette méthode mais ça ne marche pas. Pour ce que je comprends, c'est que ArcSDE crée une commande "CREATE FORCE VIEW", en indiquant les colonnes à l'avance et en enregistrant uniquement les colonnes que vous déclarez dans la clause. J'ai essayé de créer une vue vide (en utilisant uniquement une classe d'entités, pour obtenir la définition géométrique) et de la remplacer par une autre définition. Ok, je peux l'interroger via ArcMap, mais la géométrie n'est PAS affichée sur la carte.
George Silva
1
Si vous faites glisser la vue spatiale d'ArcCatalog vers ArcMap, elle ne s'affiche pas avec des données géométriques?
Britt Wescott
Comme indiqué précédemment, la couche ne s'affiche pas dans l'aperçu ArcMap ou ArcCatalog, mais elle est répertoriée en tant que couche de type de géométrie correct et peut être interrogée dans ArcMap.
George Silva
1
Lorsque vous exécutez la description_long comme 'sdetable -o describe_long -t victoria -u sasha -p polar.bear -i esri_40' sur votre vue, quels résultats obtenez-vous? Nous devons voir si la colonne spatiale et le type d'entité sont définis et référencés correctement.
DEWright
Je posterai les résultats ici!
George Silva
3

Une chose qui me manque est une colonne d'entier unique que ArcObjects peut utiliser pour l'ID d'objet. Essayez de créer une séquence unique qui conservera des valeurs uniques pour cette colonne id. Créez ensuite des déclencheurs d'insertion sur chacune des tables pour remplir la colonne id avec le sequence.nextval.

Dans votre commande sdelayer -o register, assurez-vous de définir l'indicateur -C sur votre colonne d'identifiant entier avec le mot clé USER afin que esri n'essaye pas de gérer la colonne pour vous.

jrockers
la source
1
Bonjour jrockers, le processus d'inscription fonctionne très bien. lire ma propre réponse au fil. J'utilise une colonne générée par Oracle (ROWNUM) castée en numérique (38,0). Merci pour l'astuce, mais j'ai déjà essayé ça.
George Silva
3

J'ai en quelque sorte analysé les réponses et personne ne semble avoir observé que les requêtes d'union sont un peu un problème pour les vues spatiales avec ArcGIS. c'est parce que vous vous retrouverez presque certainement avec des objectids en double. Il en va de même pour les requêtes de jointure interne où les prédicats de jointure ne garantissent pas un enregistrement "parent" unique. dans les deux cas, bien que la vue puisse être conforme à toutes les exigences d'enregistrement, elle ne se comportera pas correctement

Rob McPherson
la source
Merci pour l'entrée Rob. Si vous regardez de près la vue que j'ai écrite, elle génère des OID à la volée à l'aide d'Oracles ROWNUM. Ils sont garantis d'être uniques.
George Silva
1
Je ne suis pas convaincu à 100% de l'utilisation de rownum si les données sont affichées dans arcmap (par exemple). Rownum est une fonction de l'ensemble de requêtes Oracle. Ainsi, chaque fois que vous exécutez une requête, vous obtenez un nouvel ensemble de rownums à partir de 1. Cela peut signifier que chaque panoramique / zoom, etc. produira un objectid de 1 et tout processus s'attendant à utiliser des objectids mis en cache échouera car les requêtes suivantes produiront un nouveau résultat. Avez-vous envisagé de créer un outil de table de requête comme option pour que ArcGIS ajoute la colonne objectid pour vous?
Rob McPherson
2

Merci à tous ceux qui ont consulté ce fil.

Eh bien, le processus est un peu compliqué, mais il est possible d'enregistrer une requête complexe en tant que couche, cela demande juste une réflexion astucieuse. Je ne sais pas encore quelles sont les implications sur les performances à ce sujet, mais je vais essayer de garder cela à jour. Je rencontre également des problèmes pour visualiser les points dans ArcMap, mais j'examinerai plus avant.

Tout d'abord, créez une vue spatiale complexe dans votre SGBDR. Assurez-vous simplement que vous avez une colonne INTEGER UNIQUE NOT NULL dans la vue, qui peut être utilisée plus tard pour l'enregistrement avec ArcSDE.

Mes requêtes n'étaient qu'un tas d'UNION ALL, similaire à ceci:

    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

Dans ce schéma, tous mes objets ont comme PK ID_UNIQUE_ID, qui est un GUID. Mes ObjectIDs se sont répétés dans toutes les classes d'entités, donc ce n'est pas un bon choix pour notre ObjectID de substitution.

J'ai utilisé (dans mon cas) la colonne virtuelle rownum d'Oracle pour encapsuler toutes mes requêtes et créer une vue qui avait un "objectID" efficace. Regarde:

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
)

J'ai créé la vue avec la requête ci-dessus et créé une vue au-dessus. Cette vue deviendra la couche spatiale à l'intérieur de l'arcsde. C'est un processus assez simple.

Après cela, j'ai essayé et essayé d'enregistrer ma vue spatiale en tant que couche, mais j'ai toujours échoué. Lorsque vous créez une vue par-dessus, ArcSDE suppose que FID est un NUMBER (38,10), un nombre à virgule flottante, selon le programme utilitaire sdetable -o describe.

Dans Oracle, c'était la définition de la vue:

  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;

Après avoir remplacé la colonne fid par un casting, tout a bien fonctionné. J'ai procédé à l'enregistrement de la couche et tout s'est bien passé.

ÉDITER

La couche s'affiche dans ArcCatalog en tant que couche de points et je peux voir et sélectionner la table dans ArcMap comme d'habitude (les points sont même mis en surbrillance), mais je ne peux pas les simboliser et les visualiser comme une couche régulière. Des pensées?

Quelqu'un a une idée de pourquoi cela se produit? Tout va bien, sauf que je ne peux pas voir les objets spatiaux dans ArcMap. Des idées?

George Silva
la source
1
Vous pouvez faire beaucoup avec vos performances de cette vue si vous gardez vos index à jour, j'ai défini des tâches planifiées pour s'exécuter sur des systèmes avec un grand nombre de transactions pour garder les index reconstruits chaque nuit. Ensuite, lorsque vous effectuez vos jointures, elles sont mieux ajustées.
DEWright
Que se passe-t-il si vous faites un glisser-déposer d'arccatalog dans une nouvelle carte vide dans arcmap?
Kirk Kuykendall
ArcMap l'ajoute à la table des matières, mais il ne rend rien. La chose étrange est que je peux sélectionner les lignes, et la géométrie de cette ligne dessinera (sélectionnée). Lorsque les lignes ne sont pas sélectionnées, rien n'est dessiné. La requête via ArcMap fonctionne également.
George Silva
1
Intéressant. Si vous écrivez du code arcobjects, à quoi ressemble IGeoDataset.Extent pour la couche de fonction? Et pour la classe de fonction?
Kirk Kuykendall
Je vais essayer ça! Voyons voir.
George Silva
2

Veuillez essayer d'exécuter la commande suivante: sdelayer -o alter -l [-S] [-k] [-i | | ] [-s] [-D] -E calc -u [-p]

Priya J
la source
Merci pour le commentaire. Déjà essayé de recalculer l'étendue de la couche.
George Silva
2

D'après mon expérience, lorsqu'une couche ne s'affiche pas dans Arc, c'est parce que l'index spatial est manquant. Les vues utilisent l'index spatial de la table source, mais il semble que vous créez un index spatial pour la vue dans votre déclaration d'enregistrement.

L'une des tables source a-t-elle des index spatiaux? Sinon, essayez de les créer dans Oracle et de réenregistrer la vue sans -g.

Une autre possibilité est que vous combinez la géométrie de deux tables dans une seule colonne, vous ne savez pas si c'est un non-non, vous ne l'avez pas essayé auparavant.

MattL
la source
Je vais essayer ça Matt. Je combine également plusieurs géométries en une autre dans une autre vue et il est essentiel que cela fonctionne. Nous construisons des chaînes de lignes sur une vue et cette vue unifiée était censée être le seul point d'appui pour ces couches. J'essaie d'autres approches, car je ne vois pas cela se produire.
George Silva