Registrar vista y capa SDE

11

Estoy creando vistas simples contra un ArcSDE Oracle RAC 10g. Mis columnas SHAPE son del tipo de datos SDO_GEOMETRY. ArcSDE 9.3.1.

Tengo varias tablas de puntos, con el siguiente esquema:

ID (Guid) Nombre (cadena) Forma (SHAPE)

¡He construido una vista simple como esto en 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 en Oracle se crea muy bien. He registrado esta vista con la línea de comando:

sdetable -o create_view -T PUNTOS -t VW_POINTS -c Id, Nombre, FORMA, etc.

La vista ArcSDE se crea de nuevo, muy bien. Puedo usar ArcObjects para consultarlo, etc. Ahora necesito crear una capa. He probado las herramientas de línea de comandos, sdelayer -o register, pero no tuve éxito. Me da un mensaje que dice que las opiniones no son compatibles.

Tendré que hacer esto varias veces, a veces usando una sintaxis compleja para construir la vista.

¿Cuál es el problema? ¿Cómo puedo visualizar estas vistas espaciales como capas SDE? (No necesito editarlas, solo verlas espacialmente dentro de ArcMap)

¡Gracias por el aporte!

EDITAR

Esta es una captura de pantalla en ArcMap, para su longitud: P

Captura de pantalla de ArcMap para tu felicidad :

Según lo solicitado, aquí viene el describe_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 "*"

En este punto modifiqué la vista sobre Oracle, incluyendo un reparto como numérico (38,0) antes del registro.

// registre la capa 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 para Oracle10g Build 2784 Martes 27 de octubre 10:51:14 2009

Layer Administration Utility

Descripción de la capa ....:

Propietario de la tabla ..........: SIGMAGIS2

Nombre de la tabla ...........: VIEW_AIRSPACE_POINTS

Columna espacial .......: FORMA

Id de capa .............: 1398

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

Id de forma mínima .....: 1

Compensar ...............:

falsex: -180.000000

falsey: -90.000000

Unidades del sistema .........: 994200.000000

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

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

Medir desplazamiento .......:

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

Tolerancia de clúster XY.: 2.0

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

parámetro: SPIDX_RTREE

existe: sí

forma de matriz: -2,0,0

Sobre de capa .......:

minx: -180.00000, miny: -90.00000

maxx: 180.00000, maxy: 90.00000

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

Tipo de capa ...........: Tipo espacial en línea

Fecha de creación ........: 28/06/11 09:28:45

Modo I / O .............: NORMAL

Bloqueo automático ..........: habilitado

Precisión .............: Alta

Privilegios de usuario ......: SELECCIONAR, ACTUALIZAR, INSERTAR, ELIMINAR

