Comment déterminer le type de stockage (ST_Geom / Oracle) à partir d'arcpy / python

10

Nous migrons certaines classes d'entités de SDELOB (ou un ancien format binaire) vers ST_Geometry. Alors que nous écrivons notre script arcpy pour utiliser l'outil de stockage ESRI Migrate, nous aimerions tester si quelque chose est déjà ST_Geom ... À part écrire des hooks dans la base de données, utiliser le package comtypes, etc., quelqu'un connaît-il un simple moyen de déterminer cela?

valveLondres
la source

Réponses:

6

Pour faire suite à la réponse de PolyGeo, l'objet Describe est certainement là où il devrait être, mais ce n'est pas le cas. Les requêtes de base de données peuvent être le meilleur moyen d'aller ici.

Bien que, si vous avez les binaires de ligne de commande SDE, une autre option serait d'essayer de faire quelque chose comme ça (oui, c'est un hack, mais cela pourrait fonctionner):

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
la source
2

Ce serait bien si l' objet Describe pouvait y accéder.

Cela a maintenant été soumis en tant qu'idée ArcGIS (sur laquelle vous pouvez voter).

PolyGeo
la source
1

Cela devrait être plus accessible via ArcPy mais en attendant, nous pouvons profiter des tables de registre SDE pour trouver la réponse. La SDE.GEOMETRY_COLUMNStable contient les noms des classes d'entités F_TABLE_NAME, leur propriétaire de schéma F_TABLE_SCHEMAet le nom de la table de géométrie correspondante G_TABLE_NAME.

Si les noms de table d'entités et de géométrie sont identiques, la géométrie de la classe d'entités est stockée dans la même table que les attributs; sinon, la géométrie est stockée dans une table d'entités distincte (également appelée table "F").

Donc, notre requête SQL serait quelque chose comme:

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

Pour ArcPy, supposez que "GEODATABASE.sde" est le nom d'un fichier de connexion SDE et "GIS.TAX_PARCELS_POLY" est le nom d'une classe d'entités stockée dans le schéma "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]

Notez que cette solution vous indique uniquement si la géométrie est stockée dans la même table que la classe d'entités et non pas le type de colonne réel (par exemple SDEBINARY, SDELOB, ST_Geometry) bien que je pense que cela peut être trouvé ailleurs dans les tables SDE ou Oracle.

Cela pourrait également être encore optimisé en créant une fonction Oracle et / ou en créant une vue sur la SDE.GEOEMTRY_COLUMNStable.

* Testé avec ArcSDE 10.2.2 sur Oracle 11g (64 bits).

Erik Anderson
la source