Come determinare il tipo di archiviazione (ST_Geom / Oracle) da arcpy / python


10

Stiamo migrando alcune classi di funzionalità da SDELOB (o un formato binario precedente) a ST_Geometry. Mentre scriviamo il nostro script arcpy per utilizzare ESRI Migrate Storage Tool, vorremmo verificare se qualcosa è già ST_Geom ... Oltre a scrivere hook nel database, usare il pacchetto comtypes ecc., Qualcuno sa di un semplice modo per determinare questo?

Risposte:


6

Per dare seguito alla risposta di PolyGeo, l'oggetto Describe è sicuramente dove dovrebbe essere, ma non lo è. Le query del database possono essere il modo migliore per andare qui.

Tuttavia, se hai i binari della riga di comando SDE, un'altra opzione sarebbe quella di provare a fare qualcosa del genere (sì, è un trucco, ma potrebbe funzionare):

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"


1

Questo dovrebbe essere più accessibile tramite ArcPy ma nel frattempo possiamo sfruttare le tabelle del registro SDE per trovare la risposta. La SDE.GEOMETRY_COLUMNStabella contiene i nomi delle classi di entità geografiche F_TABLE_NAME, il proprietario dello schema F_TABLE_SCHEMAe il nome della tabella della geometria corrispondente G_TABLE_NAME.

Se i nomi delle tabelle di geometria e geometria sono uguali, la geometria della classe di geometria viene memorizzata nella stessa tabella degli attributi; in caso contrario la geometria viene memorizzata in una tabella delle caratteristiche separata (nota anche come tabella "F").

Quindi la nostra query SQL sarebbe simile a:

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

Per ArcPy, supponiamo che "GEODATABASE.sde" sia il nome di un file di connessione SDE e "GIS.TAX_PARCELS_POLY" sia il nome di una classe di funzionalità memorizzata nello schema "GIS":

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]

Nota questa soluzione ti dice solo se la geometria è memorizzata nella stessa tabella della classe di caratteristiche e non il tipo di colonna effettivo (ad esempio SDEBINARY, SDELOB, ST_Geometry) anche se credo che possa essere trovato altrove nelle tabelle SDE o Oracle.

Questo potrebbe anche essere ulteriormente ottimizzato creando una funzione Oracle e / o creando una vista sulla SDE.GEOEMTRY_COLUMNStabella.

* Testato con ArcSDE 10.2.2 su Oracle 11g (64 bit).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.