如何从arcpy / python确定存储类型(ST_Geom / Oracle)


10

我们正在将某些要素类从SDELOB(或某些较旧的二进制格式)迁移到ST_Geometry。当我们编写arcpy脚本以使用ESRI Migrate Storage Tool时,我们要测试是否已经有ST_Geom ...除了将钩子写入数据库,使用comtypes包等之外,还有谁知道一个简单的方法?确定这个的方法?

Answers:


6

要继续了解PolyGeo的答案,Describe对象肯定在应有的位置,但实际上并非如此。数据库查询可能是最好的方法。

虽然,如果您具有SDE命令行二进制文件,则另一种选择是尝试执行以下操作(是的,但是这可能是可行的):

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

应该可以通过ArcPy更方便地访问它,但是与此同时,我们可以利用SDE注册表表来找到答案。该SDE.GEOMETRY_COLUMNS表包含要素类的名称F_TABLE_NAME,其模式所有者F_TABLE_SCHEMA和相应的几何表名称G_TABLE_NAME

如果要素和几何表名称相同,则要素类的几何将与属性存储在同一表中;否则,要素表的几何将与属性存储在同一表中。否则,几何将存储在单独的特征表(也称为“ F”表)中。

因此,我们的SQL查询将类似于:

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

对于ArcPy,假定“ GEODATABASE.sde”是SDE连接文件的名称,而“ GIS.TAX_PARCELS_POLY”是存储在“ 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]

请注意,此解决方案仅告诉您几何是否与要素类存储在同一表中,而不是实际的列类型(例如SDEBINARY,SDELOB,ST_Geometry),尽管我相信可以在SDE表或Oracle的其他位置找到它。

也可以通过创建Oracle函数和/或在SDE.GEOEMTRY_COLUMNS表上创建视图来进一步优化。

*在Oracle 11g(64位)上使用ArcSDE 10.2.2进行了测试。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.