W jakim stopniu język SQL jest dostępny za pośrednictwem narzędzi ArcGIS?

10

To pytanie brzmi tak zbędnie ...
W każdym razie poproszono mnie o zbadanie zastosowań SQL w ArcGIS. Używamy SDE DB do wszystkich magazynów po stronie serwera oraz zarządzania DB / edycji na dużą skalę. Próbuję jednak dokładniej zbadać, w jaki sposób SQL jest zintegrowany z narzędziami ArcGIS. W podręczniku SQL Query Reference Guide pomocy ArcGIS 10 znajduje się uwaga, która wyraźnie stwierdza, że ​​składnia SQL nie działa podczas korzystania z narzędzia Field Calculator. Uważam to za bardzo rozczarowujące, ponieważ wydaje się bardzo przydatne, aby móc pobierać i przekształcać informacje bezpośrednio z samej bazy danych podczas obliczania wartości pól.

Jakie są największe ograniczenia i pułapki, na które można się natknąć, próbując korzystać z SQL w ArcGIS? Które narzędzia widzą najlepszą funkcjonalność po zintegrowaniu z SQL?

Jeśli potrzebny jest przykład, aby uczynić to jaśniejszym pytaniem, próbuję śledzić liczbę punktów zainteresowania, które są określonego typu w danym regionie. Każdy punkt ma atrybut opisujący jego typ i region. Moje obecne rozwiązanie obejmuje intensywne użycie kursorów do zliczania i pobierania danych, ale przełożony wskazał, że proste zapytanie SQL może zrobić wszystko to i więcej. Niestety wydaje się, że funkcjonalność nie jest w tym celu dostępna.

Albo to jest?

Natanus
źródło
Czy któryś z zapytanych tabel jest wersjonowany?
Michael Todd
Wersja? Nie sądzę, że znam ten termin.
Nathanus
1
Wersjonowanie warstwy umożliwia wprowadzanie zmian w warstwie przy zachowaniu wcześniejszych funkcji. Jeśli więc element zostanie usunięty, bieżąca wersja warstwy pokazuje, że element już nie istnieje; jednak funkcja nadal istnieje w warstwie „podstawowej”, a narzędzi GIS można używać do wyświetlania różnych wersji warstwy, które ją wyświetlają. Możesz sprawdzić, czy twoja warstwa jest wersjonowana, klikając ją prawym przyciskiem myszy w ArcCatalog i wybierając Właściwości. U dołu karty Ogólne znajduje się sekcja o nazwie Wersjonowanie, a informacje tutaj podadzą, czy warstwa jest wersjonowana.
Michael Todd

Odpowiedzi:

9

Jeśli chcesz używać Pythona, spójrz na polecenie ArcSDESQLExecute . Umożliwi to wykonanie dowolnego SQL, ale musi być podłączony przez SDE. Jeśli wynikiem zapytania jest zestaw wierszy, atrybuty zostaną zwrócone jako lista list w języku Python. W przeciwnym razie zwróci True, jeśli SQL zostanie wykonany pomyślnie, lub None, jeśli nie. Zobacz także: Wykonywanie SQL przy użyciu połączenia ArcSDE

blah238
źródło
Na pewno to zrobię! W tym kontekście wydaje mi się, że właśnie tego szukałem. Wielkie dzięki.
Nathanus
5

Jeśli piszesz niestandardowe obiekty ArcObject, możesz wykonać dowolny kod SQL w obszarze roboczym SDE za pomocą metody ExecuteSQL . Ta metoda jest ograniczona do zapytań, które nie zwracają zestawów wyników, takich jak INSERT, UPDATE lub niektóre procedury składowane.

Jeśli pracujesz za pomocą interfejsu ArcMap, twoje opcje są nieco bardziej ograniczone. Powodem, dla którego nie można używać SQL za pomocą pola Oblicz, jest to, że wyrażenie to w rzeczywistości VBScript i / lub Python. Możesz użyć VBScript lub Python, aby wykonać dowolne wyrażenie SQL i pobrać wartości z wynikowego kursora, ale nie poleciłbym tego.

Alternatywnie możesz użyć odpowiedzi Regana i utworzyć warstwę zapytań. W przypadku danych tylko do odczytu jest to najlepsze podejście. Jeśli potrzebujesz zaktualizować dane, jest to nieco bardziej skomplikowane. Musisz utworzyć warstwę zapytania z „nowymi” wartościami, wykonać połączenie z istniejącą tabelą, a następnie użyć pól obliczeniowych. Można to połączyć z ExecuteSQL, aby wykonywać złożone aktualizacje, a następnie przeglądać wyniki (trochę niezgrabne).

Ostatnią alternatywą jest bezpośrednie wykonanie SQL na tabelach ArcSDE.

James Schek
źródło
1
Ostatnią kwestią (bezpośrednie wykonywanie SQL na tabelach) było to, dlaczego zadałem pytanie dotyczące wersji. Zapytanie SQL na poziomie bazy danych pobiera tylko z warstwy podstawowej (chyba że skonfiguruje się widok z wieloma wersjami), więc nie będzie działać, jeśli warstwa jest wersjonowana.
Michael Todd
Praca, którą wykonuję, dotyczy głównie Pythona, ale wydaje się, że prawdziwa funkcjonalność interfejsu użytkownika opiera się na ArcObjects.
Nathanus
Wszystko jest wbudowane wewnętrznie w ArcObjects, w tym w funkcję python.
James Schek
jeśli ArcSDESQLExecute w Pythonie może zwracać wyniki, w jaki sposób można to osiągnąć poprzez IWorkspace.ExecuteSQL?
Petr Krebs
@petr nie możesz bezpośrednio ... Zaktualizowałem swoją odpowiedź.
James Schek
1

W zależności od używanego RDBMS możesz korzystać z bibliotek SQL poza ArcObjects lub Arcpy, o ile nie zależy od odzyskania danych funkcji. Wiele zapytań w bazie danych SQL Server, których używam na co dzień, nie ma charakteru przestrzennego, więc użyję klas System.Data w .NET lub biblioteki Python pymssql w aplikacjach Python. Jeśli potrzebujesz użycia danych przestrzennych, Warstwy zapytań są najlepszym wyborem. Jedynym zastrzeżeniem dotyczącym warstw zapytań jest to, że działają one tylko z danymi przechowywanymi przy użyciu typów danych przestrzennych (nie jest to standardowy typ SDEBINARY).

SagebrushGIS
źródło
To zaczyna być intensywne. Chyba muszę dokładniej ocenić swoje potrzeby. Nie będę potrzebował danych „przestrzennych”, jeśli przez to rozumiesz takie same wielokąty i same punkty / linie, ale po prostu wartości w polach tekstowych / całkowitych.
Nathanus
Jeśli musisz zwrócić typy geometrii, użyłbym standardowego dostępu do danych ArcObjects / arcpy. Jeśli wszystko, co robisz, to uzyskiwanie dostępu do danych „tabelarycznych” (bez zaangażowanych typów przestrzennych), po prostu wykonuj wywołania bazy danych przy użyciu zwykłych połączeń SqlConnection (w przypadku programu SQL Server - typ połączenia może się różnić). Wyniki są bardziej elastyczne niż uzyskane z ICursor. Jeśli jednak rozumiem twoje pytanie i jesteś ograniczony do korzystania z kalkulatora pola, nie będziesz mógł używać surowego SQL.
SagebrushGIS