Zarejestruj widok SDE i warstwę

11

Buduję proste widoki na ArcSDE Oracle RAC 10g. Moje kolumny SHAPE są typu danych SDO_GEOMETRY. ArcSDE 9.3.1.

Mam kilka tabel punktów z następującym szkicem:

ID (Guid) Nazwa (ciąg) Kształt (KSZTAŁT)

Zbudowałem prosty widok, zobacz to w 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

Widok w Oracle jest stworzony dobrze. Zarejestrowałem ten widok w wierszu poleceń:

sdetable -o create_view -T PUNKTY -t VW_POINTS -c Identyfikator, nazwa, KSZTAŁT itp

Widok ArcSDE jest tworzony ponownie, w porządku. Mogę użyć ArcObjects do zapytania, itp. Potrzebuję teraz, aby utworzyć warstwę. Wypróbowałem narzędzia wiersza poleceń, sdelayer -o register, ale nie miałem sukcesu. Daje mi wiadomość, że poglądy nie są obsługiwane.

Będę musiał to zrobić kilka razy, czasem używając złożonej składni do budowania widoku.

Jaki jest problem? Jak wizualizować te widoki przestrzenne jako warstwy SDE (Nie muszę ich edytować, po prostu wyświetlaj je przestrzennie wewnątrz ArcMap)

Dzięki za wkład!

EDYTOWAĆ

To jest zrzut ekranu w ArcMap, dla twojej uwagi: P

Zrzut ekranu ArcMap dla twojego szczęścia :

Zgodnie z życzeniem, oto opis_longa

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

w tym momencie przed rejestracją zmieniłem widok na wyrocznię, w tym obsadę liczbową (38,0).

// rejestruj warstwę C: \ Users \ H> sdelayer -o register -l view_airspace_points, shape -C OBJECTID, USER - g RTREE -s serwer -i port -u użytkownik -p pass -ep -P HIGH

ArcSDE 9.3.1 dla Oracle10g Build 2784 Wt 27 października 10:51:14 2009

Narzędzie do administrowania warstwami

Opis warstwy ....:

Właściciel stołu ..........: SIGMAGIS2

Nazwa tabeli ...........: VIEW_AIRSPACE_POINTS

Kolumna przestrzenna .......: KSZTAŁT

Identyfikator warstwy .............: 1398

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

Minimalny identyfikator kształtu .....: 1

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

falsex: -180,000000

falsey: -90.000000

Jednostki systemowe .........: 994200.000000

Z Przesunięcie ..............: 0,000000

Jednostki Z ..............: 1,000000

Zmierz przesunięcie .......:

Jednostki miary ........:

XY Tolerancja klastra: 2,0

Indeks przestrzenny ........:

parametr: SPIDX_RTREE

istnieje: Tak

forma tablicy: -2,0,0

Koperta warstwowa .......:

minx: -180,00000, miny: -90,00000

maxx: 180,00000, maxy: 90,00000

Podmioty .............: p

Typ warstwy ...........: In-Line Spatial Type

Data utworzenia ........: 06/28/11 09:28:45

Tryb I / O .............: NORMAL

Automatyczne blokowanie .......: Włączone

Precyzja .............: Wysoka

Uprawnienia użytkownika ......: WYBIERZ, AKTUALIZUJ, WSTAW, USUŃ

Układ współrzędnych ....: GEOGCS [„Długość / szerokość geograficzna [WGS 84]”, DATUM [„WGS 84”, SPHEROID [„WGS 84”, 6378137.0,298.257223563]], PRIMEM [„Greenwich”, 0,0], UNIT [ "Dziesiętny

Stopień ”, 0,0174532925199433]]

Konfiguracja warstwy ..: DOMYŚLNE

