有关 ArcSDE 数据的地理处理注意事项
动态创建 ArcSDE 连接文件
可根据需要使用“创建 ArcSDE 连接文件”工具创建 ArcSDE 连接文件。使用该工具可在需要时自动创建 ArcSDE 连接文件,而无需在运行访问 ArcSDE 数据的工具之前准备好连接文件。可根据需要通过任意源(例如文本文件、编码 XML 流或安全数据库)获取连接属性,然后将这些属性传递到“创建 ArcSDE 连接文件”工具,创建所需的 ArcSDE 连接文件。完成连接文件后,可使用“删除”工具或适当的操作系统删除命令立即删除该文件。
地理处理历史和结果会存储所有传递给工具的参数。由于连接信息是在“创建 ArcSDE 连接文件”工具参数中输入的,因此,除非禁用历史记录功能,否则也会存储这些信息。每次执行工具时,无论该工具属于系统工具、模型工具还是脚本工具,均会在历史日志文件中写入执行记录。实际上,日志文件中所含信息与结果 窗口中显示的信息相同。运行“创建 ArcSDE 连接文件”工具时,为了防止将连接信息(输入到参数中的密码或其他任何安全信息)存储到历史日志或结果 窗口中,请禁用历史记录功能。有关详细信息,请参阅历史日志文件。
使用 ArcSDE 数据时地理处理工具的性能
地理处理操作不会控制实际的 ArcSDE 服务器、地理数据库或数据库的性能。适当调整数据库以及使用数据库的应用程序(本例中为 ArcSDE 和地理数据库)的设计和实现,是在使用 ArcSDE 数据时获得最佳性能的主导因素。不过,在地理处理工具中使用 ArcSDE 数据时需要注意一些事项,以避免某些可能影响工具和工作流性能的工作流缺陷。
地理处理工具主要执行数据创建/加载操作
大多数地理处理工具会创建新数据。因此大多数情况下,当涉及将工具输出发送到 ArcSDE 时,应将地理处理输出视为数据加载操作。规划所有数据加载操作十分重要,这样便不会对整个数据库产生不利影响。当您的“联合”工具输出包含 5000 万个记录,并且在早晨上班高峰期通过网络和数据库将数据加载到 ArcSDE 数据库时,大多数数据库管理员(和用户)将对您感到不满。过大的数据加载操作可影响数据库的每个用户(某些情况下可能是好几百或几千个用户),同时还会影响数据发送所经过的网络上的任何用户。当地理处理操作的输入非常大或正在进行合并(例如使用叠加工具时)以创建非常大的输出要素类时,应考虑将此输出的创建安排在对网络和数据库加载影响最小时进行。
大多数情况下,使工具在文件地理数据库中创建输出会比较有利。验证文件地理数据库中的输出正确后,可在对网络和数据库性能影响最小时将数据传送到 ArcSDE(例如,使用“复制要素”或“要素类至要素类”)。
不宜将数据存储到 ArcSDE 中的场合
运行完成多个步骤后才能达到最终输出的模型和脚本时,会创建中间数据。如果数据位于 ArcSDE 中,另外又将所有中间数据发送到 ArcSDE 中,则可能产生大量网络流量/冲突,并且导致数据库服务器的负荷不必要地增加。因此,建议将所有中间数据发送到文件地理数据库中,或者对于简单要素类,也可以发送到内存要素类中。
如果分析的输出为临时数据或不进行大范围共享,则可将其存储在 ArcSDE 以外的位置。请参阅地理数据库类型,比较不同类型的地理数据库,从而帮助您确定最适合您需求的地理数据库类型。
用于编辑现有数据的地理处理工具的空间索引注意事项
ArcGIS 使用空间索引来快速查找要素类中的要素。每当插入或删除要素时,都需要更新空间索引。创建新输出时,加载完所有数据之后,地理处理才会创建新要素类的空间索引。编辑现有要素类时,关于何时更新空间索引有两种选择。可以使空间索引保持原样,然后在每次编辑操作后进行更新,也可以在执行编辑操作之前移除空间索引,然后在完成所有编辑操作之后进行一次性更新。
空间索引和地理处理工具
以下几个地理处理工具可用于编辑现有数据:
使用编辑现有数据的地理处理工具时,可以使用 MaintainSpatialIndex 环境设置对插入、删除和更新操作(指编辑)期间 ArcSDE 空间索引的处理方式进行某种程度的控制。有两个选项可用于提高编辑现有数据的性能。可将 MaintainSpatialIndex 设置为 true 以使空间索引保持原样,然后使 ArcSDE 在进行编辑操作时自动更新空间索引。也可以将其设置为 false,这样,在执行任意编辑操作之前,执行现有数据编辑的地理处理工具将移除 ArcSDE 空间索引。完成所有编辑操作之后,需要读取空间索引。使用更新和插入游标时的空间索引
“更新”和插入游标也可用于现有数据。使用更新和插入游标编辑数据时,在执行涉及众多行的编辑操作之前,可使用“移除空间索引”工具移除 ArcSDE 空间索引。完成编辑操作之后,可使用“添加空间索引”工具重新创建空间索引。这样可在编辑众多行时提高整体编辑操作的性能。有关使用空间索引的帮助信息,请参阅地理数据库中的空间索引概述。
编写脚本时的 ArcSDE 数据准则
Oracle、SQL Server、IBM DB2 和 PostgreSQL 等关系数据库管理系统 (RDBMS) 要求完全限定对象名称,尤其在访问的数据位于方案以外时。使用完全限定的名称可以明确限定对象的名称,以便使用正确的对象(要素类、关系表、表等)。完全限定对象名称时,每个数据库的标准略有不同。有关详细信息,请参阅数据库文档。
使用完全限定的表名或要素类名称
将未限定的表名或要素类名称传递给工具时,地理处理操作将使用通过 ArcSDE 连接文件创建的连接工作空间中当前连接的用户名自动限定名称。如果脚本需要访问所连接用户之外的其他用户的数据,则应完全限定表或要素类的名称,从而避免地理处理工具通过所连接的用户对其进行限定。否则,访问可能失败或者工具可能使用错误的数据。
显示所连接用户之外的用户拥有的完全限定要素类的使用。工具箱数据库用户必须具有对地图用户数据的选择权限。
import arcpy # Create and ArcSDE connection file that connects as the toolbox database user arcpy.CreateArcSDEConnectionFile_management(r'C:\temp',r'toolboxuser.sde','gpserver','5151','',"DATABASE_AUTH",'toolbox','toolbox') # Perform a union operation using data owned by the connected user, toolbox, # and another feature class owned by the map database user. arcpy.Union_analysis(r'C:\temp\toolboxuser.sde\toolbox.states;C:\temp\toolboxuser.sde\map.counties',r'C:\temp\toolboxuser.sde\statesCountiesUnion')
每个数据库要求完全限定对象的方式略有不同。有关详细信息,请参阅 DBMS SQL 文档。
使用完全限定的字段名
字段也是数据库中的对象,当访问的对象不属于所连接用户时,应使用字段的完全限定名称访问字段。无论在哪构建复杂的 SQL 语句,完全限定的字段名都有助于确保 SQL 根据需要执行。同样,每个数据库完全限定其对象的方式略有不同。有关详细信息,请参阅 DBMS SQL 文档。
对版本化数据执行地理处理
地理数据库版本化只用于企业级地理数据库中。企业级地理数据库属于 ArcSDE 数据库。地理处理工具访问版本化数据的方法有两种,具体取决于 ArcSDE 数据是作为数据集路径还是图层名称进行传递。
使用要素类时,地理处理操作通常使用连接文件中作为 ArcSDE 要素类路径组成部分的连接信息打开要素类。这意味着访问数据时,将受限于 .sde 文件的连接属性中设置的版本。
如果将数据添加到 ArcMap 中,数据将以要素图层或表视图的形式显示。当地理处理工具识别到要素图层或表视图形式的输入时,不会通过回到 ArcSDE 连接文件来使用其中的连接属性重新打开要素类。而是通过图层的已打开工作空间访问要素类。如果对工作空间进行了任何更改(例如,工作空间指向的版本),则工具会遵循这些更改。如果在 ArcMap 中对 ArcMap 内容列表中的 ArcSDE 数据使用“切换版本”工具,地理处理工具将使用调用“切换版本”工具之后与工作空间连接的数据版本。
通过地理处理工具使用版本化要素类
使用包含 ArcSDE 连接文件 (.sde) 的路径直接在地理处理工具中访问要素类时,可通过以下步骤管理与要素类连接的版本:
- 使用 ArcSDE 连接文件的路径引用要素类。
- 使用“创建版本”工具创建新版本。通过这种方法创建版本时,新版本将成为以参数形式传入工具中的连接文件中所列版本的子项。
- 使用“创建 ArcSDE 连接文件”工具创建新连接文件,从而确保在工具“版本”参数中使用新创建的版本。
- 在连接到新版本的同时,使用此新连接文件访问要素类。
- 要在连接到父版本的同时恢复使用要素类,请使用原始连接文件。
命名 ArcSDE 连接文件时,使用以下方法命名 .sde 十分有用,以便清楚地识别通过创建的各个连接文件正在执行的工作:
- 使用连接参数:gpserver5151toolboxVersion1.sde(服务器名称 + 端口 + 用户名 + 版本)
- 通过将使用 .sde 文件的 GIS 分析员名称:Ken.sde
- 在将应用连接文件的项目之后命名 .sde 文件:waterDeptJune2010Upgrade.sde
无论使用哪种命名约定,都应确保文件名明了且不会破坏您组织中的任何安全策略。
显示使用版本化要素类工作流的 Python 脚本
# VersionedFeatureClassExample.py # Description: Simple example showing how to access versioned feature classes in geoprocessing tools. # Author: ESRI # import system modules import arcpy import sys, os # Set variables sdeConnFilePath = sys.path[0] + os.sep + "sdeconnectionfiles" analysisVersion = "TOOLBOX.proposedStreets2k9" defaultVersionConnection = r'gpserver5151toolboxDEFAULT.sde' proposedStreetsVersion = r'gpserver5151toolboxproposedStreets2k9.sde' # Perform analysis on the Default version to determine current number of streams within 100 meters of streets. inputFC = sdeConnFilePath + os.sep + defaultVersionConnection + os.sep + r'TOOLBOX.Redlands\TOOLBOX.streams' selectFC = sdeConnFilePath + os.sep + defaultVersionConnection + os.sep + r'TOOLBOX.Redlands\TOOLBOX.street' outputFC = sdeConnFilePath + os.sep + defaultVersionConnection + os.sep + r'StreamsNearStreets' arcpy.MakeFeatureLayer_management(arcpy.SelectLayerByLocation_management(inputFC,"WITHIN_A_DISTANCE",selectFC,"100 Meters","NEW_SELECTION",'#'), outputFC,'','','') print "Streams within 100 Meters of current streets: " + str(arcpy.GetCount_management(outputFC)) # Create an ArcSDE connection file for connecting to the proposedStreets2k9 version folderName = sdeConnFilePath fileName = proposedStreetsVersion serverName = "gpserver" serviceName = "5151" databaseName = "" authType = "DATABASE_AUTH" username = "toolbox" password = "toolbox" saveUserInfo = "SAVE_USERNAME" versionName = analysisVersion saveVersionInfo = "SAVE_VERSION" arcpy.CreateArcSDEConnectionFile_management (folderName, fileName, serverName, serviceName, databaseName, authType, username, password, saveUserInfo, versionName, saveVersionInfo) # Perform the same analysis on the proposedStreets2k9 version to see the effect of the proposed changes. inputFC = sdeConnFilePath + os.sep + proposedStreetsVersion + os.sep + r'TOOLBOX.Redlands\TOOLBOX.streams' selectFC = sdeConnFilePath + os.sep + proposedStreetsVersion + os.sep + r'TOOLBOX.Redlands\TOOLBOX.street' outputFC = sdeConnFilePath + os.sep + defaultVersionConnection + os.sep + r'NewStreamsNearStreets' arcpy.MakeFeatureLayer_management(arcpy.SelectLayerByLocation_management(inputFC,"WITHIN_A_DISTANCE",selectFC,"100 Meters","NEW_SELECTION",'#'), outputFC,'','','') print "Streams projected to be within 100 Meters of streets after proposed street additions:" + str(arcpy.GetCount_management(outputFC))
通过地理处理工具使用要素图层/表视图访问版本化要素类
使用要素图层或表视图访问版本化要素类时采用的工作流如下:
- 使用“创建要素图层”或“创建表视图”工具为所有输入创建图层。确保使用 ArcSDE 连接文件,该连接文件的“版本”属性中指定了父版本或起始版本。
- 在所有工具中使用这些图层。
- 如果要更改正在使用的版本,可使用“切换版本”工具。
- 继续在工具中使用要素图层。地理处理操作将遵循调用“切换版本”工具之后打开的工作空间所指向的版本。
- 根据项目需要使用“切换版本”工具切换到其他版本以执行分析。
显示使用版本化要素图层工作流的 Python 脚本
# VersionedFeatureLayersExample.py # Description: Simple example showing how to access versioned feature classes using layers. # Author: ESRI # import system modules import arcpy from arcpy import env import sys, os # Set Environments env.workspace = sys.path[0] + os.sep + "gpserver5151toolboxDEFAULT.sde" # Create the layers arcpy.MakeFeatureLayer_management(r'TOOLBOX.Redlands\TOOLBOX.street', 'RedlandsStreets') arcpy.MakeFeatureLayer_management(r'TOOLBOX.Redlands\TOOLBOX.streams', 'RedlandsStreams') # Perform analysis on the Default version to determine current number of streams within 100 meters of streets. arcpy.MakeFeatureLayer_management(arcpy.SelectLayerByLocation_management("RedlandsStreams","WITHIN_A_DISTANCE","RedlandsStreets","100 Meters","NEW_SELECTION",'#'), 'StreamsNearStreets','','','') print "Streams within 100 Meters of current streets: " + str(arcpy.GetCount_management("StreamsNearStreets")) # Change to the development version arcpy.ChangeVersion_management('RedlandsStreets','TRANSACTIONAL', 'TOOLBOX.proposedStreets2k9','') # Perform the same analysis on the development version to see the effect of the proposed changes. arcpy.MakeFeatureLayer_management(arcpy.SelectLayerByLocation_management("RedlandsStreams","WITHIN_A_DISTANCE","RedlandsStreets","100 Meters","NEW_SELECTION",'#'), 'NewStreamsNearStreets','','','') print "Streams projected to be within 100 Meters of streets after proposed street additions: " + str(arcpy.GetCount_management("NewStreamsNearStreets"))
ArcSDE 数据和共享工具
无论在网络还是地理处理服务中,都建议共享工具采用“工具共享”文件夹结构的方式,如下图所示。所需的 ArcSDE 连接文件随成功运行工具所需的任何其他数据一起在 ToolData 文件夹中复制或创建。
应写入开发的模型和脚本工具,以通过连接文件的相对路径访问 ToolData 文件夹中的 ArcSDE 连接文件。
另一个实现访问的方法是:将 ArcSDE 连接文件存储在网络中可访问的位置。然后,工具通过 UNC 路径访问此 ArcSDE 连接文件。
您可能已经注意到,事实上这与共享其他地理数据库数据(例如文件地理数据库数据)的方式没有任何不同。对于文件地理数据库,还需随工具一起提供文件地理数据库文件夹(相当于提供 ArcSDE 连接文件),或者允许访问网络上的文件地理数据库并使工具通过 UNC 路径访问数据。