Cara menentukan jenis penyimpanan (ST_Geom / Oracle) dari arcpy / python

10

Kami memigrasikan beberapa kelas fitur dari SDELOB (atau format biner yang lebih lama) ke ST_Geometry. Saat kami menulis skrip arcpy kami untuk menggunakan ESRI Migrate Storage Tool, kami ingin menguji apakah sesuatu sudah ST_Geom atau tidak ... Selain menulis kait ke dalam basis data, menggunakan paket comtypes, dll., Adakah yang tahu cara sederhana cara untuk menentukan ini?

katup London
sumber

Jawaban:

6

Untuk menindaklanjuti jawaban PolyGeo, objek Jelaskan memang di tempat yang seharusnya , tetapi tidak. Permintaan basis data mungkin merupakan cara terbaik untuk pergi ke sini.

Meskipun, jika Anda memiliki binari baris perintah SDE, opsi lain adalah mencoba melakukan sesuatu seperti ini (ya itu peretasan, tetapi mungkin berhasil):

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

Akan lebih baik jika objek Jelaskan dapat mengakses ini.

Ini sekarang telah diajukan sebagai Ide ArcGIS (di mana Anda dapat memilih).

PolyGeo
sumber
1

Ini harus lebih mudah diakses melalui ArcPy tetapi sementara itu kita dapat memanfaatkan tabel registri SDE untuk menemukan jawabannya. The SDE.GEOMETRY_COLUMNStabel berisi nama-nama kelas fitur F_TABLE_NAME, pemilik skema mereka F_TABLE_SCHEMA, dan sesuai geometri nama meja mereka G_TABLE_NAME.

Jika fitur dan nama tabel geometri sama maka geometri kelas fitur disimpan dalam tabel yang sama dengan atribut; jika tidak, geometri disimpan dalam tabel fitur yang terpisah (alias tabel "F").

Jadi permintaan SQL kami akan menjadi seperti:

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

Untuk ArcPy, anggap "GEODATABASE.sde" adalah nama file koneksi SDE dan "GIS.TAX_PARCELS_POLY" adalah nama kelas fitur yang disimpan dalam skema "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]

Catatan solusi ini hanya memberi tahu Anda jika geometri disimpan dalam tabel yang sama dengan kelas fitur dan bukan tipe kolom yang sebenarnya (misalnya SDEBINARY, SDELOB, ST_Geometry) meskipun saya yakin itu dapat ditemukan di tempat lain di tabel SDE atau Oracle.

Ini juga dapat dioptimalkan lebih lanjut dengan membuat fungsi Oracle dan / atau membuat tampilan di atas SDE.GEOEMTRY_COLUMNSmeja.

* Diuji dengan ArcSDE 10.2.2 pada Oracle 11g (64-bit).

Erik Anderson
sumber