SDEビューとレイヤーを登録する


11

ArcSDE Oracle RAC 10gに対して単純なビューを構築しています。私のSHAPE列はSDO_GEOMETRYデータ型です。ArcSDE 9.3.1。

次のアウトラインを持ついくつかのポイントテーブルがあります。

ID(ガイド)名前(文字列)形状(SHAPE)

Oracleでこれに似たシンプルなビューを作成しました!

CREATE OR REPLACE VIEW VW_POINTS AS

    SELECT ID, Name, Shape from TABLE_A

        UNION ALL

    SELECT ID, Name, Shape from TABLE_B

        -- etc

Oracleのビューは問題なく作成されます。このビューをコマンドラインで登録しました。

sdetable -o create_view -Tポイント-t VW_POINTS -c Id、Name、SHAPEなど

ArcSDEビューが再び作成されます。ArcObjectsを使用してクエリなどを行うことができます。レイヤーを作成する必要があります。コマンドラインツールsdelayer -o registerを試しましたが、成功しませんでした。ビューがサポートされていないというメッセージが表示されます。

ビューを作成するために複雑な構文を使用することもあるため、これを数回行う必要があります。

何が問題ですか?これらの空間ビューをSDEレイヤーとして視覚化する方法(編集する必要はありません。ArcMap内で空間的に表示するだけです)

入力いただきありがとうございます!

編集

これはArcMapのスクリーンショットです。

あなたの幸せのためのArcMapスクリーンショット

要求に応じて、describe_longが来ます

// create_view C:\ Users \ H> sdetable -o create_view -s server -i port -u user -p pass -T view_airspace_points -t vw_airspace_points_oracle -c "*"

この時点で、登録前にnumeric(38,0)としてキャストするなど、oracleのビューを変更しました。

//レイヤーを登録C:\ Users \ H> sdelayer -o register -l view_airspace_points、shape -C OBJECTID、USER-g RTREE -s server -i port -u user -p pass -ep -P HIGH

Oracle10gビルド2784向けArcSDE 9.3.1 Tue Oct 27 10:51:14 2009

レイヤー管理ユーティリティ

レイヤーの説明....:

テーブル所有者..........:SIGMAGIS2

テーブル名...........:VIEW_AIRSPACE_POINTS

空間列.......:形状

レイヤーID .............:1398

SRID .................:79

最小形状ID .....:1

オフセット...............:

falsex:-180.000000

falsey:-90.000000

システムユニット.........:994200.000000

Zオフセット..............:0.000000

Z単位..............:1.000000

オフセットの測定.......:

測定単位........:

XYクラスター許容値:2.0

空間インデックス........:

パラメーター:SPIDX_RTREE

存在する:はい

配列形式:-2,0,0

レイヤーエンベロープ.......:

minx:-180.00000、miny:-90.00000

maxx:180.00000、maxy:90.00000

エンティティ.............:p

レイヤータイプ...........:インライン空間タイプ

作成日........:06/28/11 09:28:45

I / Oモード.............:通常

オートロック..........:有効

精度.............:高

ユーザー特権......:SELECT、UPDATE、INSERT、DELETE

