Inwieweit ist die SQL-Sprache über ArcGIS-Tools zugänglich?

10

Diese Frage klingt einfach so überflüssig ...
Auf jeden Fall wurde ich gebeten, die Verwendung von SQL in ArcGIS zu untersuchen. Wir verwenden eine SDE-DB für den gesamten serverseitigen Speicher und die DB-Verwaltung / umfangreiche Bearbeitung. Ich versuche jedoch, genauer zu untersuchen, wie integriert SQL in die ArcGIS-Tools ist. Im SQL Query Reference Guide der ArcGIS 10-Hilfe finden Sie einen Hinweis , der eindeutig angibt, dass die SQL-Syntax bei Verwendung des Feldrechner-Tools nicht funktioniert. Ich finde das sehr enttäuschend, da es sehr nützlich erscheint, Informationen bei der Berechnung von Feldwerten direkt aus der Datenbank selbst abrufen und entstellen zu können.

Was sind die größten Einschränkungen und Fallstricke, auf die Sie stoßen können, wenn Sie versuchen, SQL in ArcGIS zu verwenden? Welche Tools sehen die beste Funktionalität, wenn sie in SQL integriert sind?

Wenn ein Beispiel erforderlich ist, um diese Frage klarer zu stellen, versuche ich, die Anzahl der Sonderziele eines bestimmten Typs in einer bestimmten Region zu ermitteln. Jeder Punkt hat ein Attribut, das seinen Typ und seine Region beschreibt. Meine derzeitige Lösung beinhaltet die starke Verwendung von Cursorn zum Zählen und Abrufen von Daten, aber ein Vorgesetzter wies darauf hin, dass eine einfache SQL-Abfrage all dies und mehr kann. Leider scheint die Funktionalität dafür nicht vorhanden zu sein.

Oder ist es?

Nathanus
quelle
Sind einige der abgefragten Tabellen versioniert?
Michael Todd
Versioniert? Ich glaube nicht, dass ich mit diesem Begriff vertraut bin.
Nathanus
1
Durch die Versionierung einer Ebene können Änderungen an der Ebene vorgenommen werden, wobei frühere Funktionen beibehalten werden. Wenn also ein Feature gelöscht wird, zeigt die aktuelle Version des Layers, dass das Feature nicht mehr vorhanden ist. Das Feature ist jedoch tatsächlich noch in der "Basisebene" vorhanden, und GIS-Tools können verwendet werden, um verschiedene Versionen der Ebene anzuzeigen, in denen das Feature angezeigt wird. Sie können feststellen, ob Ihre Ebene versioniert ist, indem Sie mit der rechten Maustaste auf die Ebene in ArcCatalog klicken und Eigenschaften auswählen. Im unteren Bereich der Registerkarte "Allgemein" befindet sich ein Abschnitt mit dem Namen "Versionierung". In den Informationen hier erfahren Sie, ob die Ebene versioniert ist.
Michael Todd

Antworten:

9

Wenn Sie Python verwenden möchten, sehen Sie sich den Befehl ArcSDESQLExecute an . Auf diese Weise können Sie beliebiges SQL ausführen, es muss jedoch über SDE verbunden sein. Wenn das Ergebnis der Abfrage eine Reihe von Zeilen ist, werden die Attribute als Python-Liste von Listen zurückgegeben. Andernfalls wird True zurückgegeben, wenn die SQL erfolgreich ausgeführt wurde, oder None, wenn nicht. Siehe auch: Ausführen von SQL über eine ArcSDE-Verbindung

blah238
quelle
Ich werde das auf jeden Fall tun! Dies scheint in diesem Zusammenhang genau das zu sein, wonach ich gesucht habe. Vielen Dank.
Nathanus
5

Wenn Sie benutzerdefinierte ArcObjects schreiben, können Sie mithilfe der ExecuteSQL- Methode beliebiges SQL für einen SDE-Arbeitsbereich ausführen . Diese Methode ist auf Abfragen beschränkt, die keine Ergebnismengen zurückgeben, z. B. INSERT, UPDATE oder einige gespeicherte Prozeduren.

