Пересчитать полный экстент класса объектов File Geodatabase?


19

У меня есть класс объектов в файловой базе геоданных Esri. Когда я редактирую объекты с помощью редактора в ArcMap и удаляю большинство своих объектов и сохраняю только те из них, которые находятся в середине, команда масштабирования до слоя не работает должным образом. Вместо увеличения масштаба элементов, остающихся в классе объектов, экстент будет прежним (содержащий все удаленные объекты). При просмотре значений экстента в диалоговом окне свойств для класса пространственных объектов я отчетливо вижу старые значения. Таким образом, сеанс редактирования, похоже, не изменяет значения полного экстента.

Есть ли способ пересчитать эти значения?

Я уверен, что эта проблема должна возникнуть у всех, кто редактирует объекты в ArcMap ...


1
К сожалению, Arc: REBOX не был переведен как инструмент ArcGIS :-)
PolyGeo

Ответы:


6

У Esri теперь есть инструмент для этого в 10.4 (ура): пересчитать класс пространственных объектов.

Я столкнулся с этой проблемой, когда создавал класс пространственных объектов и записывал в него геометрию с помощью arcpy. Очевидно, эти инструменты не обновляют экстент (вероятно, это хорошая идея по соображениям производительности).

Я успешно сбросил экстент в 10.2.2 с предложением @Lou:

arcpy.CompressFileGeodatabaseData_management(output_workspace)
arcpy.UncompressFileGeodatabaseData_management(output_workspace)

19

Щелкните правой кнопкой мыши класс объектов в ArcCatalog и перейдите в Свойства. На вкладке «Расширение возможностей» нажмите «Пересчитать». И вуаля!

Я использую ArcGIS 10.2.1


6

Сжатие базы геоданных приведёт в порядок ваш пространственный индекс

«Если вы часто добавляете и удаляете данные, вам следует ежемесячно сжимать свою файловую или персональную базу геоданных. Вы также должны сжимать базу геоданных после любого крупномасштабного изменения. доступ к данным в каждом файле возможен более эффективно. Сжатие также уменьшает размер каждого файла - можно уменьшить размер базы геоданных наполовину или более ».

http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#/Compacting_file_and_personal_geodatabases/003n0000007t000000/

Компакт (Управление данными)

«Рекомендуется сжимать персональные базы геоданных, когда они становятся больше 250 МБ. Если ввод, удаление или общее редактирование данных часто выполняется в базе данных, базу данных следует регулярно сжимать для обеспечения оптимальной производительности».

http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//00170000000n000000


4
Если вы выполняете массовое удаление, это важно (особенно для больших баз геоданных). Лично у меня не было надежного решения проблемы экстента, но это определенно хорошая идея.
Лу

6

Вот надстройка ArcCatalog для ArcGIS 10, которая добавляет команду для обновления экстента класса пространственных объектов, вероятно, с использованием того же метода, что и код VBA @ Ragi:


Эта ссылка является надстройкой, которая отлично работает для меня в 10.1 arcgis.com/home/item.html?id=576ebff497094274bdd7c76e456de6c3
Саймон

5

Экстент 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 .


Я попытался воссоздать пространственный индекс в образце набора данных, и это не помогло в моем тестовом примере. Я был честно удивлен.
Лу

Обновление моего ответа с некоторым кодом тогда.
Раги Язер Бурхум

Таким образом, это код ArcCatalog VBA.
Раги Язер Бурхум

4

Я не знаю точно, что вызывает это в файловых базах геоданных, но я действительно могу воспроизвести это, и я столкнулся с этим раньше. Единственный способ узнать, как это обойти, - сжать файловую базу геоданных. Это решит проблему степени. Вам нужно будет распаковать его, когда вы закончите, потому что вы не можете редактировать сжатую файловую базу геоданных.

Во время сеанса редактирования / ArcMap, когда вы фактически используете данные, вы всегда можете выбрать все | увеличить в качестве обходного пути. Это не очень хорошо, но я использовал это в своем рабочем процессе, пока не добрался до критической точки, где я мог сделать этот трюк сжатия / распаковки.

Обратите внимание, сжатие не будет работать (по крайней мере, ненадежно). Он перестроит ваши индексы, но я нашел его ненадежным для исправления проблем экстентов. Это все еще то, что вы должны делать время от времени. Я просто попробовал это снова прямо сейчас, и это не сработало на моем образце набора данных. YMMV.


Вы также можете переместить классы объектов в новую базу геоданных / шейп-файл, но я очень сомневаюсь, что это приемлемый ответ. Однако, по случайной случайности, которая является частью вашего рабочего процесса (упаковка данных для доставки), она может работать для вас и не требовать дополнительных шагов.
Лу

3

Если вы хотите обновить класс функций в своем документе 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.