首页 > 代码库 > AGS中通过FeatureServer插入数据失败、插入数据在WMTS请求中无法显示以及version概念的讨论
AGS中通过FeatureServer插入数据失败、插入数据在WMTS请求中无法显示以及version概念的讨论
1.背景
在多个项目中,当我方接口给其他部门人员使用时出现了插入数据失败或者插入的数据在WMTS请求中无法显示出来的问题。针对这些问题,我在这篇文章中,将详细描述造成以上问题的原因。在此WebGIS产品的前台和后台接口中,此插入数据核心部分均是FeatureServer请求。所以我们首先对FeatureSever服务做一个大致的了解。
2.FeatureServer服务的大致了解
2.1 FeatureServer服务提供的功能
FeatureServer服务可以提供如下几种服务:
我们可以得出以下结论:FeatureServer服务主要提供对数据的增删查改操作。
2.2 FeatureServer服务的发布
FeatureServer服务能够发布首先要到达这个条件,即发布的MXD或MSD,其数据源要来之空间数据库,即GeoDatabase或者通过SDE连接的关系型数据库。
达到这个条件的数据,在发布时勾选FeatureAccess,即可发布成功。
3.探讨FeatureServer插入数据失败的原因
3.1 几何要素不正确
当我们要插入数据的图层是面图层时,插入的数据信息中Geometry属性却用点要素的格式进行了描述。
例如:本该是:
却插入的是:
3.2格式不正确
JSON串中要素表示的格式不正确,或者JSON串本身格式不正确,例如多(少)了“{”“[”符号,都会导致插入失败。
3.3 要素中缺少了M值或者Z值
这个问题我们经常遇到,实际需求本来是与M值或者Z值无关的,但是插入数据时却报了这样的错误。导致这个问题出现的原因往往是因为生成的新要素无意中勾选了与M值或Z值有关的选项。比如:
解决这个问题的一般方法是:
如果是一个无数据的空图层,则删除之前的要素重新创建一个要素,不勾选Geometry Properties中的选项即可。
如果是一个有数据的图层,则删除之前的图层,然后重新将此图层入库。入库时设置图层属性.去掉M值和Z值。
3.4 总是报500的错误
此为ArcGIS内部错误,造成此问题的原因往往是空间数据库连接数已满或者游标已满。我们可以增加数据库的游标,以及杀无用经常以及设置最大连接数等。此方法在我ArcGIS的相关文章里可以找到。
4.关于FeatureServer插入数据的进一步探讨
4.1 插入几何要素不在图层范围内一定会导致插入失败么?
这里我做了一组实验,分别是在AGS10.0和AGS10.1上。
4.1.1 AGS10.0上插入几何要素不在图层范围内数据会导致失败
下面是我的图层几何范围,当我插入一个几何要素不在图层范围内的数据时,会报错不能设置插入要素的几何要素,导致插入失败。
4.1.2 在AGS10.1上插入几何要素不在范围内的数据可以成功
图层范围同样是:
插入不在图层范围内的要素却可以成功:
4.2插入的要素存在图层属性中没有的属性时会导致失败吗?
以下是我做测试的图层所拥有的属性:
插入的数据为多了一个test属性值:
此时一样可以成功:
但是,我要提个问题,这个多出来的属性真的可以插入到图层中么?我在数据库中对数据进行了查询,结论是,不能。
5.插入的数据无法在WMTS请求中显示
当我们在FeatureServer中插入数据成功了,可是通过WMTS服务来请求此图层中该范围的要素时,却在请求得到的瓦片中没有发现此添加的要素,这又是怎么回事呢?
我这里直接告诉大家答案,原因是因为我们在Mxd中对该图层的要素显示进行了分类,即不同的区间用不同的图标显示,而我们插入的数据却完全不在这个分区内,所以在瓦片上没有显示出来。但是我们通过数据库或者直接在mxd上查看时,是可以查到该添加要素的。
以上便是分类显示了(上面截图有感叹号,是数据源丢失问题,通过reapareData重新关联数据源即可,这里不做演示)。我们只需要在该图层中添加一个包含插入数据范围的分类,便可以在下次WMTS请求时看到我们的插入数据。
这里提一下,在AGS10.1中,必须重新发布服务才能使该设置生效。
6.从FeatureServer出发讨论ArcGIS中Version的概念
在第五章中我们可以看到,通过FeatureServer服务插入的数据是直接插入到了SDE里的图层主表中。但是,如果我们ArcMap对数据源为SDE连接的数据进行编辑时,有是什么样的情况呢?
6.1 通过ArcMap编辑数据
如果我们直接通过Editor进行编辑时,会报出如下错误:
这时,我们必须到catalog中对该数据进行版本注册方能插入数据:
然后再点击Editor,便会弹出如下对话框:
如果此处勾选,则在以后的编辑中,如果点击保存,则所有数据将自动保存到基表中,并删除所有在增量表的数据;如果不勾选,则保存后所有数据数据不会提交到基表中,
如果要查询当前已经审核入库的所有数据只能通过查询视图的方式(视图为:数据集名称_VW)。
我们一般为勾选,然后点击OK,便可以编辑了。
6.2通过ArcMap编辑的数据是保存在哪里了?
如果我们没有将编辑的数据同步保存到base表中,那么它将保存到哪里呢?这里,我给出几个查询结果。我在上水井盖图层中编辑了一个要素,其ID号是9876,然后查询base表,发现其并不存在。查询a101表时,却发现了它。可见,我们添加的数据,保存到这个表里了。
6.3详解
6.3.1适用条件
仅支持企业地理数据库(ArcSDE地理数据库),而个人地理数据库、文件型地理数据库不支持;
6.3.2 version定义
版本是整个地理数据库在某个时刻的快照,其中包含地理数据库中的所有数据集。利用版本化,多个用户可对 ArcSDE 地理数据库中的同一数据进行编辑,而无需应用锁或复制数据。
6.3.3 version的分类
在TOC控件中,点击”List by Source”视图,可以看每个数据集的来源。
默认的版本是DEFAULT 版本,它是每个 ArcSDE 地理数据库都具的。
同时版本中还有子版本:即从任意现有版本创建子版本或分支版本的方式来创建版本,如可以通过创建 DEFAULT 版本的子版本来创建第一个版本。子版本会从父版本从继承所有相关数据。一个创建好的版本树如下:
在TOC中还能进行版本切换:
6.3.3 工作原理
数据集(要素类、要素数据集或表)注册为版本后,数据库中将会创建两个增量表:用于插入和更新的 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表等。
7.感谢
本文在ArcGIS的Version原理部分,借鉴了博客园中另一作者彭立云(http://www.cnblogs.com/hanchan)写的关于Version的相关理论,特别感谢作者的分享,让我受益匪浅。
--欢迎转载,但保留版权,请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/
AGS中通过FeatureServer插入数据失败、插入数据在WMTS请求中无法显示以及version概念的讨论