AGS中通过FeatureServer插入数据失败、插入数据在WMTS请求中无法显示以及version概念的讨论

时间:2021-06-11 07:23:23

文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/

1.背景

在多个项目中,当我方接口给其他部门人员使用时出现了插入数据失败或者插入的数据在WMTS请求中无法显示出来的问题。针对这些问题,我在这篇文章中,将详细描述造成以上问题的原因。在此WebGIS产品的前台和后台接口中,此插入数据核心部分均是FeatureServer请求。所以我们首先对FeatureSever服务做一个大致的了解。

2.FeatureServer服务的大致了解

2.1 FeatureServer服务提供的功能

FeatureServer服务可以提供如下几种服务:

AGS中通过FeatureServer插入数据失败、插入数据在WMTS请求中无法显示以及version概念的讨论

我们可以得出以下结论:FeatureServer服务主要提供对数据的增删查改操作。

2.2 FeatureServer服务的发布

FeatureServer服务能够发布首先要到达这个条件,即发布的MXD或MSD,其数据源要来之空间数据库,即GeoDatabase或者通过SDE连接的关系型数据库。

达到这个条件的数据,在发布时勾选FeatureAccess,即可发布成功。

AGS中通过FeatureServer插入数据失败、插入数据在WMTS请求中无法显示以及version概念的讨论

3.探讨FeatureServer插入数据失败的原因

3.1 几何要素不正确

当我们要插入数据的图层是面图层时,插入的数据信息中Geometry属性却用点要素的格式进行了描述。

例如:本该是:

AGS中通过FeatureServer插入数据失败、插入数据在WMTS请求中无法显示以及version概念的讨论

却插入的是:

AGS中通过FeatureServer插入数据失败、插入数据在WMTS请求中无法显示以及version概念的讨论

3.2格式不正确

