注册SDE视图和图层


11

我正在针对ArcSDE Oracle RAC 10g构建简单的视图。我的SHAPE列是SDO_GEOMETRY数据类型。ArcSDE 9.3.1。

我有几个点表,概述如下:

ID(向导)名称(字符串)形状(形状)

我在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

在Oracle中创建视图就好了。我已经使用命令行注册了该视图:

sdetable -o create_view -T POINTS -t VW_POINTS -c ID,名称,形状等

再次创建ArcSDE视图,就好了。我可以使用ArcObjects进行查询,等等。现在需要创建一个Layer。我尝试了命令行工具sdelayer -o register,但是没有成功。它给了我一个信息,说观点没有得到支持。

我将需要执行几次,有时会使用复杂的语法来构建视图。

问题是什么?如何将这些空间视图可视化为SDE图层(我不需要编辑它们,只需在ArcMap中空间查看它们)

感谢您的输入!

编辑

这是ArcMap中的屏幕截图,详细说明了:P

您的幸福的ArcMap屏幕截图

根据要求,这里是describe_long

// create_view C:\ Users \ H> sdetable -o create_view -s服务器-i port -u用户-p pass -T view_airspace_points -t vw_airspace_points_oracle -c“ *”

在这一点上,我更改了对oracle的看法,包括在注册之前强制转换为numeric(38,0)。

//注册层C:\ Users \ H> sdelayer -o注册-l view_airspace_points,形状-C OBJECTID,USER-g RTREE -s服务器-i端口-u用户-p pass -ep -P HIGH

适用于Oracle10g Build 2784的ArcSDE 9.3.1 2009年10月27日星期二10:51:14

层管理实用程序

层描述....:

表所有者..............:SIGMAGIS2

表名......:VIEW_AIRSPACE_POINTS

空间列.......:SHAPE

层编号.............:1398

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

最小形状ID .....:1

偏移......:

假货:-180.000000

虚假:-90.000000

系统单位.........:994200.000000

Z偏移..............:0.000000

Z单位..............:1.000000

测量偏移量.......:

测量单位........:

XY群集公差。:2.0

空间指数........:

参数:SPIDX_RTREE

存在:是

数组形式:-2,0,0

层信封.......:

minx:-180.00000,miny:-90.00000

最高:180.00000,最高:90.00000

实体.............:p

图层类型...........:串联空间类型

创建日期........:06/28/11 09:28:45

I / O模式.............:正常

自动锁定..........:已启用

精度.............:高

用户权限......:选择,更新,插入,删除

坐标系....:GEOGCS [“经度/纬度[WGS 84]”,DATUM [“ WGS 84”,SPHEROID [“ WGS 84”,6378137.0,298.257223563]],PRIMEM [“格林威治”,0.0],单位[ “十进制

学位“,0.0174532925199433]]

层配置..:默认


因此,您需要创建一个图层文件吗?
DEWright 2011年

不,我需要在地理数据库中创建一个像要素类一样的视图。
乔治席尔瓦

然后,您需要按照您所说的创建空间视图,我在下面提到;我看到它没有显示为Spatial图层的唯一原因是对权限的影响。ArcGIS / ArcSDE均未正确注册。因为这仅仅是空间层的目的,所以要以统一的方式合并空间和表格数据。
DEWright

当您在视图上运行诸如'sdetable -o describe_long -t victoria -u sasha -p polar.bear -i esri_40'这样的describe_long时,会得到什么结果?我们需要查看空间列和实体类型是否已正确设置和引用。
DEWright 2011年

