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

数据连接文件 (.sde)

当从 ArcSDE 企业级地理数据库数据库访问数据时,地理处理工具需要使用数据库连接文件 (.sde)

动态创建 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 以外的位置。请参阅地理数据库类型,以比较不同类型的地理数据库,从而帮助您确定最适合您需求的地理数据库类型。

当更新量过大时,对现有 ArcSDE 要素类进行的更新操作会是一种代价较高的操作。以下工具:

都会更新现有要素类。运行时如果需要更新 ArcSDE 要素类中的大量行记录,可以尝试使用 Auto_Commit 地理处理环境来增加在数据库中调用提交操作之前所处理的要素的数量。实际上,对文件地理数据库版本的数据执行大量更新操作然后将数据加载到 ArcSDE 中,往往可能比对 ArcSDE 要素类直接执行更新要快得多,而且对分析工作流也很有价值。

用于编辑现有数据的地理处理工具的空间索引注意事项

ArcGIS 使用空间索引快速查找要素类中的要素。每当插入或删除要素时,都需要更新空间索引。创建新的输出时,地理处理往往是在所有数据加载完毕之后才会创建新要素类的空间索引。而编辑现有要素类时,关于何时更新空间索引有两种选择。可以使空间索引保持原样,然后在每次编辑操作完成后进行更新,也可以在执行编辑操作之前移除空间索引,然后在完成所有编辑操作之后进行一次性更新。

空间索引和地理处理工具

以下几个地理处理工具可用于编辑现有数据:

执行可编辑现有数据的地理处理工具时,可以设置 MaintainSpatialIndex 的环境参数对插入、删除和更新操作(指编辑)期间 ArcSDE 空间索引的处理方式进行某种程度的控制。这一设置提供了两个选项以提高编辑现有数据的性能。可将 MaintainSpatialIndex 设置为 true 以使空间索引保持原样,然后使 ArcSDE 在进行编辑操作时自动更新空间索引。也可以将其设置为 false,这样,在任意编辑操作开始之前,用于执行现有数据编辑的地理处理工具将先移除 ArcSDE 空间索引。完成所有编辑操作之后,再读取空间索引。

执行更新和插入游标时的空间索引

更新插入游标也可用于现有数据。通过更新和插入游标编辑数据时,在执行涉及众多行的编辑操作之前,可使用“移除空间索引”工具移除 ArcSDE 空间索引。编辑操作完成之后,可再使用“添加空间索引”工具重新创建空间索引。这样可在编辑众多行时提高整体编辑操作的性能。有关使用空间索引的帮助信息,请参阅地理数据库中的空间索引概述

编写脚本时的 ArcSDE 数据准则

Oracle、SQL Server、IBM DB2 和 PostgreSQL 等关系数据库管理系统 (RDBMS) 要求完全限定对象名称,尤其在访问的数据位于方案以外时。使用完全限定的名称可以明确限定对象的名称,以便使用正确的对象(要素类、关系表、表等)。完全限定对象名称时,每个数据库的标准略有不同。有关详细信息,请参阅数据库文档。

使用完全限定的表名或要素类名称

将未限定的表名或要素类名称传递给工具时,地理处理操作将使用通过 ArcSDE 连接文件创建的连接工作空间中当前连接的用户名自动限定名称。如果脚本需要访问所连接用户之外的其他用户的数据,则应完全限定表或要素类的名称,从而避免地理处理工具通过所连接的用户对其进行限定。否则,访问可能失败或者工具可能使用错误的数据。

下面的脚本显示了对所连接用户之外的用户拥有的完全限定要素类的使用。工具箱数据库用户必须具有对地图用户数据的选择权限。

import arcpy
# Create an 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.


# 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.


# 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"))
9/15/2013