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

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插入的要素存在图层属性中没有的属性时会导致失败吗?

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

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

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

此时一样可以成功:

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

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

4.2.2.1AGS10.0中测试

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

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

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

4.2.2.2AGS10.2中测试

在10.2中则无此情况:

4.3 缺少Geometry属性

4.3.1 在AGS10.0中,插入失败

4.3.2 在AGS10.1中,插入成功

但是结果中,无Geometry要素:

4.3.3小结

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

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

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

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

以上便是分类显示了(上面截图有感叹号,是数据源丢失问题,通过repairData重新关联数据源即可,这里不做演示)。我们只需要在该图层中添加一个包含插入数据范围的分类,便可以在下次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.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概念的讨论的更多相关文章

  1. 在基于vue的webpack脚手架开发中使用了代理转发,结果浏览器发出的请求中不带cookie导致登录时总是session失效怎么办?

    环境:            有2个业务接口需要转发到82的服务器上:     ../user/getCode.do     ../user/doLogin.do 现象:          使用上述的 ...

  2. Http请求中Content-Type讲解以及在Spring MVC中的应用

    引言: 在Http请求中,我们每天都在使用Content-type来指定不同格式的请求信息,但是却很少有人去全面了解content-type中允许的值有多少,这里将讲解Content-Type的可用值 ...

  3. HTTP请求中浏览器缓存

    本文导读:浏览器缓存机制,其实主要就是HTTP协议定义的缓存机制.客户端缓存是否需要是可以在服务端代码上控制的.那就是响应头.响应头告诉缓存器不要保留缓存,缓存器就不会缓存相应内容:如果请求信息是需要 ...

  4. Http请求中 content-type 和 dataType 区别

    contentType: 告诉服务器,我要发什么类型的数据 dataType:告诉服务器,我要想什么类型的数据,如果没有指定,那么会自动推断是返回 XML,还是JSON,还是script,还是Stri ...

  5. 完美解决ListView中事件ItemCreated中使用ClientID导致插入数据失败

    于昨天晚上看到视频做到这个例子,但是发现始终有错误,在ListView的ItemCreated事件中使用了ClientID则会导致数据插入数据库失败.当点击插入按钮时,网页就像点击F5刷新一样,无任何 ...

  6. mysql 插入数据失败防止自增长主键增长的方法

    mysql设置了自增长主键ID,插入失败的那个自增长ID也加一的,比如失败5个,下一个成功的不是在原来最后成功数据加1,而是直接变成加6了,失败次数一次就自动增长1了,能不能让失败的不增长的? 或者说 ...

  7. 当插入数据失败时,防止mysql自增长字段的自增长的方法

    问题描述: 当mysql设置了自增长字段时(注意:一个表中只能设置一个自增长字段,可以不是主键,但必须是键 ),如果插入数据失败,那么自增长字段仍然会占用这个自增长值,再次成功插入数据时就会造成断层. ...

  8. JAVA对数据库进行操作,实现数据库中数据的插入,查询,更改,删除操作

    (—)通过mysql workbench 创建一个数据库,在这里命名为company,然后建一个tb_employee表 (二)以下是java代码对表tb_employee的操作 1 创建一个Empl ...

  9. 在MyBatis中查询数据、涉及多参数的数据访问操作、插入数据时获取数据自增长的id、关联表查询操作、动态SQL、关于配置MyBatis映射没有代码提示的解决方案

    1. 单元测试 在单元测试中,每个测试方法都需要执行相同的前置代码和后置代码,则可以自定义2个方法,分别在这2个方法中执行前置代码和后置代码,并为这2个方法添加@Before和@After注解,然后, ...

随机推荐

  1. pythonchallenge 解谜 Level 4

    下一关... 一张图片,于是就点击了一下. 跳转到了 http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=12345 显示的是: ...

  2. (转)详解css3弹性盒模型(Flexbox)

    今天刚学了css3的弹性盒模型,这是一个可以让你告别浮动.完美实现垂直水平居中的新特性. Flexbox是布局模块,而不是一个简单的属性,它包含父元素和子元素的属性. Flexbox布局的主体思想是似 ...

  3. Java 中类型转换

    int -> String int i=12345; String s=""; 第一种方法:s=i+""; 第二种方法:s=String.valueOf( ...

  4. C# 定时器 Timers.Timer Forms.Timer

    1.定义在System.Windows.Forms里 Windows.Forms里面的定时器比较简单,只要把工具箱中的Timer控件拖到窗体上,然后设置一下事件和间隔时间等属性就可以了 //启动定时器 ...

  5. C#用扩展方法进行自动生成添加删除对象转换的功能

    public static class ExtendedModel { #region 实体类的增删改查 #region 添加 public static string AddStr(this obj ...

  6. Remote Desktop Connection Manager

    通过Remote Desktop Connection Manager(RDCMan),当前最新版本是 v2.7. 通过这款软件,我们便可以轻松的管理和访问数个RDP.左边的列表中我们可以创建总的分区 ...

  7. HTTPS工作原理

    HTTPS是什么 HTTPS全称为Hypertext Transfer Protocol over Secure Socket Layer,及以安全为目标的HTTP通道,简单说就是HTTP的安全版本. ...

  8. LNMP安装过程

    LNMP一键安装包是什么? LNMP一键安装包是一个用Linux Shell编写的可以为CentOS/RadHat/Fedora.Debian/Ubuntu/Raspbian/Deepin VPS或独 ...

  9. titit. 深入理解 内聚( Cohesion)原理and  attilax大总结

    atitit. 深入理解 内聚( Cohesion)原理and  attilax大总结         1.1. 内聚的概念 1 1.1.1. 高内聚模式关于这个问题给出的答案是:分配职责,使其可保持 ...

  10. eCharts动态加载各省份的数据

    假如从数据库读出以下数据,如何将数据展示在地图之上 1.部门的名称数据: List deptname=[联通事业部-上海联通项目组, 联通事业部-河南联通项目组, 联通事业部-贵州联通项目组, 联通事 ...