Viac

Ako určiť typ úložiska (ST_Geom/Oracle) z arcpy/python


Migrujeme niektoré triedy funkcií z SDELOB (alebo iného staršieho binárneho formátu) do ST_Geometry. Keď píšeme náš arcpy skript na používanie nástroja ESRI Migrate Storage Tool, chceli by sme otestovať, či už niečo je alebo nie je ST_Geom ... Nevie niekto o jednoduchom spôsobe, ako písať háčiky do databázy pomocou balíka comtypes atď. určiť toto?


Aby sa nadviazalo na odpoveď spoločnosti PolyGeo, objekt Popis je určite tam, kde je by mal byť, ale nie je. Najlepším spôsobom, ako ísť sem, môžu byť databázové dotazy.

Aj keď, ak máte binárne súbory príkazového riadka SDE, ďalšou možnosťou by bolo skúsiť urobiť niečo také (áno, je to hack, ale môže to fungovať):

import subprocess output = subprocess.check_output ("sdelayer -o description_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 () # Malo by to byť niečo ako "SDE-BINARY" alebo "Extended SQL Type/ST_GEOMETRY"

Bolo by dobré, keby k tomu mal objekt Describe prístup.

Toto bolo teraz predložené ako nápad ArcGIS (o ktorom môžete hlasovať).


To by malo byť prístupnejšie prostredníctvom ArcPy, ale medzitým môžeme na nájdenie odpovede použiť výhody tabuliek registra SDE. TheSDE.GEOMETRY_COLUMNStabuľka obsahuje názvy tried funkciíF_TABLE_NAME, ich vlastník schémyF_TABLE_SCHEMA, a ich zodpovedajúci názov tabuľky geometrieG_TABLE_NAME.

Ak sú názvy tabuliek vlastností a geometrie rovnaké, geometria triedy prvkov je uložená v rovnakej tabuľke ako atribúty; v opačnom prípade je geometria uložená v samostatnej tabuľke funkcií (aka tabuľka „F“).

Náš dotaz SQL by teda vyzeral takto:

VYBERTE COUNT (*) AKO GEOMETRY_IN_FEATURE_TABLE Z SDE.GEOMETRY_COLUMNS KDE F_TABLE_SCHEMA || '.' || G_TABLE_NAME =: featureClassName

V prípade ArcPy predpokladajme, že „GEODATABASE.sde“ je názov súboru pripojenia SDE a „GIS.TAX_PARCELS_POLY“ je názov triedy funkcií uloženej v schéme „GIS“:

import arcpy, os dstFeatureClass = "sde/DC_LISDBA (GIS) .sde/GIS.PARCEL_PARCELS_POLY" #otvorte pripojenie k geodatabáze wks = arcpy.ArcSDESQLExecute (os.path.dirname (dstFeatureClass))  "VYBERTE COUNT (*) AKO GEOMETRY_IN_FEATURE_TABLE"  "Z SDE.GEOMETRY_COLUMNS"  "KDE F_TABLE_SCHEMA || '.' || G_TABLE_NAME = " + " '" + os.path.basename (dstFeatureClass) +"' " #spustite dotaz a vráťte typ geometrie vytlačte„ ST_Geometry “, ak wks.execute (sql) else" SDEBINARY "#odstráňte pripojenie geodatabázy [wks, sql]

Všimnite si, že toto riešenie vám povie iba to, či je geometria uložená v tej istej tabuľke ako trieda funkcií, a nie o skutočnom type stĺpca (napr. SDEBINARY, SDELOB, ST_Geometry), aj keď sa domnievam, že ho možno nájsť inde v tabuľkách SDE alebo Oracle.

Dalo by sa to tiež ďalej optimalizovať vytvorením funkcie Oracle a/alebo vytvorením pohľadu naSDE.GEOEMTRY_COLUMNSstôl.

* Testované s ArcSDE 10.2.2 na Oracle 11g (64-bit).