Sistema de coordenadas ....: GEOGCS ["Longitud / Latitud [WGS 84]", DATUM ["WGS 84", ESFEROID ["WGS 84", 6378137.0,298.257223563]], PRIMEM ["Greenwich", 0.0], UNIDAD [ "Decimal

Grado ", 0.0174532925199433]]

Configuración de capa ...: PREDETERMINADOS

George Silva
fuente
Entonces, ¿necesitas crear un archivo de capa?
DEWright
No, necesito crear una vista dentro de la geodatabase, que actúe como una clase de entidad.
George Silva
Entonces necesita crear la vista espacial como dice y menciono a continuación; La única razón por la que puedo ver que no se muestra como una capa espacial es por los permisos. ArcGIS / ArcSDE no lo registró correctamente; dado que ese es solo el propósito de una capa espacial, unir datos espaciales y tabulares de manera uniforme.
DEWright
Cuando ejecuta el describe_long como 'sdetable -o describe_long -t victoria -u sasha -p polar.bear -i esri_40' en su vista, ¿qué resultados obtiene? Necesitamos ver si la columna espacial y el tipo de entidad se están configurando y haciendo referencia a la derecha.
DEWright
1
DE gracias por la alerta. He hecho todo correctamente, pero aún no funciona. :( muy frustrante. Esto se puede hacer con una pila OpenSource con bastante facilidad .
George Silva

Respuestas:

4

Tuve esto (y problemas similares) en el pasado. Siempre se redujo a dos cosas:

  1. La tabla espacial tenía algunas geometrías corruptas / inválidas. El problema con ArcMap es que tan pronto como encuentre una geometría no válida, dejará de renderizarse.

  2. El registro de la capa es incorrecto. Lo que también encontré es que el registro de sdelayer -o no siempre funciona correctamente y tienes que 'masajear' las entradas de registro.

Entonces, para verificar si la capa es válida, use PRIMERO la función SDO_GEOM.VALIDATE_LAYER_WITH_CONTEXT . Luego use la función de validación ArcSDE sdelayer -o feature_info -r invalid ... para obtener entidades no válidas de acuerdo con ArcSDE. Probablemente junto con sdelayer -o list (ver aquí )

Para verificar el registro, debe volver al esquema de ArcSDE. Las tablas que controlan el registro son: SDE.LAYERS, SDE.TABLE_REGISTRY, SDE.COLUMN_REGISTRY, SDE.SPATIAL_REFERENCES y SDE.GEOMETRY_COLUMNS. Un truco que uso es que generalmente tengo una capa 'base' que es similar (en lo que respecta a los tipos de geometría y las columnas de clave principal) que se MUESTRA en ArcMap. Luego comparo los registros de registro, entre la capa que se muestra y luego una que no. ¡Se sorprenderá al ver la diferencia que hace un cambio de 1 en una columna entera! :-)

Un consejo sobre COLUMN_REGISTRY: todo lo que tiene que hacer es asegurarse de que la columna de clave principal (que se define como ROWID_COLUMN en SDE.TABLE_REGISTRY) y la columna espacial son correctas (o lo mismo que la capa que se muestra). Ignora todas las otras columnas. Si agrega la capa en ArcMap conectado como propietario de la tabla, las entradas que faltan en la tabla COLUMN_REGISTRY se agregarán automáticamente.

¡Déjeme saber si esto ayuda!

mapoholic
fuente
Gracias mapholic por el aporte! ¡Lo intentaré mañana a primera hora! ¡Espero que tengas razón! ¡Gracias!
George Silva
respondió mapoholic. Esto funcionó para diferentes tipos de registros, pero no para UNIONED. Sin embargo, este es un consejo increíble. Gracias por la respuesta.
George Silva el
6

Lo que está buscando es una vista espacial , ahora el único problema importante que verá aquí es que debe tener cuidado con los campos en los que se está uniendo. Este es un proceso bastante agradable, lo uso en todo el lugar donde he generalizado mi DB para hablar con datos espaciales delgados.

    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

Esto debería llevarte bien en tu camino hacia lo que quieres. La clave es hacer que sus campos se mapeen correctamente. Tiendo a hacer la vista con el mínimo que necesito, luego uso una interfaz de usuario para editar esa vista una vez registrada en SDE para hacer mis ajustes más finos.

DEWright
fuente
Hola DE He probado este método pero no funciona. Por lo que entiendo es que ArcSDE crea un comando "CREAR VISTA DE FUERZA", indicando las columnas de antemano y solo registra las columnas que declaras en la cláusula. Intenté crear una vista vacía (usando solo una clase de entidad, para obtener la definición geométrica) y reemplazarla por otra definición. Ok, puedo consultar esto a través de ArcMap, pero la geometría NO se muestra en el mapa.
George Silva
1
Si arrastra la vista espacial de ArcCatalog a ArcMap, ¿no aparece con datos geométricos?
Britt Wescott
Como se indicó anteriormente, la capa no se muestra en la vista previa de ArcMap o ArcCatalog, pero aparece como una capa del tipo de geometría correcta y se puede consultar en ArcMap.
George Silva
1
Cuando ejecuta el describe_long como 'sdetable -o describe_long -t victoria -u sasha -p polar.bear -i esri_40' en su vista, ¿qué resultados obtiene? Necesitamos ver si la columna espacial y el tipo de entidad se están configurando y haciendo referencia a la derecha.
DEWright
¡Publicaré los resultados aquí!
George Silva
3

Una cosa que veo que falta es una columna entera única que ArcObjects puede usar para la ID del objeto. Intente crear una secuencia única que mantenga valores únicos para esta columna de identificación. Luego, cree disparadores de inserción en cada una de las tablas para llenar la columna de identificación con la secuencia.

En su comando sdelayer -o register, asegúrese de establecer el indicador -C en su columna de identificación de enteros con la palabra clave USER para que esri no intente administrar la columna por usted.

jrockers
fuente
1
Hola jrockers, el proceso de registro funciona bien. Lee mi propia respuesta al hilo. Estoy usando una columna generada por Oracle (ROWNUM) convertida como numérica (38,0). Gracias por el consejo, pero ya lo he intentado.
George Silva
3

He escaneado las respuestas y parece que nadie ha observado que las consultas de unión son un problema para las vistas espaciales con ArcGIS. Esto se debe a que casi seguramente terminará con duplicados objectids. Lo mismo se aplica a las consultas de unión interna donde los predicados de unión no garantizan un registro único "principal". en cualquier caso, aunque la vista puede cumplir con todos los requisitos de registro, no se comportará correctamente

Rob McPherson
fuente
Gracias por el aporte Rob. Si observa de cerca la vista que escribí, genera OID sobre la marcha utilizando Oracles ROWNUM. Están garantizados para ser únicos.
George Silva
1
No estoy 100% convencido sobre el uso de rownum si los datos se muestran en arcmap (por ejemplo). Rownum es una función del conjunto de consultas de Oracle. así que cada vez que ejecutas una consulta obtienes un nuevo conjunto de rownums comenzando en 1. Esto puede significar que cada panorámica / zoom, etc. producirá un objectid de 1 y cualquier proceso que espere usar objectids en caché fallará ya que las consultas posteriores producirán un nuevo resultado. ¿Has mirado en la herramienta de tabla de consulta como una opción para que ArcGIS agregue la columna objectid por ti?
Rob McPherson el
2

Gracias a todos los que vieron este hilo.

Bueno, el proceso es un poco complicado, pero es posible registrar una consulta compleja como una capa, solo requiere un poco de ingenio. Todavía no estoy seguro de cuáles son las implicaciones en el rendimiento de esto, pero intentaré mantenerlo actualizado. También tengo problemas para ver los puntos en ArcMap, pero investigaré más a fondo.

En primer lugar, cree una vista espacial compleja en su RDBMS. Solo asegúrese de tener una columna INTEGER UNIQUE NOT NULL en la vista, que se pueda usar más tarde para registrarse en ArcSDE.

Mis consultas fueron solo un montón de UNION ALL, similar a esto:

    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

En este esquema, todos mis objetos tienen como PK ID_UNIQUE_ID, que es un GUID. Mis ObjectID se repitieron en las clases de entidad, por lo que no es una buena opción para nuestro ObjectID sustituto.

Usé (en mi caso) la columna virtual rownum de Oracle para ajustar todas mis consultas y crear una vista que tuviera un "objectID" efectivo. Echar un vistazo:

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
)

Creé la vista con la consulta anterior, y creé una vista encima de ella. Esta vista se convertirá en la capa espacial dentro de arcsde. Este es un proceso bastante fácil.

Después de eso, intenté y traté de registrar mi vista espacial como una capa, pero siempre fallé. Cuando crea una vista encima, ArcSDE asume que FID es un NÚMERO (38,10), un número de coma flotante, de acuerdo con el programa de utilidad sdetable -o describe.

En Oracle, esta era la definición de 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;

Después de reemplazar la columna fid con un yeso, todo funcionó bien. Procedí al registro de la capa y todo salió bien.

EDITAR

La capa se muestra en ArcCatalog como una capa de puntos y puedo ver y seleccionar la tabla en ArcMap como de costumbre (incluso los puntos están resaltados), pero no puedo simbolizarlos y verlos como una capa normal. ¿Algún peso?

¿Alguien tiene alguna idea de por qué sucede esto? Todo está bien, excepto que no puedo ver los objetos espaciales dentro de ArcMap. ¿Algunas ideas?

George Silva
fuente
1
Puede hacer mucho con su rendimiento de esa vista si mantiene sus índices actualizados, he configurado trabajos programados para que se ejecuten en sistemas con un gran número de transacciones para mantener los índices reconstruidos todas las noches. Luego, cuando está haciendo sus uniones, están mejor sintonizadas.
DEWright
¿Qué sucede si arrastra y suelta de arccatalog en un nuevo mapa vacío en arcmap?
Kirk Kuykendall
ArcMap lo agrega a la tabla de contenido, pero no muestra nada. Lo extraño es que puedo seleccionar las filas, y la geometría de esa fila dibujará (seleccionado). Cuando las filas no están seleccionadas, no se dibuja nada. La consulta a través de ArcMap también funciona.
George Silva
1
Interesante. Si escribe código de arcobjects, ¿qué aspecto tiene IGeoDataset.Extent para la capa de características? ¿Y para la clase de largometraje?
Kirk Kuykendall
¡Lo intentaré! Veamos.
George Silva
2

Intente ejecutar el siguiente comando: sdelayer -o alter -l [-S] [-k] [-i | El | ] [-s] [-D] -E calc -u [-p]

Priya J
fuente
Gracias por el comentario. Ya intenté volver a calcular la extensión de la capa.
George Silva
2

En mi experiencia, cuando una capa no se muestra en Arc, es porque falta el índice espacial. Las vistas usan el índice espacial de la tabla de origen, pero parece que está creando un índice espacial para la vista en su declaración de registro.

¿Alguna de las tablas de origen tiene índices espaciales? De lo contrario, intente crearlos en Oracle y vuelva a registrar la vista sin -g.

Otra posibilidad es que esté combinando geometría de dos tablas en una sola columna, no estoy seguro de si eso es un no-no, no lo ha intentado antes.

MattL
fuente
Intentaré eso Matt. También estoy combinando múltiples geometrías en una en otra vista y es crucial que esto funcione. Estamos construyendo cadenas lineales en una vista y se suponía que esa vista unida era el único punto de apoyo para esas capas. Estoy probando otros enfoques, ya que no veo que esto suceda.
George Silva