文章版權由做者李曉暉和博客園共有,若轉載請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/。sql
在多個項目中,當我方接口給其餘部門人員使用時出現了插入數據失敗或者插入的數據在WMTS請求中沒法顯示出來的問題。針對這些問題,我在這篇文章中,將詳細描述形成以上問題的緣由。在此WebGIS產品的前臺和後臺接口中,此插入數據核心部分均是FeatureServer請求。因此咱們首先對FeatureSever服務作一個大體的瞭解。數據庫
FeatureServer服務能夠提供以下幾種服務:微信
咱們能夠得出如下結論:FeatureServer服務主要提供對數據的增刪查改操做。測試
FeatureServer服務可以發佈首先要到達這個條件,即發佈的MXD或MSD,其數據源要來之空間數據庫,即GeoDatabase或者經過SDE鏈接的關係型數據庫。3d
達到這個條件的數據,在發佈時勾選FeatureAccess,便可發佈成功。blog
當咱們要插入數據的圖層是面圖層時,插入的數據信息中Geometry屬性卻用點要素的格式進行了描述。繼承
例如:本該是:接口
卻插入的是:字符串
JSON串中要素表示的格式不正確,或者JSON串自己格式不正確,例如多(少)了「{」「[」符號,都會致使插入失敗。get
這個問題咱們常常遇到,實際需求原本是與M值或者Z值無關的,可是插入數據時卻報了這樣的錯誤。致使這個問題出現的緣由每每是由於生成的新要素無心中勾選了與M值或Z值有關的選項。好比:
解決這個問題的通常方法是:
若是是一個無數據的空圖層,則刪除以前的要素從新建立一個要素,不勾選Geometry Properties中的選項便可。
若是是一個有數據的圖層,則刪除以前的圖層,而後從新將此圖層入庫。入庫時設置圖層屬性.去掉M值和Z值。
此爲ArcGIS內部錯誤,形成此問題的緣由每每是空間數據庫鏈接數已滿或者遊標已滿。咱們能夠增長數據庫的遊標,以及殺無用常常以及設置最大鏈接數等。此方法在我ArcGIS的相關文章裏能夠找到。
這裏我作了一組實驗,分別是在AGS10.0和AGS10.1上。
下面是個人圖層幾何範圍,當我插入一個幾何要素不在圖層範圍內的數據時,會報錯不能設置插入要素的幾何要素,致使插入失敗。
圖層範圍一樣是:
插入不在圖層範圍內的要素卻能夠成功:
如下是我作測試的圖層所擁有的屬性:
插入的數據爲多了一個test屬性值:
此時同樣能夠成功:
可是,我要提個問題,這個多出來的屬性真的能夠插入到圖層中麼?我在數據庫中對數據進行了查詢,結論是,不能。
a.測試值爲:12345678912,一個十一位數時,結果失敗:
b.測試值爲十位之內,成功:
c.當插入的是字符串,多於十位數時,成功:
在10.2中則無此狀況:
可是結果中,無Geometry要素:
因此,插入數據時最好是帶Geometry屬性,不然即便插入成功了,返回數據中若是無Geometry屬性,也不可能在前臺繪製出對應的要素。
當咱們在FeatureServer中插入數據成功了,但是經過WMTS服務來請求此圖層中該範圍的要素時,卻在請求獲得的瓦片中沒有發現此添加的要素,這又是怎麼回事呢?
我這裏直接告訴你們答案,緣由是由於咱們在Mxd中對該圖層的要素顯示進行了分類,即不一樣的區間用不一樣的圖標顯示,而咱們插入的數據卻徹底不在這個分區內,因此在瓦片上沒有顯示出來。可是咱們經過數據庫或者直接在mxd上查看時,是能夠查到該添加要素的。
以上即是分類顯示了(上面截圖有感嘆號,是數據源丟失問題,經過repairData從新關聯數據源便可,這裏不作演示)。咱們只須要在該圖層中添加一個包含插入數據範圍的分類,即可以在下次WMTS請求時看到咱們的插入數據。
這裏提一下,在AGS10.1中,必須從新發布服務才能使該設置生效。
在第五章中咱們能夠看到,經過FeatureServer服務插入的數據是直接插入到了SDE裏的圖層主表中。可是,若是咱們ArcMap對數據源爲SDE鏈接的數據進行編輯時,有是什麼樣的狀況呢?
若是咱們直接經過Editor進行編輯時,會報出以下錯誤:
這時,咱們必須到catalog中對該數據進行版本註冊方能插入數據:
而後再點擊Editor,便會彈出以下對話框:
若是此處勾選,則在之後的編輯中,若是點擊保存,則全部數據將自動保存到基表中,並刪除全部在增量表的數據;若是不勾選,則保存後全部數據數據不會提交到基表中,
若是要查詢當前已經審覈入庫的全部數據只能經過查詢視圖的方式(視圖爲:數據集名稱_VW)。
咱們通常爲勾選,而後點擊OK,即可以編輯了。
若是咱們沒有將編輯的數據同步保存到base表中,那麼它將保存到哪裏呢?這裏,我給出幾個查詢結果。我在上水井蓋圖層中編輯了一個要素,其ID號是9876,而後查詢base表,發現其並不存在。查詢a101表時,卻發現了它。可見,咱們添加的數據,保存到這個表裏了。
僅支持企業地理數據庫(ArcSDE地理數據庫),而我的地理數據庫、文件型地理數據庫不支持;
版本是整個地理數據庫在某個時刻的快照,其中包含地理數據庫中的全部數據集。利用版本化,多個用戶可對 ArcSDE 地理數據庫中的同一數據進行編輯,而無需應用鎖或複製數據。
在TOC控件中,點擊」List by Source」視圖,能夠看每一個數據集的來源。
默認的版本是DEFAULT 版本,它是每一個 ArcSDE 地理數據庫都具的。
同時版本中還有子版本:即從任意現有版本建立子版本或分支版本的方式來建立版本,如能夠經過建立 DEFAULT 版本的子版原本建立第一個版本。子版本會從父版本從繼承全部相關數據。一個建立好的版本樹以下:
在TOC中還能進行版本切換:
數據集(要素類、要素數據集或表)註冊爲版本後,數據庫中將會建立兩個增量表:用於插入和更新的 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表等。
在看了以上原理後,咱們知道在SDE中與一個圖層相對應的表,並不只僅只有dlgis.(某圖層)這樣一張表,它會包含一些版本表以及狀態表關係表之類的。若是咱們經過plsql強行對dlgis.(某圖層表)進行增刪查改或者添加屬性,極容易引發此圖層被毀壞,致使矢量查詢以及FeatureServer服務對此圖層失效。嚴重的會致使該數據集出現問題,該數據集對應的圖層組下服務均失效。
建議須要修改圖層數據時,能夠直接使用arcMap經過sde關聯此圖層後,而後打開layers table,進行增刪查改。
本文在ArcGIS的Version原理部分,借鑑了博客園中另外一做者彭立雲(http://www.cnblogs.com/hanchan)寫的關於Version的相關理論,特別感謝做者的分享,讓我受益不淺。
-----歡迎轉載,但保留版權,請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/
若是您以爲本文確實幫助了您,能夠微信掃一掃,進行小額的打賞和鼓勵,謝謝 ^_^