So bestimmen Sie den Speichertyp (ST_Geom / Oracle) aus arcpy / python

10

Wir migrieren einige Feature-Classes von SDELOB (oder einem älteren Binärformat) nach ST_Geometry. Während wir unser Arcpy-Skript schreiben, um das ESRI Migrate Storage Tool zu verwenden, möchten wir testen, ob bereits etwas ST_Geom ist oder nicht ... Abgesehen vom Schreiben von Hooks in die Datenbank, dem comtypes-Paket usw. kennt jemand ein einfaches Weg, um dies zu bestimmen?

ventilLondon
quelle

Antworten:

6

Um die Antwort von PolyGeo weiterzuverfolgen, befindet sich das Describe-Objekt sicherlich dort, wo es sein sollte, ist es aber nicht. Datenbankabfragen sind möglicherweise der beste Weg, um hierher zu gelangen.

Wenn Sie über die SDE-Befehlszeilen-Binärdateien verfügen, können Sie auch versuchen, so etwas zu tun (ja, es ist ein Hack, könnte aber funktionieren):

import subprocess
output = subprocess.check_output("sdelayer -o describe_long -s servername -D dbname -u username -p password -l tablename,columname")
for line in output:
    if line.find("Layer Type") == 0:
        storagetype = line.partition(":")[2].strip() # Should be something like "SDE-BINARY" or "Extended SQL Type/ST_GEOMETRY"
Greenlaw
quelle
2

Es wäre gut, wenn das Describe- Objekt darauf zugreifen könnte.

Dies wurde nun als ArcGIS-Idee eingereicht (über die Sie abstimmen können).

PolyGeo
quelle
1

Dies sollte über ArcPy leichter zugänglich sein, aber in der Zwischenzeit können wir die SDE-Registrierungstabellen nutzen, um die Antwort zu finden. Die SDE.GEOMETRY_COLUMNSTabelle enthält die Namen der Feature-Classes F_TABLE_NAME, ihren Schemabesitzer F_TABLE_SCHEMAund den entsprechenden Namen der Geometrietabelle G_TABLE_NAME.

Wenn die Namen der Feature- und Geometrietabellen identisch sind, wird die Geometrie der Feature-Class in derselben Tabelle wie die Attribute gespeichert. Andernfalls wird die Geometrie in einer separaten Feature-Tabelle (auch als "F" -Tabelle bezeichnet) gespeichert.

Unsere SQL-Abfrage wäre also ungefähr so:

SELECT COUNT(*) AS GEOMETRY_IN_FEATURE_TABLE
FROM SDE.GEOMETRY_COLUMNS
WHERE F_TABLE_SCHEMA || '.' || G_TABLE_NAME = :featureClassName

Nehmen Sie für ArcPy an, dass "GEODATABASE.sde" der Name einer SDE-Verbindungsdatei und "GIS.TAX_PARCELS_POLY" der Name einer Feature-Klasse ist, die im Schema "GIS" gespeichert ist:

import arcpy, os

dstFeatureClass = "sde/DC_LISDBA (GIS).sde/GIS.PARCEL_PARCELS_POLY"

#open a connection to the geodatabase
wks = arcpy.ArcSDESQLExecute(os.path.dirname(dstFeatureClass))

#create the SQL query statement
sql = \
    "SELECT COUNT(*) AS GEOMETRY_IN_FEATURE_TABLE " \
    "FROM SDE.GEOMETRY_COLUMNS " \
    "WHERE F_TABLE_SCHEMA || '.' || G_TABLE_NAME = " + \
    "'" + os.path.basename(dstFeatureClass) + "'"

#execute the query and return the geometry type
print "ST_Geometry" if wks.execute(sql) else "SDEBINARY"

#delete the geodatabase connection
del [wks, sql]

Beachten Sie, dass diese Lösung nur angibt, ob die Geometrie in derselben Tabelle wie die Feature-Class und nicht im tatsächlichen Spaltentyp (z. B. SDEBINARY, SDELOB, ST_Geometry) gespeichert ist, obwohl ich glaube, dass sie an anderer Stelle in den SDE-Tabellen oder in Oracle zu finden ist.

Dies könnte auch weiter optimiert werden, indem eine Oracle-Funktion erstellt und / oder eine Ansicht für die SDE.GEOEMTRY_COLUMNSTabelle erstellt wird.

* Getestet mit ArcSDE 10.2.2 unter Oracle 11g (64-Bit).

Erik Anderson
quelle