Arcpy / python'dan depolama türü (ST_Geom / Oracle) nasıl belirlenir


10

Bazı özellik sınıflarını SDELOB'dan (veya bazı eski ikili biçimlerden) ST_Geometry'ye geçiriyoruz. ESRI Migrate Storage Tool'u kullanmak için arcpy betiğimizi yazarken, zaten bir şeyin ST_Geom olup olmadığını test etmek istiyoruz ... Veritabanına kanca yazmaktan, comtypes paketini vb.Kullanmaktan başka basit bir şey biliyor mu? belirlemenin yolu nedir?

Yanıtlar:


6

PolyGeo'nun cevabını takip etmek için, Describe nesnesi kesinlikle olması gereken yerdedir , ancak değildir. Veritabanı sorguları buraya gitmenin en iyi yolu olabilir.

SDE komut satırı ikili dosyalarınız varsa, başka bir seçenek böyle bir şey yapmayı denemek olacaktır (evet bu bir hack'tir, ancak işe yarayabilir):

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

Bu ArcPy aracılığıyla daha erişilebilir olmalıdır, ancak bu arada cevabı bulmak için SDE kayıt tablolarından faydalanabiliriz. SDE.GEOMETRY_COLUMNSTablo özelliğinin sınıfların adlarını içeren F_TABLE_NAME, kendi şema sahibi F_TABLE_SCHEMAve bunlara karşılık gelen geometri tablo adı G_TABLE_NAME.

Özellik ve geometri tablosu adları aynıysa, özellik sınıfının geometrisi özniteliklerle aynı tabloda saklanır; aksi takdirde geometri ayrı bir özellik tablosunda (diğer bir deyişle "F" tablosu) saklanır.

SQL sorgumuz şöyle olur:

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

ArcPy için "GEODATABASE.sde" dosyasının bir SDE bağlantı dosyasının adı ve "GIS.TAX_PARCELS_POLY" ifadesinin "GIS" şemasında depolanan bir özellik sınıfının adı olduğunu varsayalım:

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]

Bu çözümün yalnızca geometrinin özellik sınıfı ile aynı tabloda depolandığını ve gerçek sütun türünü (örneğin SDEBINARY, SDELOB, ST_Geometry) depoladığını söylese de, SDE tablolarında veya Oracle'da başka bir yerde bulunabileceğine inanıyorum.

Bu ayrıca bir Oracle işlevi oluşturarak ve / veya SDE.GEOEMTRY_COLUMNStablo üzerinde bir görünüm oluşturarak daha da optimize edilebilir .

* Oracle 11g (64 bit) üzerinde ArcSDE 10.2.2 ile test edilmiştir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.