Registrieren Sie die SDE-Ansicht und die Ebene

11

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

George Silva
quelle
Sie müssen also eine Layer-Datei erstellen?
DEWright
Nein, ich muss eine Ansicht in der Geodatabase erstellen, die sich wie eine Feature-Class verhält.
George Silva
Dann müssen Sie die räumliche Ansicht erstellen, wie Sie sagen, und ich erwähne unten; Der einzige Grund, warum ich sehe, dass es nicht als räumliche Ebene angezeigt wird, sind Berechtigungen. Entweder hat ArcGIS / ArcSDE es nicht richtig registriert. da dies nur der Zweck einer räumlichen Ebene ist, räumliche und tabellarische Daten auf einheitliche Weise zu verbinden.
DEWright
Welche Ergebnisse erhalten Sie, wenn Sie die Beschreibung_long wie 'sdetable -o description_long -t victoria -u sasha -p polar.bear -i esri_40' in Ihrer Ansicht ausführen? Wir müssen sehen, ob die räumliche Spalte und der Entitätstyp richtig festgelegt und referenziert werden.
DEWright
1
DE danke für die Warnung. Ich habe alles richtig gemacht, funktioniert aber immer noch nicht. :( sehr frustierend. Dies kann mit einem OpenSource-Stack ziemlich einfach gemacht werden .
George Silva

Antworten:

4

Ich hatte dies (und ähnliche Probleme) in der Vergangenheit. Es kam immer auf zwei Dinge an:

  1. 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.

  2. 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!

mapoholic
quelle
mapholic danke für die Eingabe! Ich werde es morgen als erstes versuchen! Ich hoffe, Sie haben Recht! Vielen Dank!
George Silva
antwortete mapoholic. Dies funktionierte für verschiedene Arten von Registrierungen, jedoch nicht für UNIONED. Trotzdem ist dies ein erstaunlicher Tipp. Danke für die Antwort.
George Silva
6

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.

    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

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.

DEWright
quelle
Hallo DE Ich habe diese Methode ausprobiert, aber sie funktioniert nicht. Ich verstehe, dass ArcSDE einen Befehl "CREATE FORCE VIEW" erstellt, der die Spalten vorab angibt und nur die Spalten registriert, die Sie in der Klausel deklarieren. Ich habe versucht, eine leere Ansicht zu erstellen (nur eine Feature-Class zu verwenden, um die geometrische Definition zu erhalten) und sie durch eine andere Definition zu ersetzen. Ok, ich kann dies über ArcMap abfragen, aber die Geometrie wird NICHT in der Karte angezeigt.
George Silva
1
Wenn Sie die räumliche Ansicht von ArcCatalog nach ArcMap ziehen, wird sie nicht mit geometrischen Daten angezeigt.
Britt Wescott
Wie bereits erwähnt, wird der Layer nicht in der ArcMap- oder ArcCatalog-Vorschau angezeigt, sondern als Layer mit dem richtigen Geometrietyp aufgeführt und in ArcMap abfragbar.
George Silva
1
Welche Ergebnisse erhalten Sie, wenn Sie die Beschreibung_long wie 'sdetable -o description_long -t victoria -u sasha -p polar.bear -i esri_40' in Ihrer Ansicht ausführen? Wir müssen sehen, ob die räumliche Spalte und der Entitätstyp richtig festgelegt und referenziert werden.
DEWright
Ich werde die Ergebnisse hier veröffentlichen!
George Silva
3

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.

Jrockers
quelle
1
Hallo Jrockers, der Registrierungsprozess funktioniert einwandfrei. Lies meine eigene Antwort auf den Thread. Ich verwende eine von Oracle generierte Spalte (ROWNUM), die als numerisch (38,0) umgewandelt wurde. Danke für den Tipp, aber das habe ich schon versucht.
George Silva
3

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

Rob McPherson
quelle
Danke für die Eingabe Rob. Wenn Sie sich die von mir geschriebene Ansicht genauer ansehen, werden mithilfe von Oracles ROWNUM spontan OIDs generiert. Sie sind garantiert einzigartig.
George Silva
1
Ich bin nicht zu 100% von der Rownum-Nutzung überzeugt, wenn die Daten (zum Beispiel) in arcmap angezeigt werden. Rownum ist eine Funktion des Oracle-Abfragesatzes. Jedes Mal, wenn Sie eine Abfrage ausführen, erhalten Sie ab 1 einen neuen Satz von Rownums. Dies kann bedeuten, dass jedes Schwenken / Zoomen usw. eine Objekt-ID von 1 erzeugt und jeder Prozess, der die Verwendung von zwischengespeicherten Objekt-IDs erwartet, fehlschlägt, da nachfolgende Abfragen eine neue erzeugen Ergebnis. Haben Sie sich das Tool zum Abfragen von Tabellen als Option angesehen, damit ArcGIS die Objekt-ID-Spalte für Sie hinzufügt?
Rob McPherson
2

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:

    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

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:

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
)

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:

  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;

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?

George Silva
quelle
1
Sie können viel mit Ihrer Leistung dieser Ansicht anfangen, wenn Sie Ihre Indizes auf dem neuesten Stand halten. Ich habe geplante Jobs so festgelegt, dass sie auf Systemen mit einer hohen Anzahl von Transaktionen ausgeführt werden, damit die Indizes jede Nacht neu erstellt werden. Wenn Sie dann Ihre Joins machen, sind sie besser abgestimmt.
DEWright
Was passiert, wenn Sie aus dem Arccatalog in eine neue leere Karte in arcmap ziehen und dort ablegen?
Kirk Kuykendall
ArcMap fügt es dem Inhaltsverzeichnis hinzu, rendert jedoch nichts. Das Seltsame ist, dass ich die Zeilen auswählen kann und die Geometrie dieser Zeile gezeichnet (ausgewählt) wird. Wenn keine Zeilen ausgewählt sind, wird nichts gezeichnet. Das Abfragen über ArcMap funktioniert ebenfalls.
George Silva
1
Interessant. Wenn Sie Arcobjects-Code schreiben, wie sieht IGeoDataset.Extent für den Featurelayer aus? Und für die Feature-Class?
Kirk Kuykendall
Ich werde das versuchen! Mal sehen.
George Silva
2

Bitte versuchen Sie folgenden Befehl auszuführen: sdelayer -o alter -l [-S] [-k] [-i | | ] [-s] [-D] -E calc -u [-p]

Priya J.
quelle
Danke für den Kommentar. Es wurde bereits versucht, die Ausdehnung der Schicht neu zu berechnen.
George Silva
2

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.

MattL
quelle
Ich werde das versuchen, Matt. Ich kombiniere auch mehrere Geometrien in einer anderen Ansicht und es ist irgendwie entscheidend, dass dies funktioniert. Wir bauen Linestrings auf einer Ansicht und diese vereinte Ansicht sollte der einzige Stützpunkt für diese Ebenen sein. Ich versuche andere Ansätze, da ich dies nicht sehe.
George Silva