George Silva
źródło
Więc musisz utworzyć plik warstwy?
DEWright
Nie, muszę utworzyć widok w geobazie, który działa jak klasa obiektów.
George Silva,
Następnie musisz stworzyć widok przestrzenny, jak mówisz, a ja wspominam poniżej; Jedyny powód, dla którego widzę, że nie wyświetla się jako warstwa przestrzenna, dotyczy uprawnień. Albo ArcGIS / ArcSDE nie zarejestrował go poprawnie; ponieważ taki jest właśnie cel warstwy przestrzennej, aby połączyć dane przestrzenne i tabelaryczne w jednolity sposób.
DEWright
Kiedy uruchomisz w widoku replace_long jak 'sdetable -o replace_long -t victoria -u sasha -p polar.bear -i esri_40', jakie wyniki uzyskasz? Musimy sprawdzić, czy kolumna przestrzenna i typ encji są ustawiane i odwoływane do nich poprawnie.
DEWright
1
DE dziękuję za alert. Zrobiłem wszystko poprawnie, ale nadal nie działa. :( bardzo frustrujące. Można to zrobić dość łatwo dzięki stosowi OpenSource .
George Silva

Odpowiedzi:

4

Miałem to (i podobne problemy) w przeszłości. Zawsze sprowadzało się do dwóch rzeczy:

  1. Tabela przestrzenna miała pewne uszkodzone / nieprawidłowe geometrie. Problem z ArcMap polega na tym, że gdy tylko znajdzie nieprawidłową geometrię, przestanie renderować.

  2. Rejestracja warstwy jest nieprawidłowa. Odkryłem również, że rejestr sdelayer -o nie zawsze działa poprawnie i trzeba „masować” wpisy rejestracyjne.

Aby sprawdzić, czy warstwa jest poprawna, użyj PIERWSZEJ funkcji SDO_GEOM.VALIDATE_LAYER_WITH_CONTEXT . Następnie użyj funkcji sprawdzania poprawności ArcSDE sdelayer -o feature_info -r invalid ... aby uzyskać nieprawidłowe funkcje zgodnie z ArcSDE. Prawdopodobnie wraz z listą sdelayer -o (patrz tutaj )

Aby sprawdzić rejestrację, musisz wrócić do schematu ArcSDE. Tabele sterujące rejestracją to: SDE.LAYERS, SDE.TABLE_REGISTRY, SDE.COLUMN_REGISTRY, SDE.SPATIAL_REFERENCES i SDE.GEOMETRY_COLUMNS. Jedną sztuczką, której używam, jest to, że zwykle mam warstwę „podstawową”, która jest podobna (pod względem typów geometrii i kolumn klucza podstawowego), WYŚWIETLANA w ArcMap. Następnie porównuję rekordy rejestracyjne, pomiędzy warstwą, która się wyświetla, a drugą warstwą, która się nie wyświetla. Zdziwisz się, gdy zobaczysz, jaką różnicę robi zmiana o 1 w kolumnie liczb całkowitych! :-)

Wskazówka na temat COLUMN_REGISTRY - wszystko, co musisz zrobić, to upewnić się, że kolumna Klucz podstawowy (co jest zdefiniowane jako ROWID_COLUMN w SDE.TABLE_REGISTRY) i kolumna przestrzenna są prawidłowe (lub takie same jak wyświetlana warstwa). Zignoruj ​​wszystkie inne kolumny. Jeśli dodasz warstwę w ArcMap zalogowanym jako właściciel tabeli, brakujące wpisy w tabeli COLUMN_REGISTRY zostaną dodane automatycznie.

Daj mi znać, jeśli to pomoże!

mapoholic
źródło
mapholic dzięki za wkład! Spróbuję jutro pierwszej rzeczy! Mam nadzieję, że masz rację! Dzięki!
George Silva,
odpowiedział mapoholic. Działało to dla różnych rodzajów rejestracji, ale nie dla UNIONED. Niemniej jednak jest to niesamowita wskazówka. Dziękuję za odpowiedź.
George Silva,
6

To, czego szukasz, to widok przestrzenny , teraz jedynym poważnym problemem, jaki tu zobaczysz, jest to, że musisz uważać na pola, do których się przyłączasz. Jest to całkiem niezły proces, używam go wszędzie tam, gdzie uogólniłem moją bazę danych, aby rozmawiać z cienkimi danymi przestrzennymi.

    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

To powinno zapewnić ci dobrą drogę do tego, czego chcesz. Kluczem jest poprawne zmapowanie pól. Zwykle robię widok z minimalną potrzebą, a następnie używam interfejsu użytkownika do edycji tego widoku po zarejestrowaniu w SDE, aby wykonać moje drobniejsze poprawki.

