有关 ArcSDE 数据的地理处理注意事项

动态创建 ArcSDE 连接文件

可根据需要使用“创建 ArcSDE 连接文件”工具创建 ArcSDE 连接文件。使用该工具可在需要时自动创建 ArcSDE 连接文件,而无需在运行访问 ArcSDE 数据的工具之前准备好连接文件。可根据需要通过任意源(例如文本文件、编码 XML 流或安全数据库)获取连接属性,然后将这些属性传递到“创建 ArcSDE 连接文件”工具,创建所需的 ArcSDE 连接文件。完成连接文件后,可使用“删除”工具或适当的操作系统删除命令立即删除该文件。

警告警告:

地理处理历史和结果会存储所有传递给工具的参数。由于连接信息是在“创建 ArcSDE 连接文件”工具参数中输入的,因此,除非禁用历史记录功能,否则也会存储这些信息。每次执行工具时,无论该工具属于系统工具、模型工具还是脚本工具,均会在历史日志文件中写入执行记录。实际上,日志文件中所含信息与结果 窗口中显示的信息相同。运行“创建 ArcSDE 连接文件”工具时,为了防止将连接信息(输入到参数中的密码或其他任何安全信息)存储到历史日志或结果 窗口中,请禁用历史记录功能。有关详细信息,请参阅历史日志文件

使用 ArcSDE 数据时地理处理工具的性能

地理处理操作不会控制实际的 ArcSDE 服务器、地理数据库或数据库的性能。适当调整数据库以及使用数据库的应用程序(本例中为 ArcSDE 和地理数据库)的设计和实现,是在使用 ArcSDE 数据时获得最佳性能的主导因素。不过,在地理处理工具中使用 ArcSDE 数据时需要注意一些事项,以避免某些可能影响工具和工作流性能的工作流缺陷。

地理处理工具主要执行数据创建/加载操作

大多数地理处理工具会创建新数据。因此大多数情况下,当涉及将工具输出发送到 ArcSDE 时,应将地理处理输出视为数据加载操作。规划所有数据加载操作十分重要,这样便不会对整个数据库产生不利影响。当您的“联合”工具输出包含 5000 万个记录,并且在早晨上班高峰期通过网络和数据库将数据加载到 ArcSDE 数据库时,大多数数据库管理员(和用户)将对您感到不满。过大的数据加载操作可影响数据库的每个用户(某些情况下可能是好几百或几千个用户),同时还会影响数据发送所经过的网络上的任何用户。当地理处理操作的输入非常大或正在进行合并(例如使用叠加工具时)以创建非常大的输出要素类时,应考虑将此输出的创建安排在对网络和数据库加载影响最小时进行。

注注:

大多数情况下,使工具在文件地理数据库中创建输出会比较有利。验证文件地理数据库中的输出正确后,可在对网络和数据库性能影响最小时将数据传送到 ArcSDE(例如,使用“复制要素”“要素类至要素类”)。

还有必要规划地理处理输出的加载,从而确保尽可能有效地存储数据以方便检索和更新。数据的使用方式决定其在数据库中的最佳存储方式。可以创建 ArcSDE 配置关键字来定义数据的存储方式。通常,只有在分析完输出数据之后才能确定最佳存储配置,因此,先将输出发送到文件地理数据库既可以分析输出数据,还可以避免不必要地将数据加载到 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) 的路径直接在地理处理工具中访问要素类时,可通过以下步骤管理与要素类连接的版本:

  1. 使用 ArcSDE 连接文件的路径引用要素类。
  2. 使用“创建版本”工具创建新版本。通过这种方法创建版本时,新版本将成为以参数形式传入工具中的连接文件中所列版本的子项
  3. 使用“创建 ArcSDE 连接文件”工具创建新连接文件,从而确保在工具“版本”参数中使用新创建的版本。
  4. 在连接到新版本的同时,使用此新连接文件访问要素类。
  5. 要在连接到父版本的同时恢复使用要素类,请使用原始连接文件。
提示提示:

命名 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))

通过地理处理工具使用要素图层/表视图访问版本化要素类

使用要素图层或表视图访问版本化要素类时采用的工作流如下:

  1. 使用“创建要素图层”“创建表视图”工具为所有输入创建图层。确保使用 ArcSDE 连接文件,该连接文件的“版本”属性中指定了父版本或起始版本。
  2. 在所有工具中使用这些图层。
  3. 如果要更改正在使用的版本,可使用“切换版本”工具。
  4. 继续在工具中使用要素图层。地理处理操作将遵循调用“切换版本”工具之后打开的工作空间所指向的版本。
  5. 根据项目需要使用“切换版本”工具切换到其他版本以执行分析。

显示使用版本化要素图层工作流的 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 路径访问数据。

了解有关共享工具的详细信息


7/10/2012