1
DE感谢您的提醒。我已正确完成所有操作,但仍然无法正常工作。:(非常frustating这可以与开放源代码堆栈来完成。很容易
乔治·席尔瓦

Answers:


4

我过去有这个(以及类似的问题)。它总是归结为两件事:

  1. 空间表具有一些损坏/无效的几何形状。ArcMap的问题在于,一旦找到无效的几何图形,它将停止渲染。

  2. 图层注册不正确。我还发现sdelayer -o寄存器不能总是正常工作,您必须“按摩”注册条目。

因此要检查该图层是否有效,请首先使用SDO_GEOM.VALIDATE_LAYER_WITH_CONTEXT 函数。然后使用ArcSDE验证功能sdelayer -o feature_info -r invalid ...根据ArcSDE获得无效的功能。可能与sdelayer -o列表一起(请参阅此处

为了检查注册,您必须返回到ArcSDE模式。控制注册的表是:SDE.LAYERS,SDE.TABLE_REGISTRY,SDE.COLUMN_REGISTRY,SDE.SPATIAL_REFERENCES和SDE.GEOMETRY_COLUMNS。我使用的一个技巧是,我通常有一个“基础”层,该层与ArcMap中的DISPLAYS相似(就几何类型和主键列而言)。然后,我比较注册记录,在显示的图层和未显示的图层之间进行比较。您会惊讶地发现整数列中的变化1造成了什么变化!:-)

关于COLUMN_REGISTRY的提示-您要做的就是确保主键列(在SDE.TABLE_REGISTRY中定义为ROWID_COLUMN)和空间列正确(或与显示的图层相同)。忽略所有其他列。如果在以表所有者身份登录的ArcMap中添加图层,则会自动添加COLUMN_REGISTRY表中缺少的条目。

让我知道是否有帮助!


mapholic感谢您的输入!明天我会尝试第一件事!我希望你是对的!谢谢!
乔治席尔瓦,

回答了mapoholic。这适用于不同类型的注册,但不适用于UNIONED。但是,这是一个了不起的技巧。感谢你的回答。
乔治·席尔瓦

6

您正在寻找的是Spatial-View,现在您将在这里看到的唯一主要问题是,您需要谨慎对待要加入的字段。这是一个非常不错的过程,在将数据库通用化以处理薄空间数据的整个地方,我都会使用它。

    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

这样可以使您在实现所需目标的过程中保持良好状态。关键是使您的字段正确映射。我倾向于只用所需的最少内容进行视图,然后在注册到SDE中后使用UI来编辑该视图以进行更精细的调整。


您好DE我已经尝试过这种方法,但是它不起作用。据我所知,ArcSDE创建了一个“ CREATE FORCE VIEW”命令,先声明各列,然后仅注册在子句中声明的列。我尝试创建一个空视图(仅使用要素类来获取几何定义),然后将其替换为另一个定义。好的,我可以通过ArcMap进行查询,但是几何图形未显示在地图中。
乔治·席尔瓦

1
如果将空间视图从ArcCatalog拖动到ArcMap,它是否不会显示几何数据?
Britt Wescott

如前所述,该图层不会显示在ArcMap或ArcCatalog预览中,但会被列为具有正确几何类型的图层,并且可以在ArcMap中查询。
乔治·席尔瓦

1
当您在视图上运行诸如'sdetable -o describe_long -t victoria -u sasha -p polar.bear -i esri_40'这样的describe_long时,会得到什么结果?我们需要查看空间列和实体类型是否已正确设置和引用。
DEWright 2011年

我将结果发布在这里!
乔治·席尔瓦

3

我看到的一件事是ArcObjects可以将其用于对象ID的唯一整数列。尝试创建一个单个序列,该序列将保持此id列的唯一值。然后在每个表上创建插入触发器,以用sequence.nextval填充id列。

在sdelayer -o register命令中,请确保使用关键字USER将-C标志设置为整数id列,以便esri不会尝试为您管理该列。


1
jrockers,您好,注册过程很好。阅读我对线程的答案。我正在使用Oracle生成的列(ROWNUM),将其强制转换为numeric(38,0)。感谢您的提示,但我已经尝试过了。
乔治·席尔瓦

3

我已经仔细检查了答复,似乎没有人发现联合查询对于使用ArcGIS的空间视图来说有点问题。这是因为您几乎肯定会得到重复的objectid。内部联接查询中的联接谓词不能保证唯一的“父”记录也是如此。在这两种情况下,尽管该视图可能符合所有注册要求,但它不会正常运行


感谢您的输入Rob。如果您仔细查看我编写的视图,它将使用Oracle ROWNUM即时生成OID。他们保证是独一无二的。
乔治席尔瓦,

1
如果不是在arcmap中显示数据,我不是100%相信rownum的用法。Rownum是oracle查询集的功能。因此,每次执行查询时,都会得到一组新的从1开始的rownum。这可能意味着每个平移/缩放等将产生一个objectid 1,并且任何期望使用缓存的objectid的进程都将失败,因为后续查询会产生一个新的结果。您是否已将make query table工具作为让ArcGIS为您添加objectid列的选项?
罗伯·麦克弗森

2

感谢所有查看此线程的人。

好的过程有点复杂,但是可以将一个复杂的查询注册为一个层,这需要一些技巧。我不确定这对性能有什么影响,但我将尝试保持此更新。我在查看ArcMap中的点时也遇到了问题,但我将作进一步调查。

首先,在RDBMS中创建复杂的空间视图。只要确保您在视图中有一个INTEGER UNIQUE NOT NULL列即可在以后用于向ArcSDE注册。

我的查询只是一堆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

在此架构中,我所有的对象均具有PK ID_UNIQUE_ID,即GUID。我的ObjectID在要素类之间重复,因此,对于我们的替代ObjectID来说不是一个好的选择。

我使用了Oracle的rownum虚拟列(以我为例)来包装所有查询并创建一个具有有效“ objectID”的视图。看一看:

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
)

