Como determinar o tipo de armazenamento (ST_Geom / Oracle) do arcpy / python

10

Estamos migrando algumas classes de recursos do SDELOB (ou algum formato binário antigo) para ST_Geometry. À medida que escrevemos nosso script arcpy para usar a ESRI Migrate Storage Tool, gostaríamos de testar se algo já é ST_Geom ... Além de gravar ganchos no banco de dados, usar o pacote comtypes etc., alguém sabe de um simples maneira de determinar isso?

valveLondon
fonte

Respostas:

6

Para acompanhar a resposta da PolyGeo, o objeto Describe certamente está onde deveria estar, mas não está. As consultas ao banco de dados podem ser o melhor caminho a percorrer aqui.

Embora, se você tiver os binários da linha de comando SDE, outra opção seria tentar fazer algo assim (sim, é um hack, mas pode 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"
lei verde
fonte
2

Seria bom se o objeto Descrever pudesse acessar isso.

Agora isso foi enviado como uma idéia do ArcGIS (na qual você pode votar).

PolyGeo
fonte
1

Isso deve ser mais acessível através do ArcPy, mas, enquanto isso, podemos tirar proveito das tabelas de registro da SDE para encontrar a resposta. A SDE.GEOMETRY_COLUMNStabela contém os nomes das classes de recurso F_TABLE_NAME, seu proprietário do esquema F_TABLE_SCHEMAe o nome da tabela de geometria correspondente G_TABLE_NAME.

Se os nomes das tabelas de recurso e geometria forem os mesmos, a geometria da classe de recurso será armazenada na mesma tabela que os atributos; caso contrário, a geometria é armazenada em uma tabela de recursos separada (também conhecida como tabela "F").

Portanto, nossa consulta SQL seria algo como:

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

Para o ArcPy, suponha que "GEODATABASE.sde" seja o nome de um arquivo de conexão SDE e "GIS.TAX_PARCELS_POLY" seja o nome de uma classe de recurso armazenada no 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]

Observe que esta solução informa apenas se a geometria está armazenada na mesma tabela que a classe de recurso e não o tipo de coluna real (por exemplo, SDEBINARY, SDELOB, ST_Geometry), embora eu acredite que possa ser encontrado em outras partes das tabelas SDE ou Oracle.

Isso também pode ser otimizado, criando uma função Oracle e / ou criando uma exibição na SDE.GEOEMTRY_COLUMNStabela.

* Testado com ArcSDE 10.2.2 no Oracle 11g (64 bits).

Erik Anderson
fonte