DEWright
źródło
Cześć DE Próbowałem tej metody, ale nie działa. Rozumiem, że ArcSDE tworzy polecenie „UTWÓRZ SIŁĘ WIDOKU”, podając kolumny wcześniej i rejestrując tylko te kolumny, które zadeklarujesz w klauzuli. Próbowałem utworzyć pusty widok (używając tylko klasy elementów, aby uzyskać geometryczną definicję) i zastąpić ją inną definicją. Ok, mogę zapytać o to za pomocą ArcMap, ale geometria NIE jest pokazana na mapie.
George Silva
1
Jeśli przeciągniesz widok przestrzenny z ArcCatalog do ArcMap, nie pojawi się on z danymi geometrycznymi?
Britt Wescott
Jak wspomniano wcześniej, warstwa nie jest wyświetlana w podglądzie ArcMap ani ArcCatalog, ale jest wymieniona jako warstwa o poprawnym typie geometrii i jest dostępna w ArcMap.
George Silva
1
Kiedy uruchomisz w widoku replace_long jak 'sdetable -o replace_long -t victoria -u sasha -p polar.bear -i esri_40', jakie wyniki uzyskasz? Musimy sprawdzić, czy kolumna przestrzenna i typ encji są ustawiane i odwoływane do nich poprawnie.
DEWright
Zamieszczę wyniki tutaj!
George Silva,
3

Brakuje mi jedynej kolumny liczb całkowitych, której ArcObjects może użyć dla identyfikatora obiektu. Spróbuj utworzyć pojedynczą sekwencję, która zachowa unikalne wartości dla tej kolumny identyfikatora. Następnie utwórz wyzwalacze wstawiania w każdej z tabel, aby wypełnić kolumnę id sekwencją.nextval.

W poleceniu sdelayer -o register ustaw flagę -C w kolumnie z liczbą całkowitą ze słowem kluczowym USER, aby esri nie próbował za Ciebie zarządzać kolumną.

jrockers
źródło
1
Cześć jrockers, proces rejestracji po prostu działa dobrze. przeczytaj własną odpowiedź na wątek. Korzystam z kolumny wygenerowanej przez Oracle (ROWNUM) rzutowanej numerycznie (38,0). Dzięki za wskazówkę, ale już tego próbowałem.
George Silva,
3

W pewnym sensie zeskanowałem odpowiedzi i wydaje się, że nikt nie zauważył, że zapytania dotyczące unii stanowią pewien problem dla widoków przestrzennych z ArcGIS. dzieje się tak, ponieważ prawie na pewno skończysz ze zduplikowanymi obiektami. To samo dotyczy zapytań o połączenie wewnętrzne, w których predykaty łączenia nie gwarantują unikalnego rekordu „macierzystego”. w obu przypadkach widok może być zgodny ze wszystkimi wymogami rejestracyjnymi, ale nie będzie działał poprawnie

Rob McPherson
źródło
Dzięki za wkład Rob. Jeśli przyjrzysz się uważnie widokowi, który napisałem, generuje on OIDy w locie za pomocą Oracles ROWNUM. Gwarantujemy, że będą wyjątkowe.
George Silva,
1
Nie jestem w 100% przekonany o użyciu rownum, jeśli dane są wyświetlane w arcmap (na przykład). Rownum jest funkcją zestawu zapytań Oracle. więc za każdym razem, gdy wykonujesz zapytanie, otrzymujesz nowy zestaw rownów, zaczynając od 1. Może to oznaczać, że każde panoramowanie / powiększenie itp. wygeneruje objectid o wartości 1, a każdy proces oczekujący użycia buforowanych obiektów zostanie zakończony niepowodzeniem, ponieważ kolejne zapytania spowodują utworzenie nowego wynik. Czy widziałeś narzędzie do tworzenia tabeli zapytań jako opcję, aby ArcGIS dodał dla Ciebie kolumnę objectid?
Rob McPherson,
2

Dzięki wszystkim, którzy oglądali ten wątek.

Cóż, proces ten jest nieco skomplikowany, ale możliwe jest zarejestrowanie złożonego zapytania jako warstwy, wystarczy trochę sprytnej myśli. Nie jestem jeszcze pewien, jakie są tego konsekwencje dla wydajności, ale postaram się to aktualizować. Mam również problemy z wyświetlaniem punktów w ArcMap, ale zbadam to dalej.

Przede wszystkim utwórz złożony widok przestrzenny w swoim systemie RDBMS. Tylko upewnij się, że masz w widoku kolumnę INTEGER UNIQUE NOT NULL, której można później użyć do rejestracji w ArcSDE.