JSON串中要素表示的格式不正确,或者JSON串本身格式不正确,例如多(少)了“{”“[”符号,都会导致插入失败。

3.3 要素中缺少了M值或者Z值

这个问题我们经常遇到,实际需求本来是与M值或者Z值无关的,但是插入数据时却报了这样的错误。导致这个问题出现的原因往往是因为生成的新要素无意中勾选了与M值或Z值有关的选项。比如:

AGS中通过FeatureServer插入数据失败、插入数据在WMTS请求中无法显示以及version概念的讨论

解决这个问题的一般方法是:

如果是一个无数据的空图层,则删除之前的要素重新创建一个要素,不勾选Geometry Properties中的选项即可。

如果是一个有数据的图层,则删除之前的图层,然后重新将此图层入库。入库时设置图层属性.去掉M值和Z值。

AGS中通过FeatureServer插入数据失败、插入数据在WMTS请求中无法显示以及version概念的讨论

3.4 总是报500的错误

此为ArcGIS内部错误,造成此问题的原因往往是空间数据库连接数已满或者游标已满。我们可以增加数据库的游标,以及杀无用经常以及设置最大连接数等。此方法在我ArcGIS的相关文章里可以找到。

4.关于FeatureServer插入数据的进一步探讨

4.1 插入几何要素不在图层范围内一定会导致插入失败么?

这里我做了一组实验,分别是在AGS10.0和AGS10.1上。

4.1.1 AGS10.0上插入几何要素不在图层范围内数据会导致失败

下面是我的图层几何范围,当我插入一个几何要素不在图层范围内的数据时,会报错不能设置插入要素的几何要素,导致插入失败。

AGS中通过FeatureServer插入数据失败、插入数据在WMTS请求中无法显示以及version概念的讨论

AGS中通过FeatureServer插入数据失败、插入数据在WMTS请求中无法显示以及version概念的讨论

AGS中通过FeatureServer插入数据失败、插入数据在WMTS请求中无法显示以及version概念的讨论

4.1.2 在AGS10.1上插入几何要素不在范围内的数据可以成功

图层范围同样是:

AGS中通过FeatureServer插入数据失败、插入数据在WMTS请求中无法显示以及version概念的讨论

插入不在图层范围内的要素却可以成功:

AGS中通过FeatureServer插入数据失败、插入数据在WMTS请求中无法显示以及version概念的讨论

4.2插入的要素存在图层属性中没有的属性时会导致失败吗?

4.2.1 当插入的测试值为字符串时

以下是我做测试的图层所拥有的属性:

AGS中通过FeatureServer插入数据失败、插入数据在WMTS请求中无法显示以及version概念的讨论

插入的数据为多了一个test属性值:

AGS中通过FeatureServer插入数据失败、插入数据在WMTS请求中无法显示以及version概念的讨论

此时一样可以成功:

AGS中通过FeatureServer插入数据失败、插入数据在WMTS请求中无法显示以及version概念的讨论

但是,我要提个问题,这个多出来的属性真的可以插入到图层中么?我在数据库中对数据进行了查询,结论是,不能。

AGS中通过FeatureServer插入数据失败、插入数据在WMTS请求中无法显示以及version概念的讨论

4.2.2当插入的测试值时数字时(对位数有要求)

4.2.2.1AGS10.0中测试

a.测试值为:12345678912,一个十一位数时,结果失败:

AGS中通过FeatureServer插入数据失败、插入数据在WMTS请求中无法显示以及version概念的讨论

b.测试值为十位以内,成功:

AGS中通过FeatureServer插入数据失败、插入数据在WMTS请求中无法显示以及version概念的讨论

c.当插入的是字符串,多于十位数时,成功:

AGS中通过FeatureServer插入数据失败、插入数据在WMTS请求中无法显示以及version概念的讨论

4.2.2.2AGS10.2中测试

在10.2中则无此情况:

AGS中通过FeatureServer插入数据失败、插入数据在WMTS请求中无法显示以及version概念的讨论

4.3 缺少Geometry属性

4.3.1 在AGS10.0中,插入失败

AGS中通过FeatureServer插入数据失败、插入数据在WMTS请求中无法显示以及version概念的讨论

4.3.2 在AGS10.1中,插入成功

AGS中通过FeatureServer插入数据失败、插入数据在WMTS请求中无法显示以及version概念的讨论

AGS中通过FeatureServer插入数据失败、插入数据在WMTS请求中无法显示以及version概念的讨论

但是结果中,无Geometry要素:

AGS中通过FeatureServer插入数据失败、插入数据在WMTS请求中无法显示以及version概念的讨论

4.3.3小结

所以,插入数据时最好是带Geometry属性,否则即使插入成功了,返回数据中如果无Geometry属性,也不可能在前台绘制出对应的要素。

5.插入的数据无法在WMTS请求中显示

当我们在FeatureServer中插入数据成功了,可是通过WMTS服务来请求此图层中该范围的要素时,却在请求得到的瓦片中没有发现此添加的要素,这又是怎么回事呢?

我这里直接告诉大家答案,原因是因为我们在Mxd中对该图层的要素显示进行了分类,即不同的区间用不同的图标显示,而我们插入的数据却完全不在这个分区内,所以在瓦片上没有显示出来。但是我们通过数据库或者直接在mxd上查看时,是可以查到该添加要素的。

AGS中通过FeatureServer插入数据失败、插入数据在WMTS请求中无法显示以及version概念的讨论

以上便是分类显示了(上面截图有感叹号,是数据源丢失问题,通过repairData重新关联数据源即可,这里不做演示)。我们只需要在该图层中添加一个包含插入数据范围的分类,便可以在下次WMTS请求时看到我们的插入数据。

这里提一下,在AGS10.1中,必须重新发布服务才能使该设置生效。

6.从FeatureServer出发讨论ArcGIS中Version的概念

在第五章中我们可以看到,通过FeatureServer服务插入的数据是直接插入到了SDE里的图层主表中。但是,如果我们ArcMap对数据源为SDE连接的数据进行编辑时,有是什么样的情况呢?

6.1 通过ArcMap编辑数据

如果我们直接通过Editor进行编辑时,会报出如下错误:

AGS中通过FeatureServer插入数据失败、插入数据在WMTS请求中无法显示以及version概念的讨论

这时,我们必须到catalog中对该数据进行版本注册方能插入数据:
AGS中通过FeatureServer插入数据失败、插入数据在WMTS请求中无法显示以及version概念的讨论

然后再点击Editor,便会弹出如下对话框:

AGS中通过FeatureServer插入数据失败、插入数据在WMTS请求中无法显示以及version概念的讨论

如果此处勾选,则在以后的编辑中,如果点击保存,则所有数据将自动保存到基表中,并删除所有在增量表的数据;如果不勾选,则保存后所有数据数据不会提交到基表中,

如果要查询当前已经审核入库的所有数据只能通过查询视图的方式(视图为:数据集名称_VW)。

我们一般为勾选,然后点击OK,便可以编辑了。

6.2通过ArcMap编辑的数据是保存在哪里了?

如果我们没有将编辑的数据同步保存到base表中,那么它将保存到哪里呢?这里,我给出几个查询结果。我在上水井盖图层中编辑了一个要素,其ID号是9876,然后查询base表,发现其并不存在。查询a101表时,却发现了它。可见,我们添加的数据,保存到这个表里了。

AGS中通过FeatureServer插入数据失败、插入数据在WMTS请求中无法显示以及version概念的讨论

AGS中通过FeatureServer插入数据失败、插入数据在WMTS请求中无法显示以及version概念的讨论

6.3详解

6.3.1适用条件

仅支持企业地理数据库(ArcSDE地理数据库),而个人地理数据库、文件型地理数据库不支持;

6.3.2 version定义

版本是整个地理数据库在某个时刻的快照,其中包含地理数据库中的所有数据集。利用版本化,多个用户可对 ArcSDE 地理数据库中的同一数据进行编辑,而无需应用锁或复制数据。

6.3.3 version的分类

在TOC控件中,点击”List by Source”视图,可以看每个数据集的来源。

AGS中通过FeatureServer插入数据失败、插入数据在WMTS请求中无法显示以及version概念的讨论

默认的版本是DEFAULT 版本,它是每个 ArcSDE 地理数据库都具的。

同时版本中还有子版本:即从任意现有版本创建子版本或分支版本的方式来创建版本,如可以通过创建 DEFAULT 版本的子版本来创建第一个版本。子版本会从父版本从继承所有相关数据。一个创建好的版本树如下:

AGS中通过FeatureServer插入数据失败、插入数据在WMTS请求中无法显示以及version概念的讨论

在TOC中还能进行版本切换:

AGS中通过FeatureServer插入数据失败、插入数据在WMTS请求中无法显示以及version概念的讨论

6.3.4 工作原理

数据集(要素类、要素数据集或表)注册为版本后,数据库中将会创建两个增量表:用于插入和更新的 A(添加)表以及用于删除的 D(删除)表。每次更新或删除数据集中的记录时,都会向这两个表或其中一个表添加行。

我们对数据的操作并不直接保存到base表中,而是首先保存到一些分支表中,比如A表、D表。这样即使插入了脏数据,base表也不会被污染,同时当其他用户也使用相同source时,大家都以base中的数据为标准,以此达到数据一致。只有当前用户操作ArcMap将自己插入的数据同步到Base表中时,另一用户才能访问到。

其中A表和B表均是在我们在数据库新建一个要素时便相对应产生的。例如,我们在数据库中新建了一个Line要素类,然后将其注册为版本后,数据库中出现了如下两个表:a8,D8,其中8代表该要素类在[SDE_table_registry]表中的数据集的ID。

SDE表中,除了A表和D表,同时它还拥有State表、State_lineages表等。

6.4 由原理展开讨论

在看了以上原理后,我们知道在SDE中与一个图层相对应的表,并不仅仅只有dlgis.(某图层)这样一张表,它会包含一些版本表以及状态表关系表之类的。如果我们通过plsql强行对dlgis.(某图层表)进行增删查改或者添加属性,极容易引起此图层被毁坏,导致矢量查询以及FeatureServer服务对此图层失效。严重的会导致该数据集出现问题,该数据集对应的图层组下服务均失效。

建议需要修改图层数据时,可以直接使用arcMap通过sde关联此图层后,然后打开layers table,进行增删查改。

7.感谢

本文在ArcGIS的Version原理部分,借鉴了博客园中另一作者彭立云http://www.cnblogs.com/hanchan)写的关于Version的相关理论,特别感谢作者的分享,让我受益匪浅。

-----欢迎转载,但保留版权,请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/

如果您觉得本文确实帮助了您,可以微信扫一扫,进行小额的打赏和鼓励,谢谢 ^_^

                                    AGS中通过FeatureServer插入数据失败、插入数据在WMTS请求中无法显示以及version概念的讨论