Daftarkan tampilan SDE dan Layer

11

Saya sedang membangun pandangan sederhana terhadap ArcSDE Oracle RAC 10g. Kolom SHAPE saya menggunakan tipe data SDO_GEOMETRY. ArcSDE 9.3.1.

Saya memiliki beberapa tabel poin, dengan garis besar berikut:

ID (Guid) Name (string) Shape (SHAPE)

Saya telah membangun tampilan sederhana seperti ini di 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

Tampilan di Oracle dibuat dengan baik. Saya sudah mendaftarkan tampilan ini dengan baris perintah:

sdetable -o create_view -T POINTS -t VW_POINTS -c Id, Name, SHAPE dll

Tampilan ArcSDE dibuat lagi, baik-baik saja. Saya dapat menggunakan ArcObjects untuk menanyakannya, dll. Sekarang saya perlu membuat Layer. Saya sudah mencoba alat baris perintah, sdelayer -o daftar, tapi saya tidak berhasil. Itu memberi saya pesan, mengatakan bahwa pandangan tidak didukung.

Saya perlu melakukan ini beberapa kali, kadang-kadang menggunakan sintaksis kompleks untuk membangun tampilan.

Apa masalahnya? Bagaimana memvisualisasikan tampilan spasial ini sebagai lapisan SDE (saya tidak perlu mengeditnya, cukup melihatnya secara spasial di dalam ArcMap)

Terima kasih atas masukannya!

EDIT

Ini adalah tangkapan layar di ArcMap, untuk deligth Anda: P

Screenshot ArcMap untuk kebahagiaan Anda :

Seperti yang diminta, ini dia description_long

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

pada titik ini saya mengubah tampilan pada oracle, termasuk gips sebagai angka (38,0) sebelum pendaftaran.

// register layer C: \ Users \ H> sdelayer -o register -l view_airspace_points, bentuk -C OBJECTID, USER - g RTREE -s server -i port -u pengguna -p pass -ep -P TINGGI

ArcSDE 9.3.1 untuk Oracle10g Build 2784 Sel 27 Okt 10:51:14 2009

Utilitas Administrasi Lapisan

Deskripsi Lapisan ....:

Pemilik Meja ..........: SIGMAGIS2

Nama Tabel ...........: VIEW_AIRSPACE_POINTS

Kolom Spasial .......: SHAPE

Id Lapisan .............: 1398

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

Minimum Bentuk Id .....: 1

Offset ...............:

falsex: -180.000000

falsey: -90.000000

Unit Sistem .........: 994200.000000

Z Offset ..............: 0,000000

Z Unit ..............: 1.000000

Mengukur Offset .......:

Unit Ukur ........:

XY Cluster Tolerance.: 2.0

Indeks Tata Ruang ........:

parameter: SPIDX_RTREE

ada: Ya

bentuk array: -2,0,0

Lapisan Amplop .......:

minx: -180.00000, miny: -90.00000

maxx: 180,00000, maxy: 90,00000

Entitas .............: hlm

Tipe Lapisan ...........: Tipe Spasial In-Line

Tanggal Pembuatan ........: 06/28/11 09:28:45

Mode I / O .............: NORMAL

Penguncian Otomatis ..........: Diaktifkan

Presisi .............: Tinggi

Keistimewaan Pengguna ......: SELECT, UPDATE, INSERT, DELETE