Wenn Sie über die ArcMap-Benutzeroberfläche arbeiten, sind Ihre Optionen etwas eingeschränkter. Der Grund, warum Sie SQL nicht über Feld berechnen verwenden können, liegt darin, dass der Ausdruck tatsächlich VBScript und / oder Python ist. Sie könnten VBScript oder Python verwenden, um einen beliebigen SQL-Ausdruck auszuführen und Werte aus dem resultierenden Cursor zu ziehen, aber ich würde es nicht empfehlen.

Alternativ können Sie Regans Antwort verwenden und eine Abfrageebene erstellen. Für schreibgeschützte Daten ist dies der beste Ansatz. Wenn Sie Daten aktualisieren müssen, ist dies etwas komplizierter. Sie müssen eine Abfrageebene mit Ihren "neuen" Werten erstellen, einen Join für Ihre vorhandene Tabelle durchführen und dann Berechnungsfelder verwenden. Dies könnte mit ExecuteSQL kombiniert werden, um komplexe Aktualisierungen durchzuführen und dann die Ergebnisse anzuzeigen (etwas klobig).

Ihre letzte Alternative besteht darin, SQL direkt für ArcSDE-Tabellen auszuführen.

James Schek
quelle
1
Ihr letzter Punkt (SQL direkt für die Tabellen ausführen) war, warum ich meine Versionsfrage gestellt habe. Eine SQL-Abfrage auf Datenbankebene wird nur von der Basisebene abgerufen (es sei denn, man richtet eine Ansicht mit mehreren Funktionen ein), sodass dies nicht funktioniert, wenn die Ebene versioniert ist.
Michael Todd
Die Arbeit, die ich mache, ist hauptsächlich in Python, aber es scheint immer mehr, dass die eigentliche Funktionalität in der Benutzeroberfläche von ArcObjects abhängt.
Nathanus
Alles basiert intern auf ArcObjects, einschließlich der Python-Funktionalität.
James Schek
Wenn ArcSDESQLExecute in Python Ergebnisse zurückgeben kann, wie kann dies durch IWorkspace.ExecuteSQL erreicht werden?
Petr Krebs
@petr kannst du nicht direkt ... Ich habe meine Antwort aktualisiert.
James Schek
1

Je nachdem, welches RDBMS Sie verwenden, können Sie SQL-Bibliotheken außerhalb von ArcObjects oder arcpy nutzen, sofern Sie nicht darauf angewiesen sind, Feature-Daten zurückzugewinnen. Viele der Abfragen in der SQL Server-Datenbank, die ich täglich verwende, sind nicht räumlicher Natur. Daher verwende ich die System.Data-Klassen in .NET oder die pymssql-Python-Bibliothek in Python-Anwendungen. Wenn Sie die Verwendung von Geodaten benötigen, sind Abfrageebenen die beste Wahl. Die einzige Einschränkung bei Abfrageebenen besteht darin, dass sie nur mit Daten arbeiten, die mit räumlichen Datentypen gespeichert wurden (nicht mit dem Standardtyp SDEBINARY).

SagebrushGIS
quelle
Das wird langsam intensiv. Ich denke, ich muss meine Bedürfnisse genauer abwägen. Ich brauche keine "räumlichen" Daten, wenn Sie damit Dinge wie die Polygone und Punkte / Linien selbst meinen, sondern einfach Werte in Text- / Ganzzahlfeldern.
Nathanus
Wenn Sie Geometrietypen zurückgeben müssen, würde ich den Standard-ArcObjects / arcpy-Datenzugriff verwenden. Wenn Sie nur auf "tabellarische" Daten zugreifen (keine räumlichen Typen), führen Sie die Datenbankaufrufe einfach mit regulären SqlConnections durch (für SQL Server kann Ihr Verbindungstyp variieren). Die Ergebnisse sind flexibler als die von ICursor. Wenn ich Ihre Frage jedoch verstehe und Sie nur den Feldrechner verwenden können, können Sie kein unformatiertes SQL verwenden.
SagebrushGIS