Moje zapytania były tylko zbiorem UNION ALL, podobnie do tego:

    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

W tym schemacie wszystkie moje obiekty mają identyfikator PK ID_UNIQUE_ID, który jest GUID. Moje ObjectIDs powtórzyły się w różnych klasach obiektów, więc nie jest to dobry wybór dla naszego zastępczego ObjectID.

Użyłem (w moim przypadku) wirtualnej kolumny Oracle rownum, aby zawinąć wszystkie moje zapytania i utworzyć widok, który miał efektywne „objectID”. Spójrz:

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
)

Utworzyłem widok z powyższym zapytaniem i utworzyłem widok na nim. Ten widok stanie się przestrzenną warstwą wewnątrz arcsde. Jest to dość łatwy proces.

Następnie próbowałem zarejestrować mój widok przestrzenny jako warstwę, ale zawsze nie udawało się. Kiedy tworzysz na nim widok, ArcSDE zakłada, że ​​FID jest NUMEREM (38,10), liczbą zmiennoprzecinkową, zgodnie z programem narzędziowym sdetable -o.

W Oracle była to definicja widoku:

  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;

Po wymianie kolumny FID na gips, wszystko działało dobrze. Przystąpiłem do rejestracji warstwy i poszło dobrze.

EDYTOWAĆ

Warstwa jest wyświetlana w ArcCatalog jako warstwa punktowa i widzę i wybieram tabelę w ArcMap jak zwykle (punkty są nawet podświetlone), ale nie mogę ich simbolizować i wyświetlić jako zwykłej warstwy. Jakieś myśli?

Czy ktoś ma jakieś pomysły, dlaczego tak się dzieje? Wszystko jest w porządku, poza tym, że nie widzę obiektów przestrzennych w ArcMap. Jakieś pomysły?

George Silva
źródło
1
Możesz zrobić wiele z wydajnością tego widoku, jeśli będziesz aktualizować swoje indeksy. Ustawiłem zaplanowane zadania do uruchamiania w systemach z dużą liczbą transakcji, aby co noc odbudowywać indeksy. Następnie, gdy wykonujesz połączenia, są one lepiej dostrojone.
DEWright
Co się stanie, jeśli przeciągniesz i upuścisz z arccatalog na nową pustą mapę w arcmap?
Kirk Kuykendall
ArcMap dodaje go do spisu treści, ale nic nie renderuje. Dziwne jest to, że mogę wybrać rzędy, a geometria tego rzędu narysuje (wybrana). Gdy wiersze nie są zaznaczone, nic nie jest rysowane. Działa również zapytanie przez ArcMap.
George Silva,
1
Ciekawy. Jeśli napiszesz kod arcobjects, jak będzie wyglądał IGeoDataset.Extent dla odtwarzacza obiektów? A dla klasy obiektów?
Kirk Kuykendall
Spróbuję tego! Zobaczmy.
George Silva,
2

Spróbuj uruchomić następującą komendę: sdelayer -o alter -l [-S] [-k] [-i | | ] [-s] [-D] -E calc -u [-p]

Priya J
źródło
Dziękuję za komentarz. Próbowałem już przeliczyć zasięg warstwy.
George Silva,
2

Z mojego doświadczenia wynika, że ​​gdy warstwa nie jest wyświetlana w łuku, to dlatego, że brakuje indeksu przestrzennego. Widoki wykorzystują indeks przestrzenny tabeli źródłowej, ale wygląda na to, że tworzysz indeks przestrzenny dla widoku w swoim oświadczeniu rejestracyjnym.

Czy którakolwiek z tabel źródłowych ma indeksy przestrzenne? Jeśli nie, spróbuj utworzyć je w Oracle i ponownie zarejestrować widok bez opcji -g.

Inną możliwością jest połączenie geometrii z dwóch tabel w jedną kolumnę, nie jestem pewien, czy to nie, nie próbowałem tego wcześniej.

MattL
źródło
Spróbuję tego Matta. Łączę również wiele geometrii w jeden w innym widoku i jest to bardzo ważne, aby to działało. Budujemy linie na widoku i ten widok zjednoczony miał być jedynym punktem wsparcia dla tych warstw. Próbuję innych podejść, ponieważ nie widzę tego.
George Silva