Cómo determinar el tipo de almacenamiento (ST_Geom / Oracle) desde arcpy / python

10

Estamos migrando algunas clases de entidad de SDELOB (o algún formato binario anterior) a ST_Geometry. Mientras escribimos nuestro script arcpy para usar la herramienta de almacenamiento ESRI Migrate, nos gustaría probar si algo ya es ST_Geom ... Aparte de escribir ganchos en la base de datos, usar el paquete de tipos, etc., ¿alguien sabe de un simple manera de determinar esto?

válvula de Londres
fuente

Respuestas:

6

Para hacer un seguimiento de la respuesta de PolyGeo, el objeto Describe está ciertamente donde debería estar, pero no lo está. Las consultas a la base de datos pueden ser la mejor manera de ir aquí.

Aunque, si tiene los binarios de la línea de comandos SDE, otra opción sería intentar hacer algo como esto (sí, es un truco, pero podría funcionar):

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
fuente
2

Sería bueno si el objeto Describe pudiera acceder a esto.

Esto ahora se ha enviado como una idea de ArcGIS (en la que puede votar).

PolyGeo
fuente
1

Esto debería ser más accesible a través de ArcPy, pero mientras tanto podemos aprovechar las tablas de registro SDE para encontrar la respuesta. La SDE.GEOMETRY_COLUMNStabla contiene los nombres de las clases de entidad F_TABLE_NAME, el propietario del esquema F_TABLE_SCHEMAy el nombre de la tabla de geometría correspondiente G_TABLE_NAME.

Si los nombres de la tabla de entidades y geometría son los mismos, la geometría de la clase de entidad se almacena en la misma tabla que los atributos; de lo contrario, la geometría se almacena en una tabla de entidades separada (también conocida como tabla "F").

Entonces nuestra consulta SQL sería algo así como:

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

Para ArcPy, suponga que "GEODATABASE.sde" es el nombre de un archivo de conexión SDE y "GIS.TAX_PARCELS_POLY" es el nombre de una clase de entidad almacenada en el esquema "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]

Tenga en cuenta que esta solución solo le dice si la geometría se almacena en la misma tabla que la clase de entidad y no el tipo de columna real (por ejemplo, SDEBINARY, SDELOB, ST_Geometry) aunque creo que se puede encontrar en otro lugar en las tablas SDE u Oracle.

Esto también podría optimizarse aún más creando una función de Oracle y / o creando una vista en la SDE.GEOEMTRY_COLUMNStabla.

* Probado con ArcSDE 10.2.2 en Oracle 11g (64 bits).

Erik Anderson
fuente