Jak określić typ pamięci (ST_Geom / Oracle) z arcpy / python


10

Przeprowadzamy migrację niektórych klas funkcji z SDELOB (lub jakiegoś starszego formatu binarnego) do ST_Geometry. Gdy piszemy nasz skrypt do korzystania z narzędzia ESRI Migrate Storage Tool, chcielibyśmy sprawdzić, czy coś już jest ST_Geom ... Poza pisaniem haków w bazie danych za pomocą pakietu comtypes itp., Czy ktoś wie o prostym sposób to ustalić?

Odpowiedzi:


6

Aby odpowiedzieć na odpowiedź PolyGeo, obiekt Describe jest z pewnością tam, gdzie powinien , ale tak nie jest. Zapytania do bazy danych mogą być najlepszym sposobem na przejście tutaj.

Chociaż jeśli masz pliki binarne wiersza polecenia SDE, inną opcją byłoby spróbować zrobić coś takiego (tak, to jest włamanie, ale może działać):

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

Powinno to być łatwiej dostępne za pośrednictwem ArcPy, ale w międzyczasie możemy skorzystać z tabel rejestru SDE, aby znaleźć odpowiedź. SDE.GEOMETRY_COLUMNSTabela zawiera nazwy klas obiektów F_TABLE_NAME, ich właściciela schematu F_TABLE_SCHEMAoraz odpowiednimi geometrii nazwy tabeli G_TABLE_NAME.

Jeśli nazwy operacji i tabeli geometrii są takie same, geometria klasy obiektów jest przechowywana w tej samej tabeli co atrybuty; w przeciwnym razie geometria jest przechowywana w osobnej tabeli cech (zwanej także tabelą „F”).

Zatem nasze zapytanie SQL wyglądałoby mniej więcej tak:

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

W przypadku ArcPy załóżmy, że „GEODATABASE.sde” to nazwa pliku połączenia SDE, a „GIS.TAX_PARCELS_POLY” to nazwa klasy obiektów przechowywanej w schemacie „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]

Zauważ, że to rozwiązanie mówi ci tylko, czy geometria jest przechowywana w tej samej tabeli co klasa elementów, a nie faktyczny typ kolumny (np. SDEBINARY, SDELOB, ST_Geometry), chociaż uważam, że można to znaleźć gdzie indziej w tabelach SDE lub Oracle.

Można to dodatkowo zoptymalizować, tworząc funkcję Oracle i / lub tworząc widok na SDE.GEOEMTRY_COLUMNSstole.

* Testowany z ArcSDE 10.2.2 na Oracle 11g (64-bit).

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.