Ich erstelle einfache Ansichten für einen ArcSDE Oracle RAC 10g. Meine SHAPE-Spalten sind vom Datentyp SDO_GEOMETRY. ArcSDE 9.3.1.
Ich habe mehrere Punktetabellen mit folgender Gliederung:
ID (Guid) Name (String) Form (SHAPE)
Ich habe eine einfache Ansicht erstellt, die dies in Oracle zeigt!
CREATE OR REPLACE VIEW VW_POINTS AS
SELECT ID, Name, Shape from TABLE_A
UNION ALL
SELECT ID, Name, Shape from TABLE_B
-- etc
Die Ansicht in Oracle wird einwandfrei erstellt. Ich habe diese Ansicht über die Befehlszeile registriert:
sdetable -o create_view -T PUNKTE -t VW_POINTS -c ID, Name, FORM usw.
Die ArcSDE-Ansicht wird erneut erstellt. Ich kann ArcObjects verwenden, um es abzufragen usw. Ich muss jetzt eine Ebene erstellen. Ich habe die Befehlszeilentools sdelayer -o register ausprobiert, aber ich hatte keinen Erfolg. Es gibt mir eine Nachricht, dass Ansichten nicht unterstützt werden.
Ich muss dies mehrmals tun, manchmal mit komplexer Syntax zum Erstellen der Ansicht.
Worin besteht das Problem? Wie können diese räumlichen Ansichten als SDE-Ebenen dargestellt werden (ich muss sie nicht bearbeiten, sondern nur räumlich in ArcMap anzeigen)?
Danke für die Eingabe!
BEARBEITEN
Dies ist ein Screenshot in ArcMap für Ihre Aufgabe: P.
ArcMap-Screenshot für Ihr Glück :
Wie gewünscht kommt hier die Beschreibung_long
// create_view C: \ Users \ H> sdetable -o create_view -s Server -i Port -u Benutzer -p Pass -T view_airspace_points -t vw_airspace_points_oracle -c "*"
Zu diesem Zeitpunkt habe ich die Ansicht auf Orakel geändert, einschließlich einer Besetzung als numerisch (38,0) vor der Registrierung.
// Ebene C registrieren: \ Users \ H> sdelayer -o Register -l view_airspace_points, Form -C OBJECTID, USER - g RTREE -s Server -i Port -u Benutzer -p Pass -ep -P HIGH
ArcSDE 9.3.1 für Oracle10g Build 2784 Di 27 Okt 10:51:14 2009
Dienstprogramm zur Ebenenverwaltung
Ebenenbeschreibung ....:
Tischbesitzer ..........: SIGMAGIS2
Tabellenname ...........: VIEW_AIRSPACE_POINTS
Raumsäule .......: FORM
Layer Id .............: 1398
SRID .................: 79
Minimale Form-ID .....: 1
Offset ...............:
falsex: -180.000000
Falsey: -90.000000
Systemeinheiten .........: 994200.000000
Z Offset ..............: 0,000000
Z-Einheiten ..............: 1.000000
Offset messen .......:
Maßeinheiten ........:
XY-Clustertoleranz .: 2.0
Raumindex ........:
Parameter: SPIDX_RTREE
existieren: Ja
Array-Form: -2,0,0
Layer Envelope .......:
Minx: -180,00000, Miny: -90,00000
maxx: 180.00000, maxy: 90.00000
Entitäten .............: p
Layertyp ...........: Inline-räumlicher Typ
Erstellungsdatum ........: 28.06.11 09:28:45
E / A-Modus .............: NORMAL
Autolocking ..........: Aktiviert
Präzision .............: Hoch
Benutzerrechte ......: SELECT, UPDATE, INSERT, DELETE
Koordinatensystem ....: GEOGCS ["Längengrad / Breitengrad [WGS 84]", DATUM ["WGS 84", SPHEROID ["WGS 84", 6378137.0,298.257223563]], PRIMEM ["Greenwich", 0.0], UNIT [ "Dezimal
Grad ", 0,0174532925199433]]
Layer-Konfiguration ..: STANDARD
quelle
Antworten:
Ich hatte dies (und ähnliche Probleme) in der Vergangenheit. Es kam immer auf zwei Dinge an:
Die räumliche Tabelle hatte einige beschädigte / ungültige Geometrien. Das Problem mit ArcMap besteht darin, dass das Rendern beendet wird, sobald eine ungültige Geometrie gefunden wird.
Die Ebenenregistrierung ist falsch. Was ich auch gefunden habe ist, dass das sdelayer -o-Register nicht immer richtig funktioniert und Sie die Registrierungseinträge "massieren" müssen.
Um zu überprüfen, ob die Ebene gültig ist, verwenden Sie ZUERST die Funktion SDO_GEOM.VALIDATE_LAYER_WITH_CONTEXT . Verwenden Sie dann die ArcSDE-Validierungsfunktion sdelayer -o feature_info -r invalid ..., um ungültige Features gemäß ArcSDE abzurufen. Wahrscheinlich zusammen mit sdelayer -o Liste (siehe hier )
Um die Registrierung zu überprüfen, müssen Sie zum ArcSDE-Schema zurückkehren. Die Tabellen, die die Registrierung steuern, sind: SDE.LAYERS, SDE.TABLE_REGISTRY, SDE.COLUMN_REGISTRY, SDE.SPATIAL_REFERENCES und SDE.GEOMETRY_COLUMNS. Ein Trick, den ich benutze, ist, dass ich normalerweise eine Basis-Ebene habe, die ähnlich ist (was Geometrietypen und Primärschlüsselspalten betrifft), die in ArcMap ANZEIGEN. Ich vergleiche dann die Registrierungsdatensätze zwischen der angezeigten Ebene und einer, die dies nicht tut. Sie werden erstaunt sein, welchen Unterschied eine Änderung um 1 in einer ganzzahligen Spalte macht! :-)
Ein Tipp zu COLUMN_REGISTRY: Sie müssen lediglich sicherstellen, dass die Primärschlüsselspalte (in der Datei SDE.TABLE_REGISTRY als ROWID_COLUMN definiert) und die räumliche Spalte korrekt sind (oder mit der angezeigten Ebene identisch sind). Ignorieren Sie alle anderen Spalten. Wenn Sie den Layer in ArcMap hinzufügen, der als Tabellenbesitzer angemeldet ist, werden die fehlenden Einträge in der Tabelle COLUMN_REGISTRY automatisch hinzugefügt.
Lassen Sie mich wissen, ob das hilft!
quelle
Was Sie suchen, ist eine räumliche Ansicht . Das einzige große Problem, das Sie hier sehen, ist, dass Sie mit den Feldern, denen Sie beitreten, vorsichtig sein müssen. Dies ist ein ziemlich netter Prozess. Ich verwende ihn überall dort, wo ich meine Datenbank verallgemeinert habe, um mit dünnen räumlichen Daten zu sprechen.
Dies sollte Sie auf dem besten Weg zu dem bringen, was Sie wollen. Der Schlüssel ist, dass Ihre Felder korrekt zugeordnet werden. Ich neige dazu, die Ansicht nur mit dem Minimum zu erstellen, das ich benötige, und dann eine Benutzeroberfläche zu verwenden, um diese Ansicht zu bearbeiten, sobald sie in SDE registriert ist, um meine feinkörnigeren Optimierungen vorzunehmen.
quelle
Eine Sache, die mir fehlt, ist eine eindeutige Ganzzahlspalte, die ArcObjects für die Objekt-ID verwenden kann. Versuchen Sie, eine einzelne Sequenz zu erstellen, die eindeutige Werte für diese ID-Spalte beibehält. Erstellen Sie dann Einfügetrigger für jede der Tabellen, um die ID-Spalte mit der sequence.nextval zu füllen.
Stellen Sie in Ihrem Befehl sdelayer -o register sicher, dass das Flag -C auf Ihre Ganzzahl-ID-Spalte mit dem Schlüsselwort USER gesetzt ist, damit esri nicht versucht, die Spalte für Sie zu verwalten.
quelle
Ich habe die Antworten irgendwie gescannt, und niemand scheint bemerkt zu haben, dass Vereinigungsabfragen für räumliche Ansichten mit ArcGIS ein Problem darstellen. Dies liegt daran, dass Sie mit ziemlicher Sicherheit doppelte Objekt-IDs haben werden. Gleiches gilt für Abfragen für innere Verknüpfungen, bei denen die Verknüpfungsprädikate keinen eindeutigen "übergeordneten" Datensatz garantieren. In beiden Fällen verhält sich die Ansicht zwar nicht allen Registrierungsanforderungen, verhält sich jedoch nicht korrekt
quelle
Vielen Dank an alle, die diesen Thread gesehen haben.
Nun, der Prozess ist etwas kompliziert, aber es ist möglich, eine komplexe Abfrage als Ebene zu registrieren. Es sind nur einige schlauen Gedanken erforderlich. Ich bin mir noch nicht sicher, welche Auswirkungen dies auf die Leistung hat, aber ich werde versuchen, dies auf dem neuesten Stand zu halten. Ich habe auch Probleme beim Anzeigen der Punkte in ArcMap, werde aber weitere Untersuchungen durchführen.
Erstellen Sie zunächst eine komplexe räumliche Ansicht in Ihrem RDBMS. Stellen Sie nur sicher, dass die Ansicht eine Spalte INTEGER UNIQUE NOT NULL enthält, die später für die Registrierung bei ArcSDE verwendet werden kann.
Meine Anfragen waren nur ein Haufen UNION ALL, ähnlich wie folgt:
In diesem Schema haben alle meine Objekte die PK ID_UNIQUE_ID, eine GUID. Meine ObjectIDs wiederholten sich in allen Feature-Classes, daher keine gute Wahl für unsere Ersatz-ObjectID.
Ich habe (in meinem Fall) die virtuelle Rownum-Spalte von Oracle verwendet, um alle meine Abfragen zu verpacken und eine Ansicht mit einer effektiven "Objekt-ID" zu erstellen. Schau mal:
Ich habe die Ansicht mit der obigen Abfrage erstellt und eine Ansicht darüber erstellt. Diese Ansicht wird zur räumlichen Ebene innerhalb von arcsde. Dies ist ein ziemlich einfacher Prozess.
Danach habe ich versucht, meine räumliche Ansicht als Ebene zu registrieren, bin aber immer gescheitert. Wenn Sie eine Ansicht darüber erstellen, geht ArcSDE davon aus, dass FID eine NUMMER (38,10) ist, eine Gleitkommazahl gemäß dem Dienstprogramm sdetable -o description.
In Oracle war dies die Definition für die Ansicht:
Nachdem ich die FID-Spalte durch eine Besetzung ersetzt habe, hat alles gut funktioniert. Ich ging zur Registrierung der Schicht über und es ging gut.
BEARBEITEN
Die Ebene wird in ArcCatalog als Punktebene angezeigt, und ich kann die Tabelle in ArcMap wie gewohnt anzeigen und auswählen (die Punkte werden sogar hervorgehoben), aber ich kann sie nicht simbolisieren und als reguläre Ebene anzeigen. Irgendwelche Gedanken?
Hat jemand eine Idee warum das passiert? Alles ist in Ordnung, außer dass ich die räumlichen Objekte in ArcMap nicht sehen kann. Irgendwelche Ideen?
quelle
Bitte versuchen Sie folgenden Befehl auszuführen: sdelayer -o alter -l [-S] [-k] [-i | | ] [-s] [-D] -E calc -u [-p]
quelle
Wenn eine Ebene in Arc nicht angezeigt wird, fehlt meiner Erfahrung nach der räumliche Index. Ansichten verwenden den räumlichen Index der Quelltabelle, aber es sieht so aus, als würden Sie einen räumlichen Index für die Ansicht in Ihrer Registrierungsanweisung erstellen.
Verfügt eine der Quelltabellen über räumliche Indizes? Wenn nicht, erstellen Sie sie in Oracle und registrieren Sie die Ansicht ohne das -g erneut.
Eine andere Möglichkeit besteht darin, dass Sie Geometrie aus zwei Tabellen in einer einzigen Spalte kombinieren. Sie sind sich nicht sicher, ob dies ein Nein-Nein ist. Sie haben es noch nicht versucht.
quelle