Answers:
Esri现在在10.4(hooray)中具有用于此目的的工具:重新计算要素类范围。
在创建要素类并使用arcpy将几何体写入其中时,我遇到了这个问题。显然,这些工具不会更新范围(出于性能原因,这可能是一个好主意)。
我已经成功使用@Lou的建议在10.2.2中重置了范围:
arcpy.CompressFileGeodatabaseData_management(output_workspace)
arcpy.UncompressFileGeodatabaseData_management(output_workspace)
在ArcCatalog中右键单击要素类,然后转到属性。在“功能范围”选项卡中,单击“重新计算”。和瞧!
我正在使用ArcGIS 10.2.1
压缩地理数据库将整理您的空间索引
“如果经常添加和删除数据,则应该每月压缩文件或个人地理数据库。在进行大规模更改后,还应该压缩地理数据库。压缩通过重新排序记录和消除未使用的空间来整理存储空间。压缩之后,这样就可以更有效地访问每个文件中的数据。压缩还可以减小每个文件的大小-可以将地理数据库的大小减少一半或更多。”
紧凑型(数据管理)
“建议压缩大小超过250 MB的个人地理数据库。如果经常在数据库上执行数据输入,删除或常规编辑,则应定期压缩数据库以确保最佳性能。”
http://help.arcgis.com/zh-CN/arcgisdesktop/10.0/help/index.html#//00170000000n000000
这是ArcGIS 10的ArcCatalog外接程序,它添加了一条命令来更新要素类范围,可能使用的方法与@Ragi的VBA代码相同:
GeoDatabase范围始终会扩展-不会自动缩短。压缩和压缩只能优化存储和碎片,而不能优化范围本身。我会先尝试重新创建空间索引,看看是否能解决问题。
更新:
由于空间索引重建并不能解决问题,因此,我相信以下VBA代码会:
Public Sub reCalcExt()
Dim pGXApplication As IGxApplication
Set pGXApplication = Application
Dim pGxObject As IGxObject
Set pGxObject = pGXApplication.SelectedObject
If Not TypeOf pGxObject.InternalObjectName Is IFeatureClassName Then
Exit Sub
End If
Dim pName As IName
Set pName = pGxObject.InternalObjectName
Dim pSchemaLock As ISchemaLock
Set pSchemaLock = pName.Open
pSchemaLock.ChangeSchemaLock esriExclusiveSchemaLock
Dim pFeatureClassManage As IFeatureClassManage
Set pFeatureClassManage = pSchemaLock
pFeatureClassManage.UpdateExtent
Exit Sub
ErrHandler:
pSchemaLock.ChangeSchemaLock esriSharedSchemaLock
End Sub
您可以使用任何其他ESRI支持的编程语言来执行此操作。诀窍是获取模式锁并使用IFeatureClassManage :: UpdateExtent方法。
我不确切知道是什么原因导致了文件地理数据库的出现,但是我确实能够复制它,这是我以前遇到过的事情。我能够找出如何绕过它的唯一方法是压缩文件地理数据库。这将解决范围问题。完成后,您将需要解压缩它,因为您无法编辑压缩文件地理数据库。
在实际使用数据的编辑/ ArcMap会话期间,您始终可以选择所有| 放大到选定为解决方法。并不是很好,但是我一直在工作流程中使用它,直到达到可以进行压缩/解压缩技巧的临界点为止。
请注意,压缩将不起作用(至少不可靠)。它将重建您的索引,但是我发现它不适合解决范围问题。仍然是您不时应该做的事情。我现在再次尝试过,但是在我的样本数据集上不起作用。YMMV。
如果要更新mxd文档中要素类的范围,此代码块可能会帮助您:
Dim pLayer As ILayer
Dim pEnumLayer As IEnumLayer
Dim pFeatureLayer As IFeatureLayer
Dim pFeatureClass As IFeatureClass
Dim pFeatureClassManage As IFeatureClassManage
pEnumLayer = pMap.Layers
pLayer = pEnumLayer.Next
Do Until pLayer Is Nothing
If TypeOf pLayer Is FeatureLayer Then
pFeatureLayer = pLayer
pFeatureClass = pFeatureLayer.FeatureClass
pFeatureClassManage = pFeatureClass
pFeatureClassManage.UpdateExtent()
End If
pLayer = pEnumLayer.Next
Loop