座標系....:GEOGCS ["経度/緯度[WGS 84]"、DATUM ["WGS 84"、SPHEROID ["WGS 84"、6378137.0,298.257223563]]、PRIMEM ["Greenwich"、0.0]、UNIT [ 「10進数

度 "、0.0174532925199433]]

レイヤー構成..:デフォルト


レイヤーファイルを作成する必要がありますか?
DEWright

いいえ、フィーチャクラスのように機能するビューをジオデータベース内に作成する必要があります。
ジョージシルバ

次に、あなたが言うように空間ビューを作成する必要があります。これについては以下で説明します。Spatialレイヤーとして表示されないことがわかる唯一の理由は、アクセス許可を行うことです。ArcGIS / ArcSDEが適切に登録しませんでした。これは空間レイヤーの単なる目的であるため、空間データと表データを統一的な方法で結合するためです。
-DEWright

「sdetable -o describe_long -t victoria -u sasha -p polar.bear -i esri_40」のようにdescribe_longをビューで実行すると、どのような結果が得られますか?空間列とエンティティタイプが正しく設定および参照されているかどうかを確認する必要があります。
-DEWright

1
アラートに感謝します。私はすべてを正しく行いましたが、それでも動作しません。:(非常にfrustatingこれは、オープンソーススタックで行うことができます。非常に簡単
ジョージ・シルバ

回答:


4

過去にこれ(および同様の問題)がありました。それは常に2つのことになりました:

  1. 空間テーブルにいくつかの破損した/無効なジオメトリがありました。ArcMapの問題は、無効なジオメトリを見つけるとすぐにレンダリングが停止することです。

  2. レイヤーの登録が正しくありません。私が見つけたのは、sdelayer -o registerが常に正しく動作するとは限らず、登録エントリを「マッサージ」する必要があることです。

そのため、レイヤーが有効かどうかを確認するには、最初にSDO_GEOM.VALIDATE_LAYER_WITH_CONTEXT 関数を使用します。次に、ArcSDE検証関数sdelayer -o feature_info -r invalid ...を使用して、ArcSDE に従って無効なフィーチャを取得します。おそらくsdelayer -oリストと一緒に(ここを参照)

登録を確認するには、ArcSDEスキーマに戻る必要があります。登録を制御するテーブルは、SDE.LAYERS、SDE.TABLE_REGISTRY、SDE.COLUMN_REGISTRY、SDE.SPATIAL_REFERENCES、およびSDE.GEOMETRY_COLUMNSです。私が使用する1つのコツは、通常、ArcMapで表示する(ベースの列とジオメトリタイプに関する)ベースレイヤーが似ていることです。次に、登録レコードを比較し、表示されるレイヤーと表示されないレイヤーを比較します。整数列の1の変更がどのような違いをもたらすか、驚くでしょう!:-)

COLUMN_REGISTRYのヒント-しなければならないことは、プライマリキー列(SDE.TABLE_REGISTRYでROWID_COLUMNとして定義されているもの)と空間列が正しい(または表示されるレイヤーと同じ)ことを確認することだけです。他のすべての列を無視します。テーブルの所有者としてログインしているArcMapにレイヤーを追加すると、COLUMN_REGISTRYテーブルに不足しているエントリが自動的に追加されます。

これが役立つかどうか教えてください!


入力に感謝します 明日最初にやってみます!あなたが正しいことを願っています!ありがとう!
ジョージシルバ

麻薬中毒者と答えた。これは、さまざまなタイプの登録では機能しましたが、UNIONEDの登録では機能しませんでした。それでも、これは驚くべきヒントです。答えてくれてありがとう。
ジョージシルバ

6

探しているのはSpatial-Viewです。ここで表示される唯一の大きな問題は、参加するフィールドに注意する必要があるということです。これは非常に素晴らしいプロセスです。私は、DBを一般化していた場所全体で使用して、薄い空間データと通信します。

    sdetable -o create_view -T emp_region_view -t "employees,world.regions" 
-c "employees.name,employees.emp_id,world.regions.reg_id,world.regions.rname,world.regions.region"
-a "employee,eid,rid,region,area" -w "employees.emp_id = world.regions.emp_id"
-s myodbserver -i sde:oracle11g:ora1 -u gdb -p gdb.bdg

これはあなたが望むものにあなたの方法であなたをうまく取得する必要があります。重要なのは、フィールドを正しくマップすることです。必要最小限のビューを実行し、SDEに登録したら、UIを使用してそのビューを編集し、よりきめの細かい調整を行う傾向があります。


こんにちはDEこの方法を試しましたが、うまくいきません。私が理解しているのは、ArcSDEが「CREATE FORCE VIEW」コマンドを作成し、事前に列を指定し、句で宣言した列のみを登録することです。空のビューを作成して(フィーチャクラスのみを使用して幾何学的定義を取得)、それを別の定義に置き換えてみました。わかりました。ArcMapでこれをクエリできますが、ジオメトリはマップに表示されません。
ジョージシルバ

1
空間ビューをArcCatalogからArcMapにドラッグした場合、ジオメトリデータとともに表示されませんか?
ブリットウェスコット

前述のように、レイヤーはArcMapまたはArcCatalogプレビューには表示されませんが、正しいジオメトリタイプのレイヤーとしてリストされ、ArcMapでクエリ可能です。
ジョージシルバ

1
「sdetable -o describe_long -t victoria -u sasha -p polar.bear -i esri_40」のようにdescribe_longをビューで実行すると、どのような結果が得られますか?空間列とエンティティタイプが正しく設定および参照されているかどうかを確認する必要があります。
-DEWright

ここに結果を投稿します!
ジョージシルバ

3

欠落しているのは、ArcObjectsがオブジェクトIDに使用できる一意の整数列です。このid列の一意の値を維持する単一のシーケンスを作成してみてください。次に、各テーブルに挿入トリガーを作成して、id列にsequence.nextvalを取り込みます。

sdelayer -o registerコマンドで、キーワードUSERを使用して整数ID列に-Cフラグを設定して、esriが列を管理しようとしないようにしてください。


1
こんにちはjrockers、登録プロセスはうまくいきます。スレッドに対する自分の答えを読んでください。数値(38,0)としてキャストされたOracle生成列(ROWNUM)を使用しています。先端をありがとう、しかし私は既にそれを試みた。
ジョージシルバ

3

回答をスキャンしてみましたが、ArcGISの空間ビューでは、ユニオンクエリが少し問題であることを誰も気付いていなかったようです。これは、ほぼ確実にオブジェクトIDが重複するためです。同じことが、結合述部が一意の「親」レコードを保証しない内部結合クエリにも当てはまります。いずれの場合も、ビューはすべての登録要件に準拠している可能性がありますが、正しく動作しません


入力Robに感謝します。私が書いたビューをよく見ると、Oracles ROWNUMを使用してその場でOIDを生成します。これらは一意であることが保証されています。
ジョージシルバ

1
データが(たとえば)arcmapに表示されている場合、rownumの使用について100%確信していません。Rownumは、Oracleクエリセットの関数です。したがって、クエリを実行するたびに、1から始まる新しい行番号のセットを取得します。これは、各パン/ズームなどが1のオブジェクトIDを生成し、後続のクエリが新しいオブジェクトを生成するため、キャッシュされたオブジェクトID結果。ArcGISにobjectid列を追加させるオプションとして、クエリテーブル作成ツールを検討しましたか?
ロブマクファーソン

2

このスレッドを見たすべての人に感謝します。

プロセスは少し複雑ですが、複雑なクエリをレイヤーとして登録することは可能ですが、それはちょっと巧妙な考えが必要です。これに関するパフォーマンスへの影響はまだわかりませんが、これは常に更新していきます。ArcMapでポイントを表示することにも問題がありますが、さらに調査します。

まず、RDBMSで複雑な空間ビューを作成します。ビューにINTEGER UNIQUE NOT NULL列があることを確認してください。これは、後でArcSDEへの登録に使用できます。

私のクエリは、これに似たUNION ALLの集まりでした。

    SELECT OBJECTID, ID_UNIQUE_ID, AIRSPACE_ID, NM_INDICATIVE, 'XXX' AS "ELEMENT_TYPE",SHAPE FROM tb_XXX    
        UNION ALL

    SELECT OBJECTID, ID_UNIQUE_ID, AIRSPACE_ID, NM_INDICATIVE, 'YYY' AS "ELEMENT_TYPE",SHAPE FROM TB_YYY

このスキーマでは、すべてのオブジェクトにGUIDであるPK ID_UNIQUE_IDがあります。私のObjectIDはフィーチャクラス全体で繰り返されるため、代理ObjectIDには適していません。

私の場合、Oracleのrownum仮想列を使用してすべてのクエリをラップし、効果的な「objectID」を持つビューを作成しました。見てみましょう:

SELECT 
    CAST(ROWNUM AS NUMBER(38,0)) AS "FID",
    OBJECTID,
    ID_UNIQUE_ID,
    AIRSPACE_ID,
    NM_INDICATIVE,
    ELEMENT_TYPE,
    SHAPE 
FROM 
(
    SELECT OBJECTID, ID_UNIQUE_ID, AIRSPACE_ID, NM_INDICATIVE, 'ZZZ' AS "ELEMENT_TYPE",SHAPE FROM TB_ZZZ

        UNION ALL

    SELECT OBJECTID, ID_UNIQUE_ID, AIRSPACE_ID, NM_INDICATIVE, 'XXX' AS "ELEMENT_TYPE",SHAPE FROM tb_XXX

        UNION ALL

    SELECT OBJECTID, ID_UNIQUE_ID, AIRSPACE_ID, NM_INDICATIVE, 'YYY' AS "ELEMENT_TYPE",SHAPE FROM TB_YYY
)

上記のクエリでビューを作成し、その上にビューを作成しました。このビューは、arcsde内の空間レイヤーになります。これはかなり簡単なプロセスです。

その後、空間ビューをレイヤーとして登録しようとしましたが、常に失敗しました。ビューの上にビューを作成すると、ArcSDEはsdetable -o describeユーティリティプログラムに従って、FIDがNUMBER(38,10)、浮動小数点数であると想定します。

Oracleでは、これはビューの定義でした:

  CREATE OR REPLACE FORCE VIEW "schema"."layer_name" ("FID", "OBJECTID", "ID_UNIQUE_ID", "AIRSPACE_ID", "NM_INDICATIVE", "SHAPE") AS 
  SELECT  CAST(fid AS NUMBER(38,0)) AS FID, objectid, id_unique_id, airspace_id, nm_indicative, shape FROM  schema.VW_AIRSPACE_POINTS_ORACLE;

fidカラムをキャストに置き換えた後、すべてが正常に機能しました。レイヤーの登録に進みましたが、うまくいきました。

編集

レイヤーはArcCatalogにポイントレイヤーとして表示され、通常どおりArcMapでテーブルを表示および選択できます(ポイントは強調表示されます)が、それらをシミュレーションして通常のレイヤーとして表示することはできません。なにか?

誰もこれがなぜ起こるのか考えていますか?ArcMap内に空間オブジェクトが表示されないことを除いて、すべてが正常です。何か案は?


1
インデックスを最新の状態に保つと、そのビューのパフォーマンスで多くのことができます。インデックスが毎晩再構築されるように、多数のトランザクションがあるシステムで実行するようにスケジュールされたジョブを設定しました。その後、結合を行うときに、それらのチューニングが改善されます。
-DEWright

arccatalogからarcmapの新しい空のマップにドラッグアンドドロップするとどうなりますか?
カーククイケンドール

ArcMapはTOCに追加しますが、何もレンダリングしません。奇妙なことに、行を選択でき、その行のジオメトリが描画(選択)されます。行が選択されていない場合、何も描画されません。ArcMapを介したクエリも機能します。
ジョージシルバ

1
面白い。arcobjectsコードを記述する場合、IGeoDataset.Extentは機能レイヤーでどのように見えますか?フィーチャクラスの場合はどうですか?
カーククイケンドール

やってみます!どれどれ。
ジョージシルバ

2

次のコマンドを実行してみてください:sdelayer -o alter -l [-S] [-k] [-i | | ] [-s] [-D] -E calc -u [-p]


コメントありがとうございます。すでにレイヤーの範囲を再計算しようとしました。
ジョージシルバ

2

私の経験では、Arcでレイヤーが表示されないのは、空間インデックスが欠落しているためです。ビューはソーステーブルの空間インデックスを使用しますが、登録ステートメントでビューの空間インデックスを作成しているようです。

ソーステーブルのいずれかに空間インデックスがありますか?そうでない場合は、Oracleで作成し、-gなしでビューを再登録してください。

別の可能性は、2つのテーブルのジオメトリを1つの列に結合していることです。


そのマットを試してみます。また、複数のジオメトリを別のビューの1つに結合していますが、これが機能することは非常に重要です。ビュー上に線ストリングを構築していますが、その結合ビューは、これらのレイヤーの単一のサポートポイントであると想定されていました。私はこれが起こっていないので、他のアプローチを試しています。
ジョージシルバ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.