我使用上面的查询创建了视图,并在其上面创建了一个视图。该视图将成为arcsde内部的空间层。这是一个相当简单的过程。

之后,我尝试将空间视图注册为一个图层,但始终失败。根据sdetable -o describe Utility程序,在视图之上创建视图时,ArcSDE假定FID是NUMBER(38,10),是浮点数。

在Oracle中,这是视图的定义:

  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;

在用演员表替换fid列后,一切正常。我进行了该层的注册,一切顺利。

编辑

该图层在ArcCatalog中显示为点图层,我可以像往常一样在ArcMap中查看和选择表格(这些点甚至被突出显示),但是我无法简化它们并将它们视为常规图层。有什么想法吗?

任何人都知道为什么会这样吗?一切都很好,但是我看不到ArcMap中的空间对象。有任何想法吗?


1
如果您使索引保持最新状态,则可以利用该视图的性能做很多事情。我将计划的作业设置为在具有大量事务的系统上运行,以保持每晚重建索引。然后,当您进行连接时,会对其进行更好的调整。
DEWright 2011年

如果从arccatalog拖放到arcmap中的新的空白地图会怎样?
Kirk Kuykendall

ArcMap将其添加到TOC中,但不呈现任何内容。奇怪的是,我可以选择行,然后该行的几何图形将被绘制(选中)。如果未选择行,则不会绘制任何内容。通过ArcMap进行查询也可以。
乔治·席尔瓦

1
有趣。如果编写arcobjects代码,要素图层的IGeoDataset.Extent看起来是什么样的?对于要素类?
Kirk Kuykendall

我会尝试的!让我们来看看。
乔治·席尔瓦

2

请尝试运行以下命令:sdelayer -o alter -l [-S] [-k] [-i | | ] [-s] [-D] -E calc -u [-p]


感谢您的评论。已经尝试重新计算图层范围。
乔治·席尔瓦

2

以我的经验,当图层不在Arc中显示时,是因为缺少空间索引。视图使用源表的空间索引,但是看起来您正在为注册语句中的视图创建空间索引。

两个源表都具有空间索引吗?如果不是,请尝试在Oracle中创建它们并重新注册不带-g的视图。

另一种可能性是,您要将两个表中的几何图形合并到一个列中,不确定是否可以,以前没有尝试过。


我会尝试那个马特。我还在另一个视图中将多个几何形状组合在一起,这很关键。我们在视图上构建线串,并且联合视图被认为是对这些层的唯一支持。我正在尝试其他方法,因为我没有看到这种情况。
乔治·席尔瓦
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.