Przeliczanie pełnego zakresu klasy obiektów Geobazy plików?


19

Mam klasę obiektów w geobazie pliku Esri. Kiedy edytuję operacje za pomocą edytora w ArcMap i usuwam większość moich operacji i zachowuję tylko te na środku, polecenie powiększenia do warstwy nie działa zgodnie z oczekiwaniami. Zamiast powiększać do zakresu elementów pozostałych w klasie elementów, zasięg będzie tym pierwszym (zawierający wszystkie usunięte elementy). Przeglądając wartości zasięgu w oknie właściwości dla klasy elementów, wyraźnie widzę stare wartości. Dlatego sesja edycji nie zmienia wartości pełnego zakresu.

Czy istnieje sposób na ponowne obliczenie tych wartości?

Jestem pewien, że ten problem powinien wystąpić u wszystkich osób edytujących funkcje w ArcMap ...


1
Niestety Arc: REBOX nie został przetłumaczony na narzędzie ArcGIS :-)
PolyGeo

Odpowiedzi:


6

Esri ma teraz do tego narzędzie w 10.4 (hura): Przelicz zakres klasy elementów.

Problem ten występował, gdy tworzyłem klasę obiektów i zapisywałem w niej geometrię za pomocą arcpy. Najwyraźniej narzędzia te nie aktualizują zasięgu (prawdopodobnie dobry pomysł ze względu na wydajność).

Udało mi się zresetować zasięg w 10.2.2 z sugestią @Lou:

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

19

Kliknij prawym przyciskiem myszy klasę obiektów w ArcCatalog i przejdź do Właściwości. Na karcie Zakres funkcji kliknij przycisk Ponownie oblicz. I voila!

Używam ArcGIS 10.2.1


6

Kompaktowanie Geobazy spowoduje uporządkowanie indeksu przestrzennego

„Jeśli często dodajesz i usuwasz dane, powinieneś kompaktować swoją bazę danych lub osobistą geobazę co miesiąc. Powinieneś również zagęścić geobazę po każdej dużej zmianie. Kompaktowanie uporządkuje pamięć poprzez zmianę kolejności rekordów i wyeliminowanie nieużywanego miejsca. Po kompaktowaniu, dostęp do danych w każdym pliku jest bardziej efektywny. Kompaktowanie zmniejsza również rozmiar każdego pliku - możliwe jest zmniejszenie rozmiaru geobazy o połowę lub więcej. ”

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

Kompaktowy (zarządzanie danymi)

„Zaleca się kompaktowanie osobistych geobaz, gdy stają się one większe niż 250 MB. Jeśli wprowadzanie danych, usuwanie lub ogólne edytowanie jest często wykonywane w bazie danych, baza danych powinna być regularnie kompaktowana, aby zapewnić optymalną wydajność.”

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


4
Jeśli wykonujesz masowe usuwanie, jest to ważna rzecz (szczególnie w przypadku większych geobaz). Osobiście nie miałem niezawodnego rozwiązania problemu zasięgu, ale to zdecydowanie dobry pomysł.
Lou


5

Zakres GeoDatabase zawsze rozszerza się - nigdy nie skraca się automatycznie. Kompaktowanie i kompresowanie optymalizuje tylko przechowywanie i fragmentację, ale nie sam zakres. Najpierw spróbuję odtworzyć indeks przestrzenny i sprawdzić, czy to wystarczy.

Aktualizacja:

Ponieważ przebudowa indeksu przestrzennego nie rozwiązuje problemu, jestem pewien, że następujący kod 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

Możesz to zrobić w dowolnym języku programowania obsługiwanym przez ESRI. Sztuką jest zdobycie schemalocka i użycie metody IFeatureClassManage :: UpdateExtent .


Próbowałem odtworzyć indeks przestrzenny na przykładowym zbiorze danych, ale to nie pomogło w moim przypadku testowym. Byłem szczerze zaskoczony.
Lou

W takim razie aktualizuję moją odpowiedź za pomocą kodu.
Ragi Yaser Burhum

W ten sposób jest to kod ArcCatalog VBA.
Ragi Yaser Burhum

4

Nie wiem dokładnie, co powoduje to w Geoinformatycznych plikach, ale rzeczywiście jestem w stanie go replikować i jest to coś, z czym się wcześniej spotkałem. Jedynym sposobem, w jaki udało mi się dowiedzieć, jak to obejść, jest Kompresowanie geobazy danych pliku. To rozwiąże problem z zakresem. Po zakończeniu musisz go zdekompresować, ponieważ nie możesz edytować geobazy danych skompresowanych.

Podczas sesji edycji / ArcMap, kiedy faktycznie używasz danych, zawsze możesz wybrać wszystkie | powiększ do wybranego jako obejście problemu. To nie jest świetne, ale używałem go w moim przepływie pracy, aż do momentu, gdy osiągnąłem punkt krytyczny, w którym mogłem wykonać tę kompresję / dekompresję.

Uwaga: Kompaktowanie nie będzie działać (przynajmniej nie niezawodnie). Odbuduje twoje indeksy, ale uważam, że nie jest wiarygodne w naprawianiu problemów z zakresem. To wciąż coś, co powinieneś robić od czasu do czasu. Właśnie teraz wypróbowałem to ponownie i nie działało to w moim przykładowym zestawie danych. YMMV.


Możesz także przenieść klasy obiektów do nowej geobazy / pliku kształtu, ale bardzo wątpię, że jest to akceptowalna odpowiedź. Jednak w przypadku nieparzystej szansy, która jest częścią twojego przepływu pracy (pakowanie danych do dostawy), może to działać dla ciebie i nie wymagać dodatkowych kroków.
Lou

3

Jeśli chcesz zaktualizować zakres klas elementów w dokumencie MXD, ta część kodu może ci pomóc:

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.