Sistem Koordinat ....: GEOGCS ["Bujur / Lintang [WGS 84]", DATUM ["WGS 84", SPHEROID ["WGS 84", 6378137.0,298.257223563]], PRIMEM ["Greenwich", 0,0], UNIT [ "Desimal

Gelar ", 0,0174532925199433]]

Konfigurasi Lapisan ..: DEFAULTS

George Silva
sumber
Jadi Anda perlu membuat file layer?
DEWright
Tidak, saya perlu membuat tampilan di dalam geodatabase, yang bertindak seperti sebuah featureeclass.
George Silva
Maka Anda perlu membuat tampilan spasial seperti yang Anda katakan dan saya sebutkan di bawah ini; Satu-satunya alasan saya bisa melihatnya tidak muncul sebagai lapisan Spasial adalah lakukan untuk izin. Baik ArcGIS / ArcSDE tidak mendaftarkannya dengan benar; karena itu hanyalah tujuan dari lapisan spasial, untuk bergabung dengan data spasial dan tabular secara seragam.
DEWright
Ketika Anda menjalankan the description_long seperti 'sdetable -o description_long -t victoria -u sasha -p polar.bear -i esri_40' pada pandangan Anda, hasil apa yang Anda dapatkan? Kita perlu melihat apakah kolom spasial dan tipe entitas diatur dan dirujuk dengan benar.
DEWright
1
DE terima kasih atas peringatannya. Saya sudah melakukan semuanya dengan benar, tetapi tetap tidak berhasil. :( sangat menyebalkan. Ini bisa dilakukan dengan setumpuk OpenSource dengan mudah .
George Silva

Jawaban:

4

Saya punya ini (dan masalah serupa) di masa lalu. Itu selalu bermuara pada dua hal:

  1. Tabel spasial memiliki beberapa geometri yang rusak / tidak valid. Masalah dengan ArcMap adalah begitu menemukan geometri yang tidak valid, ia akan berhenti render.

  2. Registrasi layer tidak benar. Apa yang saya juga temukan adalah bahwa sdelayer -o register tidak selalu berfungsi dengan benar dan Anda harus 'memijat' entri pendaftaran.

Jadi untuk memeriksa apakah layer tersebut benar, gunakan PERTAMA fungsi SDO_GEOM.VALIDATE_LAYER_WITH_CONTEXT . Kemudian gunakan fungsi validasi ArcSDE sdelayer -o feature_info -r tidak valid ... untuk mendapatkan fitur yang tidak valid sesuai dengan ArcSDE. Mungkin bersama dengan sdelayer -o daftar (lihat di sini )

Untuk memeriksa pendaftaran, Anda harus kembali ke skema ArcSDE. Tabel yang mengontrol pendaftaran adalah: SDE.LAYERS, SDE.TABLE_REGISTRY, SDE.COLUMN_REGISTRY, SDE.SPATIAL_REFERENCES dan SDE.GEOMETRY_COLUMNS. Salah satu trik yang saya gunakan adalah bahwa saya biasanya memiliki lapisan 'basis' yang serupa (sejauh menyangkut jenis geometri dan kolom kunci utama) yang ditampilkan di ArcMap. Saya kemudian membandingkan catatan registrasi, antara layer yang menampilkan dan kemudian yang tidak. Anda akan kagum menemukan perbedaan yang dihasilkan oleh perubahan 1 pada kolom bilangan bulat! :-)

Kiat pada COLUMN_REGISTRY - yang harus Anda lakukan adalah memastikan bahwa kolom kunci Utama (apa yang didefinisikan sebagai ROWID_COLUMN di SDE.TABLE_REGISTRY) dan Kolom Spasial sudah benar (atau sama dengan lapisan yang menampilkan). Abaikan semua kolom lainnya. Jika Anda menambahkan lapisan dalam ArcMap yang masuk sebagai pemilik tabel entri yang hilang di tabel COLUMN_REGISTRY akan ditambahkan secara otomatis.

Beri tahu saya jika ini membantu!

mapoholic
sumber
terima kasih mafolik untuk masukannya! Saya akan coba besok pagi! Saya harap kamu benar! Terima kasih!
George Silva
jawab mapoholic. Ini berfungsi untuk berbagai jenis pendaftaran, tetapi tidak untuk UNIONED. Namun demikian, ini adalah tip yang luar biasa. Terima kasih atas jawabannya.
George Silva
6

Apa yang Anda cari adalah Spatial-View , sekarang satu-satunya masalah besar yang akan Anda lihat di sini adalah Anda harus berhati-hati dengan bidang yang Anda ikuti. Ini adalah proses yang cukup bagus, saya menggunakannya di semua tempat di mana saya menggeneralisasikan DB saya untuk berbicara dengan data spasial yang tipis.

    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

Ini akan membuat Anda mendapatkan apa yang Anda inginkan. Kuncinya adalah membuat bidang Anda dipetakan dengan benar. Saya cenderung hanya melakukan tampilan dengan minimum yang saya butuhkan, kemudian menggunakan UI untuk mengedit tampilan yang terdaftar di SDE untuk melakukan tweak yang lebih baik.

Benar
sumber
Halo DE Saya sudah mencoba metode ini tetapi tidak berhasil. Yang saya mengerti adalah bahwa ArcSDE menciptakan perintah "CREATE FORCE VIEW", yang menyatakan kolom sebelumnya dan hanya mendaftarkan kolom yang Anda nyatakan dalam klausa. Saya sudah mencoba membuat tampilan kosong (hanya menggunakan kelas fitur, untuk mendapatkan definisi geometris) dan menggantinya dengan definisi lain. Ok, saya bisa menanyakan ini melalui ArcMap, tetapi geometri TIDAK ditampilkan di peta.
George Silva
1
Jika Anda menyeret tampilan spasial dari ArcCatalog ke ArcMap, itu tidak muncul dengan data geometris?
Britt Wescott
Seperti yang dinyatakan sebelumnya, layer tidak ditampilkan dalam ArcMap atau preview ArcCatalog, tetapi terdaftar sebagai layer dengan tipe geometri yang benar dan dapat ditanyakan dalam ArcMap.
George Silva
1
Ketika Anda menjalankan the description_long seperti 'sdetable -o description_long -t victoria -u sasha -p polar.bear -i esri_40' pada pandangan Anda, hasil apa yang Anda dapatkan? Kita perlu melihat apakah kolom spasial dan tipe entitas diatur dan dirujuk dengan benar.
DEWright
Saya akan memposting hasilnya di sini!
George Silva
3

Satu hal yang saya lihat hilang adalah kolom integer unik yang ArcObjects dapat digunakan untuk ID objek. Coba buat satu urutan yang akan mempertahankan nilai unik untuk kolom id ini. Kemudian buat pemicu sisipkan pada setiap tabel untuk mengisi kolom id dengan urutan.nextval.

Dalam perintah sdelayer -o register, pastikan untuk mengatur flag -C ke kolom id integer Anda dengan kata kunci USER sehingga esri tidak mencoba mengelola kolom untuk Anda.

jrockers
sumber
1
Halo jrockers, proses registrasi berjalan dengan baik. baca jawaban saya sendiri di utas. Saya menggunakan kolom yang dihasilkan Oracle (ROWNUM) yang dicantumkan sebagai angka (38,0). Terima kasih atas tipnya, tetapi saya sudah mencobanya.
George Silva
3

Saya telah memilah-milah balasan dan sepertinya tidak ada yang mengamati bahwa permintaan serikat pekerja adalah sedikit masalah untuk tampilan spasial dengan ArcGIS. ini karena Anda hampir pasti akan berakhir dengan duplikat objectid. Hal yang sama berlaku untuk kueri gabung dalam di mana predikat gabung tidak menjamin catatan "induk" yang unik. dalam kedua kasus tersebut meskipun tampilan dapat memenuhi semua persyaratan pendaftaran, tampilan tersebut tidak akan berlaku dengan benar

Rob McPherson
sumber
Terima kasih atas masukan Rob. Jika Anda melihat dari dekat pada tampilan yang saya tulis, ini menghasilkan OID dengan cepat menggunakan Oracles ROWNUM. Mereka dijamin unik.
George Silva
1
Saya tidak 100% yakin tentang penggunaan rownum jika data sedang ditampilkan di arcmap (misalnya). Rownum adalah fungsi dari set kueri oracle. jadi setiap kali Anda mengeksekusi kueri Anda mendapatkan set rownum baru mulai dari 1. Ini dapat berarti bahwa setiap pan / zoom dll akan menghasilkan objectid dari 1 dan setiap proses yang mengharapkan untuk menggunakan objectid cache akan gagal karena query selanjutnya akan menghasilkan yang baru hasil. Sudahkah Anda melihat membuat alat tabel kueri sebagai opsi untuk mendapatkan ArcGIS untuk menambahkan kolom objectid untuk Anda?
Rob McPherson
2

Terima kasih untuk semua yang melihat utas ini.

Yah prosesnya agak rumit, tetapi dimungkinkan untuk mendaftarkan query yang kompleks sebagai layer, hanya perlu beberapa pemikiran licik. Saya tidak yakin apa implikasinya pada kinerja pada ini, tapi saya akan mencoba untuk menjaga ini diperbarui. Saya juga memiliki masalah untuk melihat poin di ArcMap, tetapi saya akan menyelidiki lebih lanjut.

Pertama-tama, buat tampilan spasial yang kompleks di RDBMS Anda. Pastikan Anda memiliki kolom INTEGER UNIK BUKAN NULL dalam tampilan, yang dapat digunakan nanti untuk pendaftaran dengan ArcSDE.

Kueri saya hanya sekelompok UNION ALL, mirip dengan ini:

    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

Dalam skema ini, semua objek saya miliki sebagai PK ID_UNIQUE_ID, yang merupakan GUID. ObjectIDs saya berulang di seluruh kelas fitur, jadi, bukan pilihan yang baik untuk ObjectID pengganti kami.

Saya menggunakan (dalam kasus saya) kolom virtual rownum Oracle untuk membungkus semua pertanyaan saya dan membuat tampilan yang memiliki "objectID" yang efektif. Lihatlah:

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
)

Saya membuat tampilan dengan kueri di atas, dan membuat tampilan di atasnya. Pandangan ini akan menjadi lapisan spasial di dalam arcsde. Ini adalah proses yang cukup mudah.

Setelah itu, saya sudah mencoba dan mencoba mendaftarkan tampilan spasial saya sebagai layer, tetapi selalu gagal. Ketika Anda membuat tampilan di atasnya, ArcSDE mengasumsikan bahwa FID adalah NUMBER (38,10), angka floating point, menurut sdetable -o menggambarkan program utilitas.

Di Oracle, ini adalah definisi untuk tampilan:

  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;

Setelah saya mengganti kolom fid dengan gips, semuanya bekerja dengan baik. Saya melanjutkan pendaftaran lapisan dan itu berjalan dengan baik.

EDIT

Lapisan ditampilkan di ArcCatalog sebagai lapisan titik dan saya bisa melihat dan memilih tabel di ArcMap seperti biasa (titik-titik itu bahkan disorot), tetapi saya tidak dapat menyimbolkannya dan melihatnya sebagai lapisan biasa. Adakah itu?

Adakah yang tahu mengapa ini terjadi? Semuanya baik-baik saja, kecuali bahwa saya tidak dapat melihat objek spasial di dalam ArcMap. Ada ide?

George Silva
sumber
1
Anda dapat melakukan banyak hal dengan kinerja tampilan itu jika Anda menjaga indeks Anda tetap mutakhir, saya telah menetapkan pekerjaan yang dijadwalkan untuk berjalan pada sistem dengan jumlah transaksi yang tinggi untuk menjaga indeks dibangun kembali setiap malam. Kemudian ketika Anda melakukan join Anda, mereka lebih baik disetel.
DEWright
Apa yang terjadi jika Anda seret dan lepas dari arccatalog ke peta kosong baru di arcmap?
Kirk Kuykendall
ArcMap menambahkannya ke TOC, tetapi tidak menghasilkan apa-apa. Yang aneh adalah bahwa saya dapat memilih baris, dan geometri dari baris itu akan menggambar (dipilih). Ketika baris tidak dipilih, tidak ada yang ditarik. Permintaan melalui ArcMap juga berfungsi.
George Silva
1
Menarik. Jika Anda menulis kode arcobject seperti apa IGeoDataset.Extent terlihat untuk fiturelayer? Dan untuk kelas fitur?
Kirk Kuykendall
Saya akan mencobanya! Ayo lihat.
George Silva
2

Silakan coba jalankan perintah berikut: sdelayer -o alter -l [-S] [-k] [-i | | ] [-s] [-D] -E calc -u [-p]

Priya J
sumber
Terima kasih atas komentarnya. Sudah mencoba menghitung ulang sejauh mana layer.
George Silva
2

Dalam pengalaman saya, ketika sebuah layer tidak ditampilkan di Arc, itu karena indeks spasial hilang. Tampilan menggunakan indeks spasial dari tabel sumber, tetapi sepertinya Anda membuat indeks spasial untuk tampilan dalam pernyataan pendaftaran Anda.

Apakah salah satu dari tabel sumber memiliki indeks spasial? Jika tidak, coba buat di Oracle dan daftarkan ulang tampilan tanpa -g.

Kemungkinan lain adalah Anda menggabungkan geometri dari dua tabel menjadi satu kolom, tidak yakin apakah itu tidak-tidak, belum pernah mencobanya sebelumnya.

MattL
sumber
Saya akan mencobanya Matt. Saya juga menggabungkan beberapa geometri menjadi satu di tampilan lain dan ini sangat penting agar ini berfungsi. Kami sedang membangun linestrings pada pandangan dan bahwa pandangan yang bersatu seharusnya menjadi satu-satunya titik dukungan untuk lapisan tersebut. Saya mencoba pendekatan lain, karena saya tidak melihat ini terjadi.
George Silva