先描述一下問題:
環境:ArcGIS10.x、Oracle 11g R2,該問題與環境沒有關系
如果使用者使用關聯查詢(比如一個空間資料與一個屬性資料進行關聯),在ArcGIS for Desktop中查詢的結果(檢視屬性表),與進行REST的Query(where條件輸入1=1即查詢所有資料)查詢的結果不一緻,一般情況下REST的Query查詢比桌面查詢的結果要多。
----------------------------------------------------------------------------------
版權所有,文章允許轉載,但必須以連結方式注明源位址,否則追究法律責任!
Blog: http://blog.csdn.net/linghe301
----------------------------------------------------------------------------------
測試資料說明:
空間資料place

屬性資料 owner
我們可以看出空間資料的place.pid與屬性資料的owner.pid是關聯字段,那麼我們可以看到place有三個要素與owner的5條記錄可以關聯上。
----------------------------------------------------------------------------------
版權所有,文章允許轉載,但必須以連結方式注明源位址,否則追究法律責任!
Blog: http://blog.csdn.net/linghe301
----------------------------------------------------------------------------------
那麼如果使用者使用ArcGIS for Desktop的Join之後,在ArcMap中就可以看到空間資料的三條記錄
但是我在REST接口Query中WHERE輸入“1=1”查出來的結果是5條記錄
從上圖分析可以看出,REST的Query查詢結果為5條記錄,但是細心的讀者可以看出,其中各有兩條記錄是重複記錄,這個聯系到我們看到的Owner表記錄的資訊,其實這就是一個Oracle的連接配接關系,如果以屬性資料為基準,那麼關聯起來的資料應該就是5條記錄。
----------------------------------------------------------------------------------
版權所有,文章允許轉載,但必須以連結方式注明源位址,否則追究法律責任!
Blog: http://blog.csdn.net/linghe301
----------------------------------------------------------------------------------
我也使用了QueryLayer或者ArcSDE視圖分别進行了測試,結果都是一樣的,而且,通過Oracle資料庫檢視建立的視圖也可以看出來,資料庫中的确存儲了5條記錄。
那麼問題又出來了,為什麼ArcGIS for Desktop記錄的是3條資料呢?通過跟蹤ArcGIS操作的Oracle背景trace檔案可以看出:
1:通過空間關系查詢語句,以我建立的SDE視圖MyVIEW為例
ArcMap首先做了一個空間查詢,使用SDE.ST_EnvIntersects過濾,如果輸入相關值,可以得到5條記錄。
----------------------------------------------------------------------------------
版權所有,文章允許轉載,但必須以連結方式注明源位址,否則追究法律責任!
Blog: http://blog.csdn.net/linghe301
----------------------------------------------------------------------------------
2:通過空間索引進行過濾
那麼ArcMap又做了一層過濾,通過空間索引,而且有一個非常關鍵的SQL關鍵字(“distinct”),是以通過這個,ArcMap結果已經從5條變成了3條。
----------------------------------------------------------------------------------
版權所有,文章允許轉載,但必須以連結方式注明源位址,否則追究法律責任!
Blog: http://blog.csdn.net/linghe301
----------------------------------------------------------------------------------
那麼問題的原因基本上明白了,ArcMap内部做了一個過濾重複的操作,但是REST的Query頁面中,由于基本沒有對SELECT選項的操作(Distinct一般都輸入在Select關鍵字後),是以無法獲得正确的結果。
那麼使用者可以使用QueryLayer的方式在進行操作。
----------------------------------------------------------------------------------
版權所有,文章允許轉載,但必須以連結方式注明源位址,否則追究法律責任!
Blog: http://blog.csdn.net/linghe301
----------------------------------------------------------------------------------
通過QueryLayer,我們可以添加Distinct關鍵字,過濾重複記錄,那麼我們就可以在REST的Query裡面獲得正确的結果了。
----------------------------------------------------------------------------------
版權所有,文章允許轉載,但必須以連結方式注明源位址,否則追究法律責任!
Blog: http://blog.csdn.net/linghe301
----------------------------------------------------------------------------------
其他參考:
ArcGIS表關聯方式介紹(一)-Join、Relate
http://blog.csdn.net/linghe301/article/details/6649689
ArcGIS表關聯方式介紹(二)-ArcSDE視圖、QueryLayer、RelationshipClass
http://blog.csdn.net/linghe301/article/details/6649717
ArcSDE性能分析——跟蹤Oracle的Trace檔案
http://blog.csdn.net/linghe301/article/details/8640864
----------------------------------------------------------------------------------
版權所有,文章允許轉載,但必須以連結方式注明源位址,否則追究法律責任!
Blog: http://blog.csdn.net/linghe301
----------------------------------